# task02
## Hoàn thành 34 level overthewire: https://overthewire.org/wargames/bandit/
### level 0:

tại level 0 này đề yêu cầu sử dụng ssh kết nối vào bandit.labs.overthewire.org.
=> tìm hiểu ssh:
- SSH: là giao thức đăng nhập server từ xa cho phép ng dùng kiểm soát và chỉnh sửa cũng như quản lí dữ liệu của server thông qua nền tảng Internet
- có 3 kỹ thuật mã hóa SSH:
- SSH Symmetrical Encryption: sd secret key ở cả 2 chiều mã hóa và giải mã tin nhắn bởi cả host và client
- SSH Asymmetrical Encryption: ss 2 khóa khác nhau để mã hóa vag giả mã(public key và private key)=> hình thành nên cặp khóa public-private key pair
- SSH hashing: ko đc sinh ra để giải mã mà nó đc tạo ra một giá trị duy nhất với độ dài nhất định cho mỗi lần nhập liệu mà ko có hướng nào khác để khai thác(xác thực tn)=> đảm bảo ko bị giả mạo bởi bất kỳ phương thức nào
- SSH Command
ls Liệt kê danh sách file và thư mục
cd Đổi thư mục
mkdir Tạo thư mục mới
touch Tạo file mới
rm Xóa file
cat Xem nội dung của file
pwd Xem đường dẫn chi tiết thư mục hiện hành
cp Sao chép file/folder
mv Di chuyển file/folder
grep Tìm một cụm từ trong files/dòng
find Tìm files và thư mục
vi/nano Biên tập file (text editor)
history Hiển thị 50 lệnh thường dùng nhất
clear Xóa màn hình terminal (cho gọn)
* tổng hợp lệnh:
https://kdata.vn/tin-tuc/tong-hop-cac-lenh-ssh-command-co-ban-ma-ban-can-biet
sử dụng lệnh -p (ở đây là port 2220) 
- nhập pass 
### level 0-1:

- theo yêu cầu thì có pass đăng nhặp bandit1 trong file readme
- sd lệnh ```ls``` để xem các file
- sd lệnh ```cat``` để đọc nd

=> pass : ```NH2SXQwcBdpmTEzi3bvBHMM9H66vVXjL```
sử dụng pass khai thác đc để thực hiện login bandit1:

### level 1-2:

- sd ls để xem danh sách file
ở đây ko hiện tên file vì vậy dùng lệnh find để tìm kiếm

ở đây ko thể dùng lệnh cat liền để đọc nd file vì nếu sd ```cat -``` thì tại - nó sẽ hiểu là option chứ ko phải tên file. hoặc dùng ```cat < -```
=> vậy pass: rRGizSaX8Mk1RTb1CNQoXTcYZWU6lgzi

đăng nhập thành công.
### level 2-3:

- tại level này sẽ gặp lỗi nếu vẫn đọc file theo lệnh thường

- search xem hướng dẫn [" spaces in this filename"](https://linuxhandbook.com/filename-spaces-linux/)
**note: tên file chưa cách có thể dùng "" hoặc '' cho tên file hoặc dùng\ thay cho space**

=> pass: aBZ0W5EmUfAf7kHTQeOwd8bauFJ2lAiG

### level 3-4:

- xem các file tồn tại (gồm cả file ẩn) dùng ls -a

- khi đọc ns cảu inhere thì nhận đc inhere là 1 thư mục
- do đó cần truy cập vào thư mục inhere dùng lệnh cd
- dùng ls -a để xem file ẩn trong thư mục inhere

=> pass: 2EW7BBsr6aMMoJ2HjW067dm8EgX26xNe

### level 4-5:

mở từng file bị báo lỗi định dạng do đó có thể dùng lệnh file./* để xem tất cả định dạng của file
- chỉ có -file07 là định dạng txt nên ta sẽ mở file này

=> pass: lrIWWI6bB37kxfiCQZqUdOIYfr6eEeqR

### level 5-6:


có rất nhiều thư mục con nên là sẽ sử dụng lệnh find để tìm kiếm dựa trên kích thước size

sử dụng lệnh find theo cấu trúc này để tìm kiếm:
```find inhere -type f -size 1033c```
trong đó ```-type f```: chỉ quan tâm tới file ko quan tâm thư mục

xuất hiện file thỏa yêu cầu về kích thước size

=> pass:P4L4vucdmLnm8I7Vl7jG1ApGSfjYKqJU

### level 6-7:


có file chứa password vào xem 
=> pass: z7WtoNQU2XfjmMtWA8u5rN4vzqu4v99S
### level 7-8:

- sử dụng ls -a để xem tất cả các file
- sử dụng ```grep``` để tìm "millonth" trong các file

có thể pass là: TESKZC0XvTetK0S9xNwm25STk5iWrBvP

thành công
### level 8-9:

- dùng lệnh ls để hiện file
- dùng cat để đọc nội dung trong file (thấy xuất hiện rất nhiều dòng)
- dùng lệnh sort để sắp xếp nội dung file theo trình tự
- dựa vào gợi ý từ đề bài là xuất hiện 1 lần và các lệnh đc gợi ý thì dùng lệnh ```uniq -u ``` để xóa tất cả các dòng xuất hiện giống nhau, hoặc ```uniq -c``` để hiển thị số lần dòng xuất hiện


=> pass: EN632PlfYiZbn3PhVK3XOGSlNInNE00t

### level 9-10:

- sử dụng ls để liệt kê file
- dùng sort để xếp lại nội dung file
- vì kiểu nhị phân nên dùng ```strings data.txt | grep '='``` để tìm kiếm đoạn chứ '='
- 
=> pass: G7w8LIi6J3kTb8A7j9LgrywtEUlyyp6s

### level 10-11:

- dùng lệnh ls xem danh sách các file
- đoc thử nội dung file data.txt
- daujw vào gợi ý đề, thử giải mã bằng base64

=> pass: 6zPeziLdR2RKNdNYFNb6nVCKzphlXHBM

### level 11-12:

- lệnh ls xem file
- cat file
- dùng echo cho đoạn mã hóa

=> pass: JVNBBFSmZwKKOP0XbFXOoW8chDz5yVRv

### level 12-13:

- dùng lệnh ls coi file
- ``cat data.txt`` để xem file
- thấy chứa dump hex -> dùng ```xxd -r data.txt``` để chuyển dump hex sang nhị phân
- vẫn chưa có kết quả nên là sẽ cho nó vào 1 file flg

-> lỗi ko thể tạo directory ở đây chỉ có thể xem hoặc chỉnh sữa
- dùng mktemp -d tạo dicrectory
- lệnh cd để đến thư mục vừa tạo




=> pass: wbWdlBxEir4CaE8LaPhauuOo6pwRmrDw

### level 13-14:

-dùng lệnh ls xem file
-dùng lệnh cat để đọc nọi dung file

-sử dụng ssh để connect với bandit14 nhưng không được

để sử dụng ssh để connect với user localhost

-sau đó ta sẽ truy cập với usr bandit14
-để xem đucợ pass của bandit14 t sử dụng lệnh cat theo đường dẫn đề gợi ý:

=>pass: fGrHPx402xGC7U7rXKDaxiWFTOiF0ENq
### level 14-15:
-
-sử dụng lệnh ls xem các file nhưng ko có file nào
-dựa vào dự kiện đề cho là gửi mật khẩu đến 1 cổng mở 30000
-sử dụng netcat/ nc đọc nội dung file

->pass: jN2kgmIXJ6fShzhT2avhotn4Zcka6tnt
### level 15-16:

-đề yêu cầu nộp mật khẩu vào port 30001, có user là localhost và sử dụng SSL để kết nối
```openssl s_client -connect localhost:30001```
-openssl: công cụ cho phép thực hiện thao tác liên quan đến SSL/TLS và mã hóa
-s_client: là 1 chế độ của openssl dùng để kết nối đến máy chủ và hiện thị thông tin cuat ssl/tls của máy chỉ đó


-> ta nhập pass level 15 và ta sẽ có được pass của level 16
-> pass: JQttfApK4SeyHwDlI9SXGR50qclOAil1
### level 16-17:

- đề cho ta biết cần phải nộp mật khẩu vào port có range từ 31000 - 32000 nên ta sẽ phải sử dụng nmap để xem port nào mở, sử dụng dịch vụ gì

-sử dụng openssl để xem port nào hỗ trợ ssl:



-thử vào có vẻ tại port 31790 là port cần tìm:

-và nhận được 1 đoạn RSA:


ở đây báo lỗi do chauw cấp quyền -> cần cấp quyền
-sử dụng ```chmod 700``` để cấp quyền đọc cho máy chủ


ta thấy rằng nó không trả cho ta kết quả của level 17 nên ta phải cat /etc/banditpass/bandit17 (sẽ được vì ta đang có quyền truy cập khi đang ở bandit17)

-> pass: VwOSWtCA7lRKkTfbr2IDh6awj9RNZM5e
### level 17-18:

-sử dụng ls để xem file và cat xem file
-đề yêu cầu tìm sự khác biệt giữa 2 file này

-dựa vào gợi ý đề cho thì ta dùng diff để xem sự khác nhau giữa 2 tệp

-sử dụng thêm grep để xem kết quả

=> pass: hga5tuuCLF6fFzUpnagiMN8ssu9LFrdg
### level 18-19

-ta thấy file .bashrc đã được chỉnh sửa là khi ta đăng nhập vào sẽ log out ta ra

-in và out liên tục vậy nên cần đọc trực tiếp

nên ta chỉ cần cat nó ra là oki
=> pass: awhqfNnAbc1naukrpqDYcF95h7HoMTrC
### level 19 - 20

-thấy bandit20-do có quyền đọc bandit19 và bandit20

-thử đọc file bandit20- do

-sau khi cat bandit20-do và dựa theo gợi ý đề cho thì ta thử thực thi đường dẫn /etc/bandit_pass trên bandit20-do
-ở đây em sử dụng ./ để trực tiếp thực thi trên bandit20-do mà ko cần qua đường dẫn

-nhận đc flag
=> pass: VxCazJaVykI6W36BkBU0mJTCM8rR95XT
### level 20 - 21


-tại suconnect có bandit20 và bandit21 có thể đọc
-thử đọc file suconnect xem có gì

-trong level này cần sử dụng 2 terminal. trong đó 1 teminal sẽ khởi chạy network daemon để lắng nghe kết nối trên một cổng; terminal 2, sẽ kết nối đến localhostbằng setuid binary

=> pass: NvEJF7oVjkddltPSrdKEFOllh9V1IBcq
### level 21-22:
- 

-ko có được gì
-theo đề cho giờ thử truy cập vào /etc/cron.d/

-ở đây có cronjob_bandit22 có thể là file cần tìm
-thử dùng cat đọc nội dung file thông qua đường dẫn đề gợi ý

-ở đây có thể thấy tệp lệnh /usr/bin/cronjob_bandit22.sh và chuyển sang /dev/null(mọi đầu ra của lệnh sẽ được loại bỏ và không được ghi lại)
-tiếp tục thử đọc tệp lệnh ```/usr/bin/cronjob_bandit22.sh``` này xem

-chuyển hướng sang tệp lệnh khác
-tiếp tục thử đọc tệp lệnh

-ở đây có hiện 1 pass có thể là pass cần tìm
=> pass: WdDozAdTM2z9DiFEQ2mGlwngMfj4EZff
### level 22-23:

- mở thư mục /etc/cron.d

- Mở file cronjob_bandit23


Và script này sẽ sử dụng tên user + hàm md5sum + cut sẽ ra 1 [chuỗi kí tự mã hóa(1)] và sau đó lưu password vào thư mục /tmp/[chuỗi kí tự mã hóa(1)]


=> pass: QYw0Y2aiA672PsMmh9puTQuhoz8SyR2G
### level 23-24:

-vào thư mục /etc/cron.d

-Mở bandit24 nó sẽ hiện ra 1 đường dẫn như level trướ

-Mở file shell lên ta được:

-Dựa vào file shell bên trên ta có thể thấy rằng có thể tạo 1 file shell script riêng bên ngoài và để câu lệnh đó thực hiện việc tìm password

-tự tạo script riêng dựa trên level trước và kết quả là ta có file như thế này:


-đưa file ta vừa tạo vào thư mục thực thi /var/spool/$myname/foo và

=> pass: VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar
### level 24-25:

-Theo như đề bài thì ta có thể lấy được pass khi vào port 30002 và nhập mật khẩu của level 24 và thêm mã pin từ 0000 đến 9999 Ta sẽ sử dụng lệnh netcat để connect với port 30002

-dùng shell để tạo code lưu data vào 1 file testcase
-tạo 1 thư mục để lưu code và thực thi file sử dụng lệnh mkdir



-sử dụng cat và netcat để lấy pass

=> pass: p7TaowMYrmu23Ol8hiZh9UvD0O9hpx8d
### level 25-26:

-ta cần xem shell mà bandit26 đang sử dụng

-(*/etc/passwd thường là chứa username, password, UID,GIP, User ID info, home directory và shell của các user)
-Ta thấy shell của usr bandit26 đang ở thư mục /usr/bin/showtext:




Khi cố gắng đăng nhập với user bandit26 thì thấy connection closed do lệnh more ~/text.txt đã được thực thi
-có thể thu nhỏ terminal đến mức file txt không thể show hết ra được. Đến đây ta sẽ dùng V để vào vim. *vim là 1 text editor và ta có thể sử dụng vim để thực thi shell script trên đó

-sử dụng lệnh set shell = /bin/bash để đổi shell hiện tại của user bandit26 sang /bin/bash



=> pass: c7GvcKlw9mC7aUQaPx7nwFstuAIBw1o1
### level 26-27:

-sử dụng ls để list ra các file
-
-chạy thử file bandit27-do

-thấy được là file ./bandit27-do sẽ chạy lệnh dưới quyền 1 user khác và trong trường hợp này là user bandit27-> Do đó chỉ cần dùng file này để cat ra password là xong:

=> pass: YnQpBuifNMas1hcUFk70ZmqkhUU2EuaS
### level 27-28:

-ta chỉ cần clone thư mục đó về máy



-Đến đây ta sẽ clone:

-Sau khi clone thì thư mục repo sẽ được tải về trên máy và từ đó cứ mở file rồi lấy

=> pass: AVanL161y9rsbcJIsFHuw35rjaOM19nR
### level 28- 29:

-ta sẽ cần clone thư mục repo:

-mật khẩu không được show ra.

-có thể sử dụng git log để check:

-kiểm tra từng log sử dụng git show

=> pass: tQKvmcwNYcFS6vmPHIUSI3ShmsrQZK8S
### level 29-30:

-clone repo về máy

-thử check git log và cat file md


có thể còn có những branch khác, ta có thể sử dụng flag -a để show các git branch:



-Sau khi Switch sang branch dev thì ta sẽ có thể thấy 1 thư mục code và 1 file markdown

=> pass: xbhV3HpNGlTIdnjUrdAlPzc2L6y9EOnS
### level 30-31:
-
-trước thì chúng ta sẽ clone, cat, check log và branch:


=> pass: OoffzGDlzhAlerFJ2cAiz1D41JW1Mhmt
### level 31-32

-tạo thư mục để lưu repos



-ta chỉ cần push 1 file key.txt với nội dung ‘May I come in’ lên git


-Sau khi dùng git commit thì git sẽ hiện lên bảng bên dưới để chúng ta add message vào commit. Chúng ta cần phải thêm message riêng sau đó Ctrl + X để đóng và lưu lại
-

-Sau khi commit thành công thì push
-

=> pass: rmCBvG56y58BXzv98yZGdO7ATVL5dW8y
### level 32-33:

Sau khi ssh đến bài này thì chúng ta sẽ được chuyển đến UPPER CASE SHELL thay vì /bin/bash như thường lệ:


-sử dụng 1 số command để nhập nhưng đều bị chặn quyền
=> https://www.ibm.com/docs/en/aix/7.2?topic=shell-positional-parameters-in-bourne
nhập $0 thì nó sẽ không bị uppercase
trong trường hợp này khi nhập $0 thì shell sẽ thực hiện lấy tham số hiện tại lệnh sh $0 tương đương sh ./tên_script_hiện_tại.sh và ta sẽ được dùng shell

dùng được shell và chỉ cần cat ra password

=> pass: odHo63fHiFqcWWJG9rLiLDtPm45KzUKy
### level 33-34:

# PicoCTF:
## Get aHEAD

Đọc sơ qua hint của thử thách, em thấy họ gợi ý sử dụng Burpsuite để kiểm tra **request** như thế nào, thêm vào đó thử thách là **get aHead** nên em nghĩ nó liên quan đến **header** được trả về.
Để thuận tiện hơn thì ta kiểm tra **request head** bằng thư viện ```requests``` trong ```python``` và kết quả:

```
import requests
url = 'http://mercury.picoctf.net:53554/'
res = requests.head(url)
print(res.headers["flag"])
```
-pass: picoCTF{r3j3ct_th3_du4l1ty_6ef27873}
## COOKIE:
-Trang web gửi một form tìm kiếm đơn giản, thử nhập kí tự tùy ý như ```picoCTF``` nào vào ô tìm kiếm, kết quả trả về:

-Vậy thử ```snickerdoodle```?

-có vẻ như ta đã đúng cookie và url được chuyển sang *http://mercury.picoctf.net:17781/check*, tuy nhiên vẫn chưa thấy flag.
-Vì thử thách liên quan đến cookie, cho nên ta cứ kiểm tra cookie thử:

-Thử thay đổi giá trị của cookie và tải lại trang:


-có được **chocolate**, vậy ta cứ thử in hết cookies thì sẽ như thế nào?
```
import requests
url = "http://mercury.picoctf.net:17781"
for i in range(0, 20):
text = str(i)
cookies = {
'name': text
}
r = requests.get(url, cookies=cookies)
result = r.text.split(
"<p style=\"text-align:center; font-size:30px;\"><b>")[1].split("</b>")[0]
print("[+] Testing Cookie:{} | Result: {}".format(i, result))
if 'I love' not in result:
print(r.text.split("<code>")[1].split("</code>")[0])
break
```
-Vậy là tới cookies thứ 19 ta có được flag.

pass: picoCTF{3v3ry1_l0v3s_c00k135_bb3b3535}
# Root me
## IP restriction bypass
-Trong thử thách, em thấy địa chỉ IP máy không thuộc vào mạng LAN.
-Em nghĩ cần đưa địa chỉ IP đi qua nhiều lớp hơn, cụ thể cần một dải IP thuộc mạng LAN này, để làm được điều đó trường ```X-Forwarded-For``` ở **header**:
```
import requests
url = 'http://challenge01.root-me.org/web-serveur/ch68/'
HEADERS = {
'X-Forwarded-For': '172.16.0.1',
}
res = requests.get(url, headers=HEADERS)
# print(res.request.headers)
print(res.text)
```

Pass: Ip_$po0Fing
## 4. User-Agent
-Bắt đầu thử thách em đã có câu:
```
Wrong user-agent: you are not the "admin" browser!
```
-Vậy thì em nghĩ chỉ cần thêm ```User-agent: admin``` vào header là được:
```
import requests
url = 'http://challenge01.root-me.org/web-serveur/ch2/'
HEADERS = {
'User-agent': 'admin'
}
res = requests.get(url, headers=HEADERS)
print(res.text)
```

pass: rr$Li9%L34qd1AAe27
## 5.HTTP - Header
-Thử thách liên quan đến header nên em nghĩ cần kiểm tra các thông tin trên Header (dùng ```curl``` cho nhanh):

-nhưng ```Header-RootMe-Admin: none``` nên em đã thử làm giá trị này khác ```none```:
```
import requests
url = 'http://challenge01.root-me.org/web-serveur/ch5/'
HEADERS = {
'Header-RootMe-Admin': "not none"
}
res = requests.get(url, headers=HEADERS)
print(res.text)
```

pass: HeadersMayBeUseful
## 6. HTTP - Post
-ở đây em thử kiểm tra data dược post lên khi ta nhấn nút ```Give a try!```

-thấy dữ liệu được trả về gồm có 2 thành phần là ```score``` và ```generate``, vậy sao ta không thử post data với ```score``` cao hơn:
```
import requests
url = 'http://challenge01.root-me.org/web-serveur/ch56/'
data = {
'score': "99999999",
'generate': "Give a try!"
}
res = requests.post(url, headers=HEADERS, data=data)
print(res.text)
```

pass: H7tp_h4s_N0_s3Cr37S_F0r_y0U