OSCP
On Job Training
3. Command Line Fun
3.1 Bash Environment:
Bash là một shell có thể hiểu và chạy được các commands và scripts được viết cho Bourne Shell (sh), tích hợp các tính năng hữu ích từ cả KornShell và C Shell, giúp người dùng có thể thực hiện các lệnh phức tạp và quản lý nhiều tác vụ từ cửa sổ terminal một cách hiệu quả.
3.1.1 Environment Variables
Khi mở một cửa sổ terminal hay một bash process mới, một loạt các biến môi trường (environment variable) sẽ được khởi tạo. Các biến này là dạng lưu trữ toàn cục cho các thiết lập khác nhau, được các ứng dụng chạy trong phiên làm việc của terminal kế thừa. Điều này có nghĩa là khi bạn mở một terminal và đặt các biến môi trường, mọi ứng dụng hay lệnh bạn chạy trong terminal đó sẽ có thể truy cập và sử dụng các giá trị của các biến này.
Một số biến môi trường phổ biến:
PATH: Chứa một danh sách các đường dẫn thư mục, được ngăn cách bởi dấu hai chấm. Khi chạy một lệnh mà không cung cấp đường dẫn đầy đủ tới tệp thực thi, Bash sẽ tìm kiếm tệp thực thi trong các thư mục được liệt kê trong biến
PATH
theo thứ tự từ trái sang phải. VD:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
.USER, PWD, HOME: Chứa giá trị username người dùng của terminal hiện tại, working directory hiện tại và home directory
Một số lệnh với biến môi trường:
echo $[NAME]
: Đọc nội dung biến môi trườngexport [alphabet]=[value]
: Gán giá trị cho một biến mà có thể được access bởi các tiến trình con của terminal hiện tại (Nếu không có export thì chỉ dùng được trong terminal hiện tại)echo "$$"
: In ra process ID của terminal hiện tại.env
: Xem tất cả các biến môi trường.
3.1.2 Tab Completion
Có thể dùng Tab
trong Bash shell để gợi ý và tự động hoàn thành câu lệnh.
3.1.3 Bash History Tricks
history
: Lệnh để xem lịch sử các câu lệnh đã được chạy. Mặc định, nó được chứa trong file .bash_history
.
![number]
: In lại ra lệnh ở vị trí number. VD: !2
-> clear
.
!!
: In ra lệnh ở vị trí cuối cùng.
Hai biến môi trường chỉ định history size:
HISTSIZE: quản lý số lượng command chứa trong memory của session terminal hiện tại.
HISTFILESIZE: quản lý số lượng command chứa trong history.
Cách dễ hơn để khám phá command history là dùng nút mũi tên lên và xuống.
Ctrl + R
: reverse-i-search or bck-i-search, nó sẽ hiển thị command gần nhất mà có chữ mình đang tìm.
3.2 Piping and Redirection
Mỗi một chương trình chạy trong command line sẽ có 3 data streams kết nối tới, đóng vai trò là kênh liên lạc với môi trường bên ngoài.
Piping(dùng operator |) và redirection(dùng operator < và >) sử dụng để kết nối các luồng này giữa program và files.
Cụ thể:
">": Sử dụng để redirect một output sang một file. Nếu file chưa tồn tại thì sẽ được tạo mới, nếu file đã tồn tại nó sẽ xóa hết nội dung file và ghi lên.
">>": Sử dụng để redirect một output sang một file đã tồn tại, sẽ tiến hành ghi vào cuối file (append).
"<": Send data the "other way". VD:
"2>": Redirect STDERR.
"|": Redirect output của lệnh này vào input của lệnh khác.
3.3 Text Searching and Manipulation
Một số lệnh hay dùng:
grep
: Tìm chuỗi trong các file sử dụng regex và trả ra các dòng chứa chuỗi thỏa mãn. Thường sẽ dùng với-r
là để tìm đệ quy và-i
để bỏ qua text case.
sed
: stream editor (complex)
cut:
trích xuất text từ một dòng của output. Thường sẽ dùng với-f
để chỉ định chỉ số của chuỗi được chia bởi-d
.
awk
: a programming language designed for text processing and is typically used as a data extraction and reporting tool (complex).
3.4 Comparing Files
comm
: Dùng để so sánh các dòng trong 2 text file. Nó sẽ trả về 3 cột: dòng unique với input đầu, dòng unique với input thứ hai và các dòng có cả ở 2 file. Thường sử dụng -n
với n là số của cột không muốn được hiển thị..
diff
: Phát hiện khác nhau giữa các file, phức tạp và hỗ trợ nhiều loại output hơn. Thường dùng -c
là context format và -u
là unified format
vimdiff
: Mở vim với nhiều file một lúc, với khác nhau giữa các file sẽ được highlight. Một số shortcut:
do: gets changes from the other window into the current one
dp: puts the changes from the current window into the other one
]c: jumps to the next change
[c: jumps to the previous change
Ctrl + W: switches to the other split window
3.5 Managing Processes
Mỗi khi một command được khởi chạy, nó được gọi là một job. Một job có thể bao gồm một hoặc nhiều process. VD: cat error.txt | wc -m
là pipeline của 2 process, sẽ được gọi là một job.
3.5.1 Backgrounding Processes (bg)
Để tạo một background process, ta thêm kí tự "&" vào cuối command.
Với một process không chạy nền mà nó chạy quá lâu và ta quên không cho nó chạy nền, ta có thể sử dụng Ctrl+C
để cancel lệnh hoặc Ctrl+Z
để suspend job đó. Sau khi một job bị suspend, ta có thể dùng lệnh bg
để khởi chạy lại lệnh đó trong nền.
3.6.2 Jobs Control: jobs and fg
jobs
: Dùng để xem các jobs đang được chạy ở session terminal hiện tại.
fg
: Chuyển job từ background sang foreground
%Number
: Job số 1, 2, ...%String
: Chuỗi bắt đầu của command bị suspend. VD: %ping, ...%+
hoặc%%
: Job hiện tại%-
: Previous job.
3.6.3 Process Control: ps and kill
ps
: Lệnh để giám sát tiến trình đang chạy trong hệ thống. Một số parameter thường dùng:
-e
: hiển thị tất cả tiến trình-f
: hiển thị tất cả thông số
-C
: tìm theo tên command chạy tiến trình.
kill [PID]
: Kill tiến trình bằng ProcessId.
3.7 File and Command Monitoring
tail
: Thường dùng để monitor log file. Các parameter thường sử dụng:
-f
: follow, updates liên tục khi file thay đổi.-nX
: in ra "n" dòng cuối cùng của file (default sẽ là 10).
watch
: chạy command lặp lại trong 1 khoảng thời gian. Paramter -n X
sẽ dùng để chạy mỗi "X" giây.
3.8 Downloading Files
wget
: tải file sử dụng giao thức HTTP/HTTPS hoặc FTP. Paramter -O
để chỉ định vị trí và tên file lưu.
curl
: Truyền tải dữ liệu từ hoặc tới một server. sử dụng được đa dạng các giao thức. Thường dùng để tải file. up file và tạo ra các request phức tạp.
axel
: tải file nhanh hơn từ FTP/HTTP server sử dụng nhiều connection. Các parameter thường dùng:
-n
: Số lượng connection sử dụng-a
: Hiển thị đủ từng connection đang down được bao nhiêu (nếu không nó sẽ chỉ có mỗi thanh tiến trình)-o
: nơi output.
3.9 Customizing the Bash Environment
3.9.1 Bash History Customization
Biến HISTCONTROL: chỉ định xem có lưu command lặp lại, command bắt đầu bằng dấu space hoặc cả hai, hay không. Theo default, cả hai đều được removed, tuy nhiên nên để nó chỉ remove command lặp lại.
Biến HISTIGNORE: filter đi các command hay dùng để không lưu.
Biến HISTTIMEFORMAT: format time trong history. VD:
%F
: Year-Month-Day ISO 8601 format%T
: 24-hour time
3.9.2 Alias
Alias là một chuỗi sử dụng để thay thế một command.
Nếu tạo alias trùng với một alias có trước đó, nó sẽ ghi đè.
Dùng unalias
để gỡ một alias.
3.9.3 Persistent Bash Customization
Các setup của một bash shell sẽ được chỉ định bằng file /etc/bash.bashrc. Tuy nhiên, mỗi người dùng có thể tùy biến bằng cách sửa file .bashrc trong home directory của mình. File .bashrc là một shell script, và sẽ được khởi chạy mỗi khi user login
4. Practical tools
4.1 Netcat (nc)
A hacker’s “Swiss army knife”, A simple “utility which reads and writes data across network connections, using TCP or UDP protocols.
Là tool pentest network, sử dụng để đọc và ghi dữ liệu qua mạng. Có thể chạy ở client hoặc server mode.
4.1.1 Connecting to a TCP/UDP Port
Sử dụng client mode để kết nối tới các port TCP/UDP, cho phép người dùng:
Kiểm tra xem port open hay closed.
Đọc banner của service chạy trong port đó.
Kết nối tới service.
Một số parameter có thể dùng:
-n
: skip DNS name resolution.-v
: verbose.
4.1.2 Listening on a TCP/UDP Port
Sử dụng server mode để listen trên các port TCP/UDP, hữu dụng khi:
Network debugging cho client applications.
Nhận kết nối TCP/UDP.
Một số parameter thường dùng khi listen:
-l
: tạo listener (phải có)-n
: disable DNS name resolution.-v
: verbose.-p
: chỉ định số port để listen.
4.1.3 Transferring Files with Netcat
Netcat có thể sử dụng để gửi truyền file. Forensic investigator thường dùng netcat với dd
(a disk copying utility) để tạo một sound disk images qua mạng.
4.1.4 Remote Administration with Netcat
-e
: Khởi chạy một chương trình sau khi tạo hoặc nhận thành công một kết nối. Nó sẽ chuyển hướng STDIN, STDOUT và STDERROR qua mạng thông qua port TCP/UDP thay vì console mặc định.
Bind Shell
Reverse Shell
Do các kết nối inbound thường hay bị chặn hơn kết nối outbound, nên hay dùng reverse shell hơn.
4.2 Socat
Socat là một tiện ích dòng lệnh nâng cao hơn Netcat, được thiết kế để tạo ra các byte streams hai chiều và truyền dữ liệu giữa chúng. Nó hỗ trợ nhiều loại endpoint khác nhau hơn so với Netcat:
Files
Pipes
Devices (serial line, pseudo-terminal, etc)
Sockets (UNIX, IP4, IP6 - raw, UDP, TCP)
SSL sockets
Proxy CONNECT connections
File descriptors (stdin, etc)
The GNU line editor (readline)
Programs
Combinations of two of these
Trong command sẽ là "TCP6, TCP4, UDP4, UDP6, UNIX, RAW, STDIO, FILE, SSL, TLS, TTY, ..." (xem bằng socat -h
)
4.2.1 Netcat vs Socat
Connect:
-
: truyền dữ liệu giữa STDIO và remote hostTCP4
: protocol (4 = IPv4)Protocol:Remote_IP:Port
Listen:
TCP4-LISTEN
: Listener protocolSTDOUT
: chuyển hướng output
Nếu dùng TCP/UDP thì có thể dùng netcat kết hợp socat.
4.2.2 Socat File Transfers
fork
: Tạo process con khi có kết nối tới listener, cho phép đa kết nối.file:
: Chỉ định tên của file được truyền đi/nhận.create
: Dùng khi nhận file, sử dụng để chỉ định file mới sẽ được tạo.
Sau dấu "," không được có dấu space.
Tương tự, vẫn có thể kết hợp netcat để làm việc này.
4.2.3 Socat Reverse Shells
-d -d
: increase verbose (hiển thị fatal, error, warning, và notice messages)
AF = Address Family
AF=2
là địa chỉ IPv4 (AF_INET
).
AF=10
là địa chỉ IPv6 (AF_INET6
).
AF=1
là địa chỉ Unix domain sockets (AF_UNIX
).
EXEC
: giống-e
trong netcat.
4.2.4 Socat Encrypted Bind Shells
Có thể sử dụng encryption để tránh IDS phát hiện cũng như là giấu đi những dữ liệu nhạy cảm đang được truyền.
Sử dụng openssl
, parameter:
req: initiate a new certificate signing request (tạo yêu cầu ký chứng chỉ)
-newkey: generate a new private key (tạo khóa riêng tư mới)
rsa:2048: use RSA encryption with a 2,048-bit key length. (sử dụng thuật toán mã hóa RSA với key dài 2048-bit)
-nodes: store the private key without passphrase protection (Lưu khóa riêng mà không có bảo vệ bằng mật khẩu (No DES) -> bất kỳ ai có quyền truy cập vào tệp khóa sẽ có thể sử dụng nó mà không cần mật khẩu -> để test là chính)
-keyout: save the key to a file
-x509: output a self-signed certificate instead of a certificate request (Tạo một chứng chỉ tự ký thay vì tạo một yêu cầu ký chứng chỉ. Chứng chỉ tự ký là chứng chỉ được ký bởi chính khóa riêng của nó -> để test là chính)
-days: set validity period in days (Đặt thời hạn hiệu lực của chứng chỉ theo ngày)
-out: save the certificate to a file
Do socat chỉ nhận file .pem, nên có đoạn dùng cat để nối private key và cert vào thành file pem. Hoặc như này luôn cho lẹ:
cert=
: chỉ định file pem
verify=0
: Không xác minh chứng chỉ của kết nối.
Encrypted Revershell:
4.3 PowerShell and Powercat
PowerShell là một shell dòng lệnh và ngôn ngữ kịch bản được thiết kế đặc biệt cho các quản trị viên hệ thống và người dùng để tự động hóa việc quản lý nhiều hệ điều hành (Linux, macOS, Unix, Windows) và các quy trình liên quan đến các ứng dụng chạy trên chúng một cách mạnh mẽ -> powerful tool for penetration testing.
IDE built sẵn của Powershell: Windows PowerShell Integrated Scripting Environment (ISE)
Tắt "Restricted" của Powershell (run powershell dưới quyền admin để chạy)
PowerShell Documentation: https://learn.microsoft.com/en-us/powershell/
4.3.1 PowerShell File Transfers
-c
: Chạy một lệnh bằng powershell như thể nó đã được nhập trong powershell.new-object
: Là một cmdlet được sử dụng để tạo ra một đối tượng mới, có thể là một đối tượng trong .Net Framework hoặc một COM object. Trong trường hợp này là một đối tượng của classWebClient
từ namespaceSystem.Net
System.Net.WebClient
: được sử dụng để truy cập các tài nguyên được xác định bởi một URI, cung cấp các phương thức tiện lợi để tải xuống và tải lên dữ liệu từ/đến các dịch vụ web và các tài nguyên mạng khác.
System.Net Namespace: https://learn.microsoft.com/en-us/dotnet/api/system.net?view=net-8.0
4.3.2 PowerShell Reverse Shells
Script:
Khởi tạo TCP Client:
Dòng lệnh này tạo một đối tượng TCPClient kết nối tới địa chỉ IP
10.11.0.4
trên cổng443
.
Lấy Network Stream:
Dòng lệnh này lấy network stream từ đối tượng TCPClient.
Khởi tạo Mảng Byte:
Dòng lệnh này khởi tạo một mảng byte để chứa dữ liệu đọc từ network stream.
Vòng lặp while:
Vòng lặp này tiếp tục chạy cho đến khi không còn dữ liệu đọc từ network stream. Phương thức
Read
đọc dữ liệu từ stream vào mảng byte$bytes
.
Xử lý Dữ liệu Đọc Được:
Giải mã Dữ liệu: Dòng lệnh này chuyển đổi mảng byte thành chuỗi ASCII.
Thực thi Lệnh: Sử dụng
Invoke-Expression
(iex
) để thực thi chuỗi lệnh nhận được và chuyển kết quả thành chuỗi. Nó là một phần quan trọng trong đoạn mã này vì nó cho phép thực thi bất kỳ lệnh nào nhận được, làm cho reverse shell này vô cùng mạnh mẽ.Tạo Kết quả Gửi Lại: Kết hợp kết quả thực thi lệnh với đường dẫn hiện tại (
pwd
).Mã hóa Lại Dữ liệu: Chuyển đổi kết quả thành mảng byte.
Gửi Kết quả: Gửi mảng byte chứa kết quả trở lại qua network stream và flush stream.
Đóng Kết nối:
One-liner for use (Kaspersky chặn)
4.3.3 PowerShell Bind Shells
One-liner:
Khởi tạo TcpListener:
New-Object System.Net.Sockets.TcpListener: Tạo một đối tượng
TcpListener
lắng nghe trên tất cả các địa chỉ IP (0.0.0.0
) và cổng443
.$listener.start(): Bắt đầu lắng nghe kết nối đến.
Chấp nhận kết nối từ client:
$listener.AcceptTcpClient(): Chấp nhận một kết nối TCP từ client và tạo ra một đối tượng
TcpClient
.
Lấy network stream từ client:
Khởi tạo mảng byte:
Khởi tạo một mảng byte để chứa dữ liệu đọc từ stream.
Vòng lặp đọc dữ liệu và thực thi lệnh:
$stream.Read($bytes, 0, $bytes.Length): Đọc dữ liệu từ stream vào mảng byte
$bytes
. Số byte đọc được lưu vào$i
.(New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes, 0, $i): Chuyển đổi mảng byte thành chuỗi ASCII.
iex $data 2>&1 | Out-String: Thực thi lệnh nhận được bằng
Invoke-Expression
(iex
) và chuyển kết quả thực thi thành chuỗi.$sendback + 'PS ' + (pwd).Path + '> ': Kết hợp kết quả thực thi lệnh với đường dẫn hiện tại và dấu prompt
PS
.([text.encoding]::ASCII).GetBytes($sendback2): Chuyển đổi chuỗi kết quả thành mảng byte.
$stream.Write($sendbyte, 0, $sendbyte.Length): Gửi mảng byte chứa kết quả trở lại qua stream.
$stream.Flush(): Xả dữ liệu trong stream, đảm bảo tất cả dữ liệu đã được gửi đi.
Đóng kết nối và dừng listener:
$client.Close(): Đóng kết nối TCP với client.
$listener.Stop(): Dừng listener, ngừng lắng nghe các kết nối đến.
4.3.4 Powercat
Để đơn giản hóa thì script powercat ra đời, như một netcat dành cho powershell. Github: https://github.com/besimorhino/powercat.
Kali: apt-get install powercat
. File script sẽ nằm ở /usr/share/windows-resources/powercat
.
Load script:
Dấu "." đầu tiên được sử dụng để biểu thị rằng script sẽ được nạp vào phạm vi hiện tại (current scope). Điều này có nghĩa là tất cả các hàm, biến, và các cấu trúc khác được định nghĩa trong script sẽ trở thành một phần của phạm vi hiện tại và có thể được truy cập ngay sau khi script được thực thi.
Hoặc load online:
Khởi chạy:
4.3.5 Powercat File Transfers
Parameter để gửi file:
-c
: client mode, set IP address-p
: set port kết nối tới.-i
: file cần truyền.
4.3.6 Powercat Reverse Shells
-e
: exec program khi connect
4.3.7 Powercat Bind Shells
-l
: khởi tạo một listener
-p
: chỉ định port listen.
4.3.8 Powercat Stand-Alone Payloads
-g
: Tạo payload từ lệnh powercat phía trước nó.
Không > cũng được
-ge
: encoded payload
Powershell -E
: Khởi chạy encoded payload.
4.4 Wireshark
"A network sniffer, like the industry staple Wireshark, 100 is a must-have tool for learning network protocols, analyzing network traffic, and debugging network services"
4.4.1 Wireshark Basics
Có thể dùng net [filter]
để giới hạn vùng capture (chưa test được)
4.5 Tcpdump
"Tcpdump is a text-based network sniffer that is streamlined, powerful, and flexible despite the lack of a graphical interface"
Một số paramerter:
-r
: để mở file pcap
-n
: skip DNS name lookupsVì là giao diện cli nên có thể sử dụng các lệnh linux khác để filter output. VD:
awk -F" " '{print $3 }'
: chỉ lấy IP và portsort
: sắp xếpcount -c
: đếm số lượng mỗi dòng giống nhau xuất hiện.head
: chỉ in ra 10 dòng của output.
src host
: chỉ định source hostdst host
: chỉ định destination hostport
: chỉ định port (cả src cả dst)
-X
: in ra từng packet dưới dạng hex và ascii.-s
: chỉ định size của packet khi capture, tránh truncated
Advanced Header Filtering:
Packet with ACK và PSH được set:
'tcp[13] = ...
: filter những packet có bytes thứ 13 (tính từ 0) trong TCP header bằng 24.
6. Passive Information Gathering
Passive Information Gathering = Open-source Intelligence (OSINT) là quá trình thu thập các thông tin công khai về mục tiêu mà không cần trực tiếp tương tác với nó.
Mục tiêu cuối cùng của Passive Information Gathering là thu thập thông tin để làm rõ hoặc mở rộng bề mặt tấn công, hỗ trợ thực hiện các chiến dịch lừa đảo (phishing) thành công, hoặc bổ sung cho các bước kiểm tra thâm nhập khác như đoán mật khẩu.
Trong ngữ cảnh này, có hai cách tiếp cận khác nhau về việc gì được coi là "passive":
Cách tiếp cận nghiêm ngặt: Chúng ta không bao giờ tương tác trực tiếp với mục tiêu. Ví dụ, chúng ta có thể dựa vào bên thứ ba để lấy thông tin, nhưng không truy cập vào bất kỳ hệ thống hoặc máy chủ nào của mục tiêu. Cách tiếp cận này duy trì mức độ bí mật cao về các hành động và ý định của chúng ta, nhưng có thể hạn chế kết quả thu được.
Cách tiếp cận lỏng lẻo hơn: Chúng ta có thể tương tác với mục tiêu, nhưng chỉ như một người dùng Internet bình thường. Ví dụ, nếu trang web của mục tiêu cho phép đăng ký tài khoản, chúng ta có thể làm điều đó. Tuy nhiên, chúng ta sẽ không kiểm tra trang web về các lỗ hổng trong giai đoạn này.
6.1 Taking Notes
Ghi lại những gì thu thập được một cách khoa học.
6.2 Website Recon
Dựa vào các website của công ty/tổ chức đó để thu thập thông tin. VD: About, email, social media, .... Từ các cái đó có thể suy ra những thứ khác. VD:
Định dạng email có dạng: "first initial + lastname". Tuy nhiên, của CEO lại chỉ có firstname -> founder hoặc nhân viên lâu năm có thể có dạng mail khác nhân viên mới hơn.
6.3 Whois Enumeration
Whois
là một công cụ để cung cấp thông tin liên quan tới domain name.
Khi biết IP của website, khi whois sẽ gọi là reverse lookup:
6.4 Google Hacking
Cheatsheet: https://www.stationx.net/google-dorks-cheat-sheet/, https://sansorg.egnyte.com/dl/f4TCYNMgN6, ...
Goolge Hacking Database: https://www.exploit-db.com/google-hacking-database
Tool: https://github.com/opsdisk/pagodo
6.5 Netcraft
Netcraft’s DNS search: https://searchdns.netcraft.com/
Search được các subdomain, các thông tin về website như OS, ...
6.6 Recon-ng
Là một framework mạnh mẽ để thu thập thông tin web. Một trong những đặc điểm nổi bật của recon-ng
là khả năng lưu trữ kết quả của các mô-đun vào cơ sở dữ liệu và cho phép sử dụng kết quả này để chạy các mô-đun khác. Điều này giúp chúng ta nhanh chóng mở rộng phạm vi thu thập thông tin một cách hiệu quả.
6.7 Open-Source Code
Github: https://github.com/
Github Search Syntax: https://docs.github.com/en/search-github/github-code-search/understanding-github-code-search-syntax
Gitlab: https://about.gitlab.com/
SourceForge: https://sourceforge.net/
Tools:
Gitrob: https://github.com/michenriksen/gitrob (maybe too old)
Gitleaks: https://github.com/gitleaks/gitleaks
-v
: verbose-r
: link github
Recon-ng
Git-secrets (AWS): https://github.com/awslabs/git-secrets
Detect-secrets: https://github.com/Yelp/detect-secrets
trufflehog: https://github.com/trufflesecurity/trufflehog
6.8 Shodan
Link: https://www.shodan.io/
Shodan là một công cụ tìm kiếm đặc biệt, nó tìm kiếm và thu thập thông tin về các thiết bị kết nối Internet, không chỉ giới hạn ở các máy chủ web mà còn bao gồm các thiết bị như router và thiết bị IoT như camera an ninh, SCADA, ICS,....
VD: Tìm được ra các IP ssh server, nameserver, ...
Xem được một số thông tin khi click vào như port, service, công nghệ sử dụng, phiên bản của chúng, vuln dựa trên phiên bản đó, ...
6.9 Security Headers Scanner
Key point ở đây là sử dụng một công cụ bên thứ ba để quét. Một số tools:
SecurityHeaders: https://securityheaders.com/
Mozilla Observatory: https://observatory.mozilla.org/
SerpWorx HTTP Security Headers Check Tool: https://www.serpworx.com/
Domsignal Secure Header Test: https://domsignal.com/
Các tiêu đề bảo mật quan trọng cần kiểm tra:
Content Security Policy (CSP):
Giúp ngăn chặn các tấn công XSS bằng cách chỉ cho phép tải các tài nguyên từ các nguồn đáng tin cậy.
X-Content-Type-Options:
Ngăn chặn các trình duyệt đoán định loại MIME, giúp tránh các tấn công MIME-sniffing.
X-Frame-Options:
Bảo vệ trang web khỏi các tấn công clickjacking bằng cách chỉ cho phép nội dung được tải trong khung (frame) từ các nguồn đáng tin cậy.
Strict-Transport-Security (HSTS):
Đảm bảo rằng trình duyệt chỉ giao tiếp với trang web qua HTTPS, giúp ngăn chặn các tấn công man-in-the-middle.
6.10 SSL Server Test
Check xem SSL có được config chuẩn chỉ hay bị dính vuln như CRIME, BEAST, POODLE, HEARTBLEED, .... hay không.
SSL Server Test (Powered by Qualys SSL Labs): https://www.ssllabs.com/ssltest/
ImmuniWeb SSLScan: https://www.immuniweb.com/ssl/
DigiCert SSL Installation Diagnostics Tool: https://www.digicert.com/help/
6.11 Pastebin
Link: https://pastebin.com/
Pastebin là một trang web phổ biến cho việc lưu trữ và chia sẻ văn bản. Tuy nhiên, vì tính công khai và dễ sử dụng của nó, Pastebin thường được sử dụng để chia sẻ thông tin nhạy cảm, bao gồm các thông tin bị rò rỉ hoặc bị đánh cắp.
6.12 User Information Gathering
Thu thập thông tin về nhân viên của công ty, tổ chức mục tiêu là một phần quan trọng trong quá trình OSINT. Nó sẽ giúp chúng ta xây dựng được password list, kế hoạch social engineering, phishing, client-side attack. credential stuffing, ...
6.12.1 Email Harvesting
Hunter.io: https://hunter.io/domain-search
theHarvester: https://github.com/laramies/theHarvester (có sẵn trong Kali)
6.12.2 Password Dumps
Rockyou2024: https://github.com/hkphh/rockyou2024.txt
Rockyou2021: https://github.com/ohmybahgosh/RockYou2021.txt
Rockyou: https://github.com/brannondorsey/naive-hashcat/releases/download/data/rockyou.txt
Breach forum
6.13 Social Media Tools
Social-Searcher: https://www.social-searcher.com/
sherlock: https://github.com/sherlock-project/sherlock
twofi: https://digi.ninja/projects/twofi.php (scans a user’s Twitter feed and generates a personalized wordlist used for password attacks against that user)
linkedin2username: https://github.com/initstring/linkedin2username (generating username lists based on LinkedIn data)
6.14 Stack Overflow
Stack Overflow là một nguồn tài nguyên phong phú không chỉ dành cho các nhà phát triển để hỏi và trả lời các câu hỏi về lập trình, mà còn cho các pentester thu thập thông tin về mục tiêu.
Xác định nhân viên mục tiêu trên Stack Overflow:
Tìm kiếm tên hoặc biệt danh của nhân viên đã thu thập được từ các nguồn khác như LinkedIn hoặc mạng xã hội.
Ví dụ: Nếu biết một nhân viên có tên là "John Doe" làm việc tại MegaCorpOne, ta có thể tìm kiếm trên Stack Overflow để xem liệu có tài khoản trên đó không.
Phân tích các câu hỏi và câu trả lời:
Ngôn ngữ lập trình và công nghệ: Nếu nhân viên đó thường hỏi và trả lời về Python, rất có thể tổ chức của này sử dụng Python trong các dự án hàng ngày.
Công cụ và nền tảng
Quy trình và lỗ hổng: Nếu nhân viên thảo luận về việc khắc phục lỗ hổng bảo mật -> có thể nhận biết về các lỗ hổng chưa được vá hoặc các vấn đề bảo mật đang được xử lý.
6.15 Information Gathering Frameworks
Framework chứa những gì ta cần, bao gồm cả đống bên trên.
OSINT Framework: https://osintframework.com/
Maltego: https://www.maltego.com/ (có sẵn bản free riêng trong Kali)
7. Active Information Gathering
7.1 DNS Enumeration
Dùng lệnh host
để xem IP của trang web. Mặc định là nó sẽ đọc DNS Recod A
Thêm parameter -t
để đọc các record khác
Check subdomain thủ công:
Check bằng cách Forward Lookup brute-force (nếu dns zone này có chứa PTR Record)
Check bằng cách Reverse Lookup brute-force:
DNS Zone Transfers
DNS zone là một bảng chứa tất cả bảng ghi DNS cho một tên miền cụ thể. Quản lý DNS chính là việc chỉnh sửa các bản ghi trong DNS Zone để tên miền sử dụng các dịch vụ mà bản ghi DNS chỉ định tới.
Các loại bản ghi DNS trong một Zone:
A (Address) Record: Liên kết một tên miền với một địa chỉ IPv4.
AAAA Record: Liên kết một tên miền với một địa chỉ IPv6.
CNAME (Canonical Name) Record: Tạo một bí danh cho một tên miền khác. (alias)
MX (Mail Exchange) Record: Xác định máy chủ mail chịu trách nhiệm nhận email cho tên miền.
NS (Name Server) Record: Chỉ định các máy chủ DNS có thẩm quyền cho zone.
PTR (Pointer) Record: Được sử dụng trong các zone ngược (reverse zones) để ánh xạ địa chỉ IP thành tên miền.
SOA (Start of Authority) Record: Chứa thông tin về zone như máy chủ DNS chính, người quản trị, và các thông số thời gian.
DNS Zone Transfers là quá trình sao chép cơ sở dữ liệu giữa các DNS Server, cụ thể là các zone file sẽ được sao chép từ master DNS server tới slave DNS server. Có 2 kiểu là full zone transfers (AXFR) và incremental zone transfers (IXFR | partial zone transfer).
AXFR: sao chép toàn bộ zone từ máy chủ chính (master server) sang máy chủ phụ (slave server)
IXRF: sao chép chỉ những thay đổi đã được thực hiện trên zone từ máy chủ chính sang máy chủ phụ.
Sử dụng -l
để tiến hành zone transfer:
Simple script:
DNSRecon
-d
: chỉ định domain name-t
: dùng vớiaxfr
để chỉ định kiểu enum là Zone Transfer.
-D
: file chứa các subdomain
-t brt
: brute-force mode
DNSenum
Syntax: dnsenum [Options] domain
.
7.2 Port Scanning
Port scanning không phải là hoạt động thông thường của người dùng và có thể bị coi là bất hợp pháp ở một số nơi -> không nên được thực hiện bên ngoài môi trường kiểm thử mà không có sự cho phép của chủ sở hữu mục tiêu. Scan port có thể gây nên một số hậu quả như quá tải mạng hoặc bị IDS ghi lại.
Netcat
Scan TCP ports:
-w
: connection timeout (tính bằng giây)-z
: zero I/O mode (không gửi dữ liệu, dùng cho scan)
Scan UDP ports:
-u
: UDP scan
Hầu hết các UDP scanner đều sử dụng dấu hiệu là thông báo "ICMP port unreachable" được trả về để xem là port đóng hay mở. Tuy nhiên, khi tường lửa lọc cổng UDP, nó có thể chặn cả gói UDP và các thông báo ICMP trả về. Điều này dẫn đến việc công cụ quét cổng không nhận được bất kỳ phản hồi nào, và do đó có thể báo cáo rằng cổng đó đang mở (do không có thông báo ICMP port unreachable).
Nmap
Nmap: "one of the most popular, versatile, and robust port scanners available"
Cheatsheet: https://www.stationx.net/nmap-cheat-sheet/
https://cheatsheet.haax.fr/network/port-scanning/nmap_cheatsheet/
Hãy dùng nmap với quyền root.
iptables:
-I
: insert new ruleINPUT
: inbound ruleOUTPUT
: outbound rule-s
: src IP-d
: dst IP-j ACCEPT
: chấp nhận traffic-Z
: thiết lập lại (zero) các bộ đếm gói tin và byte cho tất cả các chain hoặc cho các rule cụ thể. (ở đây là dùng để coi traffic cho không bị lẫn vào traffic cũ)-v
: verbose-n
: hiển thị đầu ra dưới dạng số, thay vì cố gắng phân giải địa chỉ IP và tên dịch vụ thành tên miền và tên dịch vụ.-L
: liệt kê các rule hiện có trong tất cả các chain
Nmap Paramter:
-sS
: SYN/Stealth Scan (do không gửi ACK nếu nhận về SYN/ACK, nên bắt tay 3 bước sẽ không bao giờ được hoàn thành nên thông tin không thể được đưa lên application layer -> không có trong app log)-sT
: TCP Connect Scan (có hoàn thành bắt tay ba bước -> chậm + dễ bị IDS detect hơn)-sU
: UDP Scanning-sn
: Network Sweeping (scan để xác định các server hoạt động) sử dụng Ping Scan .
Probes: Các gói tin hoặc thông điệp được gửi từ một scanner đến một server hoặc target devce nhằm mục đích thu thập thông tin về cổng, OS, ...
Các gói tin được gửi trong Ping Scan:
ICMP Echo Request: Gửi một yêu cầu ICMP echo để xác định máy chủ phản hồi.
TCP SYN đến Port 443: Gửi một gói tin TCP SYN đến cổng 443 (HTTPS) để xem máy chủ có phản hồi SYN-ACK không.
TCP ACK đến Port 80: Gửi một gói tin TCP ACK đến cổng 80 (HTTP) để xác định máy chủ có phản hồi không.
ICMP Timestamp Request: Gửi một yêu cầu ICMP timestamp để xác định thời gian phản hồi của máy chủ.
-oG
: Xuất kết quả scan về dạng Grepable
--top-ports
: chỉ scan top n TCP Ports (dựa vào file/usr/share/nmap/nmap-services
)
4 cột: service name, port/protocol, frequency, comment
-A
: bật OS version detection, script scanning, và traceroute
-O
: OS fingerprinting (dựa trên sự khác nhau khi implement TCP/IP stack ở mỗi OS, ví dụ default TTL hoặc TCP Windows Size)
TCP Windows Size là một cơ chế kiểm soát luồng dữ liệu để tối ưu hóa hiệu suất, tránh tắc nghẽn mạng và đảm bảo tính tin cậy của việc truyền dữ liệu. Nó là lượng dữ liệu tối đa mà máy nhận sẵn sàng nhận tại một thời điểm.
Ví dụ:
Máy nhận gửi ACK với TCP Window Size = 64KB.
Máy gửi bắt đầu gửi dữ liệu.
Máy nhận xử lý dữ liệu và bộ đệm nhận của nó dần đầy lên.
Khi bộ đệm nhận còn khoảng trống, máy nhận sẽ gửi một ACK khác, có thể với TCP Window Size lớn hơn hoặc nhỏ hơn tùy thuộc vào tình trạng bộ đệm.
"Một thời điểm" kết thúc ở đây, và một "thời điểm" mới bắt đầu với kích thước cửa sổ mới.
Linux (Modern Kernels 5.x+)
64
Varies (Often 65535)
Linux is highly configurable, so these values can be adjusted.
Windows 10, 11
128
64240
This is a common starting value, but can change depending on the network interface and connection type.
macOS (Recent Versions)
64
Varies (Often 65535)
Similar to Linux, macOS dynamically adjusts the window size.
iOS (Recent Versions)
64
Varies (Dynamic)
Apple devices use a sophisticated algorithm to adjust the TCP window size based on network conditions.
Android (Recent Versions)
64
Varies (Dynamic)
Similar to iOS, Android dynamically adjusts the window size for optimal performance.
FreeBSD (Recent Versions)
64
65535
FreeBSD is known for its large default TCP window size, which can be beneficial in high-bandwidth, low-latency networks.
OpenBSD (Recent Versions)
64
16384
OpenBSD prioritizes security and stability, so it may start with a smaller window size to minimize potential issues with older or misconfigured systems.
Cisco IOS XE (Modern Versions)
255
Varies (Configurable)
Cisco routers have customizable TTL values, and the TCP window size can be tuned based on the specific configuration and network requirements.
-sV
: đọc service banner (nhớ là banner có thể fake bởi admin)
--script
: sử dụng Nmap Scripting Engine (NSE - lưu trong /usr/share/nmap/scripts
) để scan.
--script-help
: help của 1 script
Note: Khi chạy scan nmap, có vẻ ban đầu nó thực hiện ping scan trước để xem host có up không, sau đó mới tiền hành scan port
Masscan
Là công cụ scan port nhanh nhất. Mặc dù ban đầu được thiết kế để quét toàn bộ Internet, nó có thể dễ dàng xử lý subnet A hay B class, đây là một phạm vi mục tiêu phù hợp hơn trong quá trình kiểm thử thâm nhập.
Class A: First Octet Value 0-126
Class B: First Octet Value 128-191
Class C: First Octet Value 192-233
Class D: First Octet Value 224-239
Class E: First Octet Value 240-255
Chạy masscan với quyền root.
Cheatsheet: https://cheatsheet.haax.fr/network/port-scanning/masscan_cheatsheet/
Các parameters:
-p[n]
: chỉ định số port
--rate
: số lượng gói tin gửi đi trên giây.-e
: chỉ định network interface sử dụng.--router-ip
: chỉ định IP Gateway để gửi gói tin ra ngoài mạng.
-p
: scan all port
7.3 SMB Enumeration
7.3.1 Scanning for the NetBIOS Service
NetBIOS (Network Basic Input/Output System) là một giao thức mạng cho phép các ứng dụng trên các máy tính khác nhau trong mạng LAN giao tiếp với nhau, sử dụng cổng 139 TCP. NetBIOS cung cấp các dịch vụ liên quan đến tầng session trong mô hình OSI, bao gồm ba dịch vụ chính: NetBIOS Name Service (NBNS), NetBIOS Datagram Service (NBDS), và NetBIOS Session Service (NBSS).
NetBIOS Name Service (NBNS): cho phép các máy tính trong mạng LAN đăng ký và phân giải tên NetBIOS. Nó giống như một cuốn danh bạ điện thoại của mạng, nơi mỗi máy tính có một tên duy nhất.
NetBIOS Datagram Service (NBDS): cho phép truyền dữ liệu connectionless, có nghĩa là nó gửi các thông điệp (datagram) mà không cần thiết lập một kết nối trước. Điều này tương tự như gửi thư không cần phong bì.
NetBIOS Session Service (NBSS): cho phép thiết lập, duy trì và kết thúc các session giữa hai máy tính, đảm bảo rằng các thông điệp được gửi và nhận một cách có trật tự và đáng tin cậy.
Mặc dù modern implementations of SMB có thể hoạt động không cần NetBIOS, NetBIOS over TCP (NBT) là bắt buộc để có thể backward compatibility và thường được bật cùng nhau.
Scan cổng NetBIOS và SMB bằng Nmap:
Scan bằng nbtscan:
-r
: chỉ định cổng UDP 137, cổng mà NetBIOS Name Service (NBNS) sử dụng để truy vấn các tên NetBIOS hợp lệ.
7.3.2 Nmap SMB NSE Scripts
--script-args
: truyền tham số vào NSE script.unsafe=1
: cho phép các script nguy hiểm khởi chạy.
7.4 NFS Enumeration
NFS (Network File System) là một giao thức mạng cho phép chia sẻ tập tin và thư mục giữa các máy tính trên mạng, đặc biệt là trong môi trường Linux, hoạt động dựa trên mô hình client-server.
Việc cài đặt NFS một cách an toàn có thể khá phức tạp. Vì vậy, không hiếm gặp trường hợp các chia sẻ NFS bị mở public.
Hiện nay, có ba phiên bản NFS:
NFSv2:
Phiên bản cũ hơn và được hỗ trợ rộng rãi.
Sử dụng được TCP và UDP
NFSv3:
Hỗ trợ ghi an toàn không đồng bộ, xử lý lỗi tốt hơn NFSv2 và hỗ trợ kích thước tập tin 64-bit, cho phép client truy cập hơn 2GB dữ liệu.
Sử dụng được TCP và UDP
NFSv4:
Hoạt động qua firewall và trên Internet, không cần dịch vụ
rpcbind
, hỗ trợ ACL và sử dụng stateful operations.Chỉ dùng TCP
Tất cả các phiên bản NFS đều dựa trên RPC (Remote Procedure Call) để giao tiếp giữa client và server.
Các service trên NFS server:
nfs: quản lý việc chia sẻ các thư mục và tệp tin.
nfslock: giúp các máy khách có thể khóa các tệp tin trên máy chủ để tránh xung đột khi nhiều người cùng truy cập một lúc.
rpc.mountd: xử lý các yêu cầu kết nối (mount) từ máy khách đến máy chủ NFS.
rpc.nfsd: làm việc với Linux Kernel để đáp ứng các yêu cầu từ máy khách NFS, như cung cấp tài nguyên khi có kết nối mới.
rpc.rquotad: quản lý giới hạn sử dụng dung lượng của người dùng trên máy chủ NFS.
Các service trên NFS client:
lockd: giúp máy khách có thể khóa các tệp tin trên máy chủ NFS.
rpcbind (chỉ NFSv2 và NFSv3): ánh xạ các cổng mạng cho các dịch vụ RPC khác nhau.
rpc.statd (chỉ NFSv2 và NFSv3): giám sát trạng thái của máy chủ NFS và thông báo cho máy khách nếu máy chủ bị tắt đột ngột.
rpc.imapd (chỉ NFSv4): ánh xạ tên người dùng và nhóm giữa máy khách và máy chủ NFSv4
NFSv4 không sử dụng rpcbind
và rpc.statd
vì nó sử dụng một cổng TCP cố định (2049) để giao tiếp.
rpcbind
đã thay thế portmap
trong Red Hat Enterprise Linux 6. Nó có nhiều tính năng hơn, bao gồm:
Hỗ trợ IPv6: Cho phép ánh xạ các chương trình RPC đến các địa chỉ IPv6.
Hỗ trợ NFSv4: Tương thích với các phiên bản NFS mới nhất.
Scanning for NFS Shares
portmap
và rpcbind
chạy trên port 111 TCP. rpcbind
ánh xạ các dịch vụ RPC đến cổng mà chúng listen. Các tiến trình RPC sẽ thông báo với rpcbind
khi chúng khởi chạy, đăng ký port mà chúng listen và RPC program numbers (unique identifiers của mỗi RPC program) chúng phục vụ.
Client khi cần sẽ gửi RPC Program Number với rpcbind
ở server. Dịch vụ rpcbind
trên server sẽ chuyển hướng client tới port đúng (NFSv4 luôn là 2049) để có thể giao tiếp với dịch vụ đã yêu cầu.
-> scan port 111
--script=rpcinfo
: tìm các service đã đăng ký với rpcbind
.
Nmap NFS NSE Scripts
Chạy tất cả script liên quan tới nfs bằng cách dùng nfs*
:
Có thể thấy folder /home
đang được share trên dải mạng 10.11.0.0/255.255.0.0 (10.11.0.1 - 10.11.255.255). Sử dụng các lệnh:
mount
: mount folder này vào máy mình-o nolock
: tắt file locking (cần thiết với các NFSv cũ)
Tuy nhiên ta không thể đọc một số file:
Ta thấy file này có UID của owner là 1014, quyền là chỉ user này được rwx. Tuy nhiên đây là máy của chúng ta, ta có thể tạo ra một user như vậy để bypass.
7.5 SMTP Enumeration
Ở trong STMP, có vài command thú vị là:
VRFY: yêu cấu server verify địa chỉ email
EXPN: yêu cầu server cung cấp danh sách thành viên của một mailing list
Ngoài ra có thể sử dụng --script=smtp-enum-users
của nmap hoặc auxiliary/scanner/smtp/smtp_enum
của metasploit.
7.6 SNMP Enumeration
SNMP - Simple Network Management Protocol là một giao thức chuẩn cho phép chúng ta thu thập và tổ chức thông tin về các thiết bị mạng như router, switch, server, ..., sử dụng cổng 161 UDP.
Agent:
Các thiết bị hỗ trợ SNMP được gọi là Agent. Agent chứa các đối tượng (object) cho biết thông tin về thiết bị. Một số đối tượng sẽ là một phần của industry standard, hoặc một số sẽ là vendor-specific với mỗi thiết bị.
Mỗi đối tượng được gán một mã định danh đối tượng (Object Identifier - OID).
Các objects này sẽ được chứa trong một cái gọi là MIB.
Ví dụ:
MIB (Management Information Base)
MIB là một tệp chứa cấu trúc cây của các OID, giúp định vị các đối tượng trên Agent cũng như định nghĩa các thuộc tính của đối tượng như kiểu dữ liệu, quyền truy cập (đọc/ghi), phạm vi giá trị, ...
Mỗi một node của mib sẽ có số. Đó chính là cách OID được tạo nên và vì sao nó có thể dùng để định vị object.
Có nhiều chuẩn MIB: MIB-II (RFC 1213), IF-MIB (RFC 2863), TCP-MIB (RFC 4022), UDP-MIB (RFC 4113), ENTITY-MIB (RFC 4133), ...
Thực tế, MIB thường sẽ là một cây gồm nhiều MIB khác nhau, với 1 MIB root. Ví dụ:
NMS (Network Management System)
NMS là một phần mềm sử dụng để giao tiếp với Agent thông qua giao thức SNMP.
Nó gửi yêu cầu đến Agent để lấy thông tin (Get request), thay đổi cấu hình (Set request), hoặc nhận thông báo từ Agent khi có sự kiện xảy ra (Trap/Inform). Cụ thể:
Get Request:
Yêu cầu Agent cung cấp giá trị của một OID cụ thể.
Ví dụ: NMS gửi Get Request để lấy tên của router (sysName.0).
Agent sẽ phản hồi bằng Get Response chứa giá trị của OID đó (ví dụ: "R1").
GetNext Request:
Yêu cầu Agent cung cấp giá trị của OID tiếp theo trong MIB, theo thứ tự từ điển.
Được sử dụng để duyệt qua các OID trong MIB một cách tuần tự.
Ví dụ: NMS gửi GetNext Request với OID sysName.0, Agent có thể trả về giá trị của OID tiếp theo (ví dụ: sysDescr.0).
GetBulk Request:
Yêu cầu Agent cung cấp giá trị của nhiều OID liên tiếp trong MIB.
Giúp giảm số lượng yêu cầu cần gửi so với việc sử dụng nhiều GetNext Request.
Ví dụ: NMS gửi GetBulk Request với OID bắt đầu là sysName.0 và số lượng OID cần lấy là 5, Agent sẽ trả về giá trị của 5 OID tiếp theo.
Set Request:
Yêu cầu Agent thay đổi giá trị của một OID cụ thể.
Ví dụ: NMS gửi Set Request để thay đổi tên của router thành "R5".
Agent sẽ phản hồi bằng Set Response để xác nhận việc thay đổi thành công.
Trap và Inform Request:
Không phải là yêu cầu từ NMS, mà là thông báo từ Agent gửi đến NMS.
Trap là thông báo không yêu cầu xác nhận từ NMS.
Inform là thông báo yêu cầu xác nhận từ NMS, đảm bảo tin nhắn được gửi đến nơi.
Ví dụ: Khi một cổng giao tiếp trên router bị tắt, Agent sẽ gửi Trap hoặc Inform đến NMS để thông báo sự kiện này.
SNMP có ba phiên bản chính:
SNMPv1: Đây là phiên bản gốc của SNMP, được giới thiệu vào năm 1988. Nó sử dụng cơ chế xác thực đơn giản dựa trên community string (chuỗi cộng đồng) để xác thực các yêu cầu. Tuy nhiên, SNMPv1 có những hạn chế về bảo mật và không hỗ trợ các tính năng nâng cao.
SNMPv2c: Đây là phiên bản cải tiến của SNMPv2, được giới thiệu vào năm 1993. Nó vẫn sử dụng community string để xác thực, nhưng có thêm một số cải tiến về hiệu suất và khả năng mở rộng. SNMPv2c là phiên bản phổ biến nhất hiện nay và được hỗ trợ rộng rãi bởi các thiết bị mạng.
SNMPv3: Đây là phiên bản mới nhất của SNMP, được giới thiệu vào năm 1998. Nó cung cấp các cơ chế bảo mật mạnh mẽ hơn so với SNMPv1 và SNMPv2c, bao gồm xác thực dựa trên mật khẩu và mã hóa dữ liệu. Tuy nhiên, SNMPv3 cũng phức tạp hơn và không được hỗ trợ rộng rãi như SNMPv2c.
Tài liệu: https://www.ibm.com/docs/en/aix/7.1?topic=management-information-base
Scanning for SNMP
Nmap --open
: chỉ in ra port mở
Sử dụng onesixtyone để bruteforce community string (có thể hiểu là password) của snmp agent.
Khi đã tìm ra smnp community string (thường mặc định là "public"), ta sử dụng các tool NMS để tiến hành enumeration
snmpwalk
Web search OID: https://oidref.com/
-c
: community string-v
: snmp version number-t
: timeout nhận phản hồi từ SNMP agent sau khi đã gửi yêu cầu, tính bằng giây.
Enumerating Windows Users: OID 1.3.6.1.4.1.77.1.2.25 (svUserTable)
Enumerating Running Windows Processes: OID 1.3.6.1.2.1.25.4.2.1.2 (hrSWRunName)
Enumerating Open TCP Ports: OID 1.3.6.1.2.1.6.13.1.3 (tcpConnLocalPort)
Enumerating Installed Software: OID 1.3.6.1.2.1.25.6.3.1.2 (hrSWInstalledName)
8. Vulnerability Scanning
8.1 Vulnerability Scanning Overview and Considerations
8.1.1 How Vulnerability Scanners Work
Các công cụ quét lỗ hổng thường tuân theo một quy trình tiêu chuẩn, bao gồm:
Detect if a target is up and running.
Conduct a full or partial port scan, depending on the configuration.
Identify the operating system using common fingerprinting techniques.
Attempt to identify running services with common techniques such as banner grabbing, service behavior identification, or file discovery.
Execute a signature-matching process to discover vulnerabilities. (thường hay dùng banner grabbing)
Update thường xuyên database của scanner.
8.1.2 Manual vs. Automated Scanning
Manual Scanning cho phép phát hiện các lỗ hổng phức tạp mà các công cụ tự động khó nhận ra. Tuy nhiên nó rất tốn kém tài nguyên và thời gian, dễ gặp lỗi và bỏ sót lỗ hổng.
Automated Scanning rất hữu ích khi làm việc với các dự án lớn dưới áp lực thời gian, xác định được các lỗ hổng dễ phát hiện hoặc ít nhất là giúp hiểu được tình trạng bảo mật chung của mục tiêu. Tuy nhiên, nó có thể gây hại cho mục tiêu nếu không được config đúng (vd: bruteforce -> khóa tài khoản) , và sẽ có những trường hợp false positive, false negative.
-> Kết hợp cả 2
8.1.3 Internet Scanning vs Internal Scanning
Vị trí trong mạng ảnh hưởng tới:
Tốc độ scan (trong mạng thì băng thông cao hơn và ít hops tới các máy chủ hơn)
Quyền truy cập và can thiệp vào traffics mạng (IPS/IDS, Firewall, ...)
Khả năng nhìn thấy mục tiêu (chặn Ping Sweep)
Để có kết quả tối ưu, nên điều chỉnh tốc độ scan và timeout ngay từ đầu. Nếu kết quả đạt chất lượng tốt, ta có thể tăng dần tốc độ cho đến khi đạt được sự cân bằng.
8.1.4 Authenticated vs Unauthenticated Scanning
Cho scanners user quyền cao để có thể scan tốt hơn.
Linux: sử dụng SSH
Windows: sử dụng WMI
8.2 Vulnerability Scanning with Nessus
Nessus là một trong những công cụ dò quét lỗ hổng phổ biến nhất hiện nay (closed-source ,trước 2005 là open-source), hỗ trợ đến hơn 130.000 plugin. Phiên bản miễn phí "Essentials" cho phép quét đến 16 IP một lúc.
Nessus đóng source nên sinh ra OpenVAS - tool quét lỗ hổng open-source
......
8.3 Vulnerability Scanning with Nmap
Sử dụng Nmap Scripting Engine (NSE) để scan.
Các script này được viết bằng Lua và được lưu trong /usr/share/nmap/scripts/
. Hãy đọc bất kí script nào trước khi chạy.
Ngoài ra trong thư mục này còn chứa file script.db
, chứa mục lục các script. Có thể sử dụng grep
để lọc ra các script mình cần.
Scan các script liên quan tới vuln:
9. Web Application Attacks
OWASP Top 10: https://owasp.org/www-project-top-ten/
9.1 Web Application Assessment Methodology
Phương pháp kiểm thử xâm nhập web cơ bản:
Bước 1: Thu thập thông tin về ứng dụng web
Ứng dụng này dùng để làm gì?
Sử dụng ngôn ngữ nào?
Server, database, OS, ... sử dụng là gì?
etc
Bước 2: Phân tích cấu trúc của ứng dụng web
Form
API
Các endpoint khác nhau
etc
Bước 3: Kiểm tra các lỗ hổng phổ biến: SQLi, XSS, CSRF, ...
Bước 4: Khi khai thác thành công một lỗ hổng, khám phá thêm các chức năng mới. Lặp lại cho tới khi không tìm ra gì nữa hoặc chiếm được quyền điều khiện hệ thống.
Bước 5: Tổng hợp kết quả, phân tích, đánh giá, report.
9.2 Web Application Enumeration
Ta cần biết được các thành phần của ứng dụng web trước khi thử khai thác nó. Hầu hết các trình duyện hiện đại hiện nay đều có sẵn Developer Tools
có thể sử dụng cho việc này.
9.2.1 Inspecting URLs
Nhìn vào URL để nhận ra ngôn ngữ. Ví dụ: .php
-> php. Có một số cái sẽ khó đoán hơn, ví dụ: Java web app sử dụng cả .jsp
, .do
hay .html
.
Tuy nhiên, cách này đã bớt phổ biến vì hiện nay các trang web đã sử dụng kỹ thuật route để ánh xạ URI vào các section code.
9.2.2 Inspecting Page Content
Phần lớn manh mối có thể tìm thấy trong mã nguồn của trang web, sử dụng Debugger Tools (Ctrl + Shift + K trong firefox). Nó có thể giúp ta thấy được framework JavaScript, các trường input ẩn, các comment, và các client-side controls trong HTML, JavaScript, etc.
Sử dụng {}
để làm đẹp code
Ngoài ra, ta cũng có thể sử dụng Inspector Tools để xem một nội dung cụ thể trong trang web.
9.2.3 Viewing Response Headers
Có thể sử dụng proxy hoặc Network Tool để xem các HTTP request/response
Các header bắt đầu bằng "X-" là non-standard HTTP headers, cũng hay cho biết được công nghệ sử dụng trong ứng dụng web. Ví dụ:
X-Powered-By: cho biết ngôn ngữ lập trình hoặc framework. Ví dụ, "X-Powered-By: PHP/7.4.3" chỉ ra ứng dụng đang chạy trên PHP phiên bản 7.4.3.
X-Aspnet-Version: cho biết phiên bản của ASP.NET đang được sử dụng, ví dụ "X-Aspnet-Version: 4.0.30319" chỉ ra phiên bản ASP.NET 4.0.
x-amz-cf-id: cho biết ứng dụng đang sử dụng Amazon CloudFront.
etc
9.2.4 Inspecting Sitemaps
Ứng dụng web có thể bao gồm file sitemap để giúp đỡ các search engine bots crawl và index website. Các file này sẽ bao gồm cả các thư mục mà không được phép crawl, có thể là các trang nhạy cảm như trang admin, ....
Hai file phổ biến nhất là robots.txt và sitemap.xml
9.2.5 Locating Administration Consoles
Các web server thường sẽ có một phần mềm quản lý từ xa hoặc console, thử mà có thể được truy cập thông qua một URL nào đó hoặc qua các cổng TCP. Các ứng dụng này có thể xác định thông qua các document của webserver đó (nếu không được tùy chỉnh mà để mặc định)
Hai ví dụ thông dụng nhất là /manager/html của Tomcat và /phpmyadmin của phpMyAdmin, sử dụng để quản lý MySQL Database.
9.3 Web Application Assessment Tools
9.3.1 DIRB
Là phần mềm để tìm ra các directories của trang web bằng cách gửi request tới server.
Một số parameter:
-r
: không tìm đệ quy-z
: delay giữa mỗi request
Other tools:
Dirsearch: https://github.com/maurosoria/dirsearch
DirBuster: https://www.kali.org/tools/dirbuster/ (giống DIRB nhưng viết bằng Java, hỗ trợ multi-threading và giao diện GUI)
9.3.2 Burp Suite
BurpSuite là một phần mềm bao gồm nhiều tools để đánh giá bảo mật web, được đánh giá là "a powerful proxy tool".
9.3.3 Nikto
Nikto là tool scan web server mã nguồn mở, có thể quét hàng nghìn files và chương trình, các phiên bản server có lỗ hổng và các vấn đề trong việc config server. Tuy nhiên, nó không kín đáo vì nó gửi rất nhiều request và chứa thông tin về nó trong User-Agent header.
Nikto có thể scan nhiều server và port, và scan tất cả các page mà nó tìm được. Một số parameter:
-maxtime
: thời gian scan tối đa-T(tuning)
: điều chỉnh loại test muốn chạy.
9.4 Exploiting Web-based Vulnerabilities
9.4.1 Exploiting Admin Consoles
18. Privilege Escalation
Privilege Escalation hay Leo thang đặc quyền là quá trình khai thác các lỗ hổng hoặc điểm yếu trong hệ thống để có được quyền truy cập cao hơn so với ban đầu. Đây là một kỹ năng cần thiết vì hầu hết ta sẽ không có sẵn quyền admin hoặc root khi xâm nhập.
Mỗi mục tiêu đều có sự khác biệt từ phiên bản hệ điều hành, các bản vá và một số yếu tố khác. Tuy nhiên, chúng vẫn có một số phương pháp chung: tìm kiếm các dịch vụ bị cấu hình sai, phân quyền các file hoặc service không chặt chẽ, lỗ hổng trong kernel, các phần mềm chạy với quyền cao, các thông tin nhạy cảm lưu trong file cục bộ, các cấu hình registry, các script cài đặt chứa credentials, etc
18.1 Information Gathering
Sau khi xâm nhập được vào hệ thống với quyền user thường, bước đầu tiên là thu thập nhiều thông tin nhất có thể để hiểu và tìm được manh mối cho việc leo thang đặc quyền.
18.1.1 Manual Enumeration
Chậm, tuy nhiên có thể tìm ra các cách leo quyền mà các tools thường bỏ lỡ.
Enumerating Users
Sử dụng whoami
(Both), id
(Linux) hoặc net user
(Windows) để thu thập thông tin về user hiện tại.
Để xem các user khác, sử dụng net user
(Windows) và đọc /etc/passwd
(Linux):
Enumerating the Hostname
Hostname có thể cho ta biết được chức năng của máy. VD: web -> web server, db -> database server, dc -> domain controller, etc
Sử dụng lệnh hostname
:
Hostname của máy windows trên có thể cho chúng ta đoán được tên của các máy khác, còn máy Linux cho biết được về OS sử dụng.
Enumerating the Operating System Version and Architecture
Đôi lúc chúng ta phải exploit kernel để leo thang đặc quyền, việc mà phụ thuộc chính vào OS và phiên bản nhất định. Điều này phải được tiến hành một cách chính xác, vì nếu exploit nhầm kernel sẽ có thể gây mất quyền truy cập hoặc gây cảnh báo tới system admin.
Windows: Sử dụng
systeminfo
vớifindstr
để lọc output/B
: tìm các string mà khớp ở đầu dòng/C:[string]
: chỉ định chuỗi cụ thể
Linux: Sử dụng lệnh
uname -a
hoặc đọc các file/etc/issue
,/etc/*-release
.
Enumerating Running Processes and Services
Tìm các process chạy với quyền cao, có quyền truy cập lỏng lẻo hoặc có thể tương tác một cách đặc biệt nào đó.
Windows: Sử dụng lệnh
tasklist
với parameter/SVC
để in ra các process ánh xạ tới các service nào (nếu có). Tuy nhiên, trong Windows, ta sẽ không thể nhìn thấy process của user quyền cao hơn.
Linux: Sử dụng lệnh
ps
để liệt kê các process đang chạy. Các paramater thường dùng:a
: Hiển thị process của TẤT CẢ user trong hệ thốngx
: Hiển thị các process mà không có TTY (ví dụ: background process, daemon, ...)u
: Hiển thị cả thông tin user và thời gian bắt đầu process
Thậm chí cả lệnh
ps
cũng được hiển thị.
Enumerating Networking Information
Xem các network interface, router, open port, ... của máy để xem nó có kết nối tới nhiều network hay không để sử dụng làm pivot. Ngoài ra, sự xuất hiện của một số virtual interface có thể cho thấy sự tồn tại của tính năng ảo hóa hoặc antivirus.
Các service chạy trên loopback (local) cũng nên được chú ý vì nó có thể giúp mở rộng bề mặt tấn công và tăng khả năng leo thang đặc quyền.
Windows:
Sử dụng lệnh
ipconfig
với flag/all
để xem cấu hình TCP/IP của tất cả adapters.
Để xem bảng định tuyến (routing table), sử dụng lệnh
route
kết hợp với tham sốprint
:
Sử dụng
netstat
để xem các kết nối đang hoạt động. Một số flag thường dùng:-a
: hiển thị tất cả các kết nối TCP đang hoạt động-n
: hiển thị địa chỉ và port ở dạng số.-o
: hiển thị owner PID của mỗi kết nối.
Netstat không chỉ hiển thị các port đang listen mà còn là về các kết nối đã được thiết lập (ESTABLISHED), có khả năng tiết lộ các user khác đang kết nối.
Linux:
Sử dụng
ifconfig
hoặcip
, với tham sốa
để hiển thị tất cả các thông tin về network adapter.
Sử dụng
route
hoặcroutel
để xem routing table
Sử dụng
netstat
hoặcss
để xem các kết nối đang hoạt động cũng như các listening port-a
: hiển thị tất cả các kết nối-n
: không phần giải hostname (giúp thực thi lệnh nhanh hơn)-p
: hiển thị process gán với kết nối đó.
Enumerating Firewall Status and Rules
Thông thường, firewall state, rule hay profiles chỉ được để ý tói trong quá trình exploit từ xa.Tuy vậy, nó cũng có thể được sử dụng để leo thang đặc quyền. Ví dụ: nếu một service không thể được truy cập từ xa vì nó bị chặn bởi firewall, thường thì nó sẽ có thể được truy cập thông qua loopback interface, từ đó ta có thể khai thác chúng để leo quyền.
Ngoài ra, chúng ta cũng có thể thu thập thông tin về các inbound và outbound port để dựng nên port forwarding hoặc tunnel khi pivot tới mạng nội bộ.
Windows: Sử dụng lệnh
netsh
để xem firewall profiles
Xem các rules của firewall này:
Linux: Sử dụng
iptables
. Nó yêu cầu quyền root, tuy nhiên tùy vào cấu hình firewall, ta vẫn có thể xem được gì đó bằng user thường, ví dụ:Gói
iptable-persistent
trong Debian Linux mặc định lưu rules firewall trong các files cụ thể ởetc/iptables
(thường là file/etc/iptables/rules.v4
đối với IPv4 và/etc/iptables/rules.v6
đối với IPv6). Các file này thường sẽ có permission lỏng lẻo -> cho phép user thường đọc
iptables không tự động lưu và khôi phục các quy tắc tường lửa khi hệ thống khởi động lại, nên mới có sự ra đời của iptable-persistent
Các lệnh
iptables-save
(xuất firewall rules ra file) vàiptables-restore
(khôi phục lại rules từ tệp kia) cũng được lưu trong/etc
.
Enumerating Scheduled Tasks
Windows:
Attacker thường lợi dùng các Scheduled Task có quyền cao để leo quyền.
Sử dụng lệnh
schtasks
để xem các scheduled task. Các tham số thường dùng:/query
: hiển thị các task (dùng khi cần các tham số khác)/fo LIST
: chỉ định format output là list./v
: verbose
Linux:
Các scheduled task trong Linux gọi là cron, được lưu trong các file
/etc/cron.*
với * là tần suất mà task này sẽ chạy.
Ngoài ra, quản trị còn có thể tùy biến các scheduled task riêng sử dụng file /etc/crontab
. Các task này nên được để ý vì chúng thường sẽ được chạy bằng root.
Enumerating Installed Applications and Patch Levels
Windows:
Sử dụng
wmic
với tham sốproduct get
để get các thuộc tính của các product đã cài trong hệ thống. Các thuộc tính này sẽ là của Win32_Product class (https://learn.microsoft.com/en-us/previous-versions/windows/desktop/legacy/aa394378(v=vs.85))
Nó sẽ chỉ get được các app cài bằng Windows Installer
Tương tự, có thể sử dụng để xem các bản update windows đã cài, sử dụng Win32_QuickFixEngineering (qfe) (https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-quickfixengineering)
HotFixID và InstalledOn có thể giúp ta detect xem Windows có được update bản vá hay chưa, từ đó dễ dàng hơn để exploit.
Linux:
Có thể dùng
dpkg
trong Debian hoặcrpm
trong Red Hat để quản lý package.
Enumerating Readable/Writable Files and Directories
Windows:
Sử dụng
accesshck.exe
, công cụ dòng lệnh của Sysinternals để kiểm tra quyền truy cập vào tệp, thư mục, khóa registry và các đối tượng bảo mật khác trên hệ thống Windows.-u
: Chỉ hiển thị quyền của người dùng hoặc nhóm được chỉ định-w
: Chỉ hiển thị các file có quyền write-s
: check đệ quy
Sử dụng Powershell. Ví dụ:
Get-Acl
: get quyền của file/dirGet-ChildItem "C:\Program Files" -Recurse
: liệt kê tất cả các file và thư mục trong Program Files và có truyền đệ quy.?{$_.AccessToString -match "Everyone\sAllow\s\sModify"}
: Đây là một phần của Where-Object (?). Nó lọc các mục dựa trên điều kiện sau:$_.AccessToString
: Chuyển đổi ACL của mục thành một chuỗi văn bản.-match "Everyone\sAllow\s\sModify"
: Kiểm tra xem chuỗi văn bản ACL có chứa cụm từ "Everyone Allow Modify" hay không. Nếu có, mục đó sẽ được giữ lại; nếu không, mục đó sẽ bị loại bỏ.
Linux:
Sử dụng lệnh
find
. Ví dụ:-writeable
: tìm các file có quyền ghi-type
: loại file cần tìm2>/dev/null
: chuyển hướng error vào/dev/null
, một file đặc biệt thường được gọi là "hố đen", nó sẽ loại bỏ bất kỳ dữ liệu nào được ghi vào nó.
Enumerating Unmounted Disks
Trong hầu hết các hệ thống, drives sẽ được mount tự động trong quá trình boot. Bởi vì điều này, việc quên không unmount các drive chứa dữ liệu quan trọng có thể xảy ra.
Windows:
Sử dụng lệnh
mountvol
để xem các mounted/unmounted drives
Linux:
Sử dụng lệnh
mount
. Ngoài ra, file/etc/fstab
sẽ liệt kê các drives được mount ở boot time.
Cũng có thể sử dụng
lsblk
để xem các disk hiện tại.
Enumerating Device Drivers and Kernel Modules
Windows:
Sử dụng lệnh
driverquery
để xem các driver./v
: verbose/fo
: chỉ định format output
Sử dụng powershell để filter output.
Linux:
Sử dụng lệnh
lsmod
để xem các loaded kernel modules.
Khi đã có danh sách các loaded module kernel, sử dụng
modinfo
để xem thông tin về nó.
Enumerating Binaries That AutoElevate
Có một số OS-specific “shortcuts” to privilege escalation.
Windows:
Check registry
AlwaysInstallElevated
. Đây là một chính sách trong Windows Installer (MSI) cho phép người dùng cài đặt bất kỳ gói MSI nào với elevated privileges (cụ thể là SYSTEM). Path:
Sử dụng lệnh
req query
để check:
-> Tạo file MSI và chạy sẽ được quyền SYSTEM.
Linux:
Ta sẽ tìm các file có chứa SUID (cho phép run file với quyền của owner) của root
Sử dụng lệnh
find
để tìm các file này
VD: nếu
/bin/cp
có SUID của root -> có thể copy và ghi đè các file như/etc/passwd
.
18.1.2 Automated Enumeration
Windows:
Có thể sử dụng script
windows-privesc-check
. (https://github.com/pentestmonkey/windows-privesc-check)
--dump
: để xem output-G
: liệt kê các groups
Linux:
Tương tự có thể sử dụng
unix-privesc-check
để check (https://github.com/pentestmonkey/unix-privesc-check.git)
18.2 Windows Privilege Escalation Examples
18.2.1 Understanding Windows Privileges and Integrity Levels
Privileges (đặc quyền) trong Windows là các quyền hạn của một tài khoản cụ thể để thực hiện các thao tác liên quan đến hệ thống, chẳng hạn như sửa đổi files, thêm người dùng, tắt máy, etc. Windows sử dụng các object được gọi là access token (https://learn.microsoft.com/en-us/windows/win32/secauthz/access-tokens) để chỉ định các đặc quyền này.
Khi người dùng được xác thực, Windows sẽ tạo một access token được gán cho người dùng đó. Access token này chứa nhiều thông tin về security context của người dùng, bao gồm cả các đặc quyền của người dùng. Mỗi access token được xác định duy nhất bằng SID (Security Identifier), là một giá trị duy nhất được gán cho mỗi đối tượng (bao gồm cả access token), chẳng hạn như tài khoản người dùng hoặc groups.
Các SIDs được quản lý bởi Windows Local Security Authority.
Thêm nữa, Windows còn có một kiến trúc bảo mật gọi là integrity mechanism. Nó hoạt động bằng cách gán các integrity levels cho các application processes và securable objects. Điều này mô tả mức độ tin cậy mà hệ điều hành dành cho các application processes hoặc securable objects. Ví dụ,integrity level được cấu hình sẽ quyết định những hành vi mà một ứng dụng có thể thực hiện, bao gồm cả khả năng đọc hoặc ghi.
Từ Windows Vista trở đi, các process chạy trên 4 integrity levels:
System integrity process: SYSTEM rights
High integrity process: administrative rights
Medium integrity process: standard user rights
Low integrity process: very restricted rights often used in sandboxed processes
18.2.2 Introduction to User Account Control (UAC)
User Account Control (UAC) là hệ thống kiểm soát truy cập trên Windows. Nó có tác dụng khiến cho tất cả các ứng dụng hay task mặc định được khởi chạy bằng quyền user thường (kể cả khi đang login bằng admin), cho tới khi được yêu cầu quyền admin.
UAC có 2 modes:
credential prompt: xuất hiện khi đang login bằng user thường. Nó sẽ yêu cầu nhập tk và pass admin.
consent prompt: xuất hiện khi đang login bằng admin. Nó sẽ yêu cầu xác nhận có chạy bằng quyền admin thật hay không.
Khi login bằng admin, tài khoản này sẽ có 2 security tokens, một chạy dưới medium integrity level và một dưới high integrity level. UAC đóng vai trò là cơ chế phân tách 2 level này. Ví dụ:
Khi chạy cmd bình thường:
Khi chạy cmd với
Run as Administrator
:
18.2.3 User Account Control (UAC) Bypass: fodhelper.exe Case Study
Context: Lợi dụng program chạy dưới quyền cao.
Check application manifest (là một XML file chứa thông tin để hệ thống biết cách handle program khi nói khởi chạy)
autoElevate = tự động nâng quyền không cần xác nhận (ko qua UAC)
Dùng Process Monitor để xem xem ứng dụng làm những gì và thao túng cái có thể (như bài này là tìm cách chạy cmd.exe từ fodhelper.exe)
18.2.4 Insecure File Permissions: Serviio Case Study
Context: Lợi dụng file permission lỏng lẻo của service chạy với quyền SYSTEM.
Xem các service đang chạy
ProgramFiles -> do user install
Dùng icacls
để xem SID và permission mask của service:
Users thường có full access tới file service này -> Thay thế bằng file mã độc
Tuy nhiên, phải restart service thì file mới chạy lại. Việc này cần quyền admin.
Nếu user có quyền reboot và service start auto -> oke. Không thì phải chờ tới lúc service này được restart bằng cách nào đó.
18.2.5 Leveraging Unquoted Service Paths
Ở một đường dẫn file thực thi, bất cứ thứ gì xuất hiện sau mỗi ký tự khoảng trắng sẽ được coi là một tham số hoặc tùy chọn cho tệp thực thi. Giả sử có một service có đường dẫn là C:\Program Files\My Program\My Service\service.exe
. Nếu trong config của service không cho nó vào trong dấu ngoặc, khi Windows start, service sẽ tìm file thực thi này như sau:
-> Có thể tận dụng lỗi này để tạo ra một file mã độc có path được chạy trước (VD: C:\Program.exe). Điều kiện là ta phải có quyền ghi vào 1 trong các folder này.
18.2.6 Windows Kernel Vulnerabilities: USBPcap Case Study
Note: Khi cố gắng khai thác phần mềm cấp hệ thống (driver, kernel) phải chú ý đến nhiều yếu tố, bao gồm OS, phiên bản và kiến trúc của nó, nếu không dễ dẫn đến Blue Screen of Death (BSOD).
Check HĐH:
Check driver:
Tìm exploit:
Check phiên bản của driver muốn exploit
Keep in mind that the driver directory is often found under C:\Windows\System32\DRIVERS
18.3 Linux Privilege Escalation Examples
18.3.1 Understanding Linux Privileges
Trong Linux, "everything is a file". Mọi file trong Linux sẽ có các quyền read, write và execute
18.3.2 Insecure File Permissions: Cron Case Study
Đọc /var/log/cron.log
để xem các cronjob đang chạy
Khám phá nội dung và quyền của job
Do file này có quyền write cho other, sử dụng để tạo reverse shell
18.3.3 Insecure File Permissions: /etc/passwd Case Study
Linux password được lưu trữ trong file /etc/shadow
, thường không được phép đọc bởi user thường. Tuy nhiên, trước đây, nó từng được lưu trữ trong file /etc/passwd
cùng với thông tin về account, có thể được đọc bởi user thường.
Vì vậy, để backwards compatibility, nếu password hash được lưu trong cột thứ hai của file /etc/passwd
, nó sẽ được sử dụng để authen thay vì nội dung trong /etc/shadow
.
-> Nếu có quyền write vào /etc/passwd
, ta có thể set pass cho account tùy ý.
Do để uid 0 và gid 0 nên khi login vào root2 ta sẽ vào user root
18.3.4 Kernel Vulnerabilities: CVE-2017-1000112 Case Study
Đọc /etc/issue
để xem phiên bản Linux
Xem kernel version và cấu trúc:
Dựa vào thông tin kernel, tìm exploit. Ở đây ta có exploits/linux/local/43418.c
thỏa mãn.
Compile exploit và chạy, ta sẽ privesc được:
21. Active Directory Attacks
Microsoft Active Directory Domain Services (ADDS), thường được gọi là Active Directory (AD), là dịch vụ cho phép system admin update và quản lý OS, Application, Users và Data Access với một quy mô lớn.
21.1 Active Directory Theory
Active Directory bao gồm nhiều thành phần. Thành phần quan trọng nhất gọi là Domain Controller (DC), là một con Windows Server với role Active Directory Domain Services được cài đặt.
Domain Controller là trung tâm (hub) và cốt lõi (core) của AD bởi lẽ nó chứa toàn bộ thông tin liên quan đến việc từng instance trong AD được cấu hình như thế nào. Ngoài ra, nó còn thực hiện hàng loạt các rule để quản lý các mà từng đối tượng trong từng Window Domain tương tác với nhau, các dịch vụ và công cụ nào mà end user được phép sử dụng.
Với một instance AD, một domain sẽ được tạo ra (VD: corp.com - corp là tên của tổ chức). Với domain này, ta có thể thêm các đối tượng khác nhau như máy tính (server, workstation mà có join vào domain), user (các nhân viên của tổ chức),...
System admin thường sẽ luôn tổ chức các đối tượng này với sử giúp đỡ của các Organizational Units (OU). OUs có thể được hiểu như các thư mục, là container chứa và group các đối tượng.
Mọi đối tượng trong AD đều có các thuộc tính (attributes) khác nhau. VD: user object có thể bao gồm first name, last name, username, password, etc
Thông thường, các máy tính trong mạng nội bộ của tổ chức sẽ được kết nối tới Domain Controller và tới hàng loạt các server nội bộ khác như database server, file storage server, web server, etc. Các máy tính sử dụng để truy cập Internet sẽ không được domain-joined.
Một môi trường AD có một sự phụ thuộc quan trọng vào dịch vụ DNS bởi vậy một DC trong AD cũng sẽ host một DNS Server là Authoritative Server cho domain này.
21.2 Active Directory Enumeration
Một cuộc tấn công vào hạ tầng Active Directory thường bắt đầu bằng việc attack thành công server hoặc workstation trong miền và sử dụng nó để enumerate.
Ở đây chúng ta sẽ cho rằng máy được chiếm quyền có quyền Local Admin.
21.2.1 Traditional Approach
Sử dụng net user
để xem các local account
Thêm flag /domain
để xem các account trên toàn domain
Xem thông tin user cụ thể:
Dùng net group /domain
để enumerate các groups trên domain:
Trong AD, một groups và toàn bộ các members của nó có thể được cho vào làm member của một group khác. Group này gọi là nested group.
Tuy nhiên, net
sẽ chỉ hiển thị các member trực tiếp của groups (không có các member từ group con) khi dùng lệnh net group [group_name] /domain
.
21.2.2 A Modern Approach
Ta sẽ sử dụng DirectorySearcher object của powershell để query tới AD sử dụng Lightweight Directory Access Protocol (LDAP).
LDAP là giao thức mạng có thể được hiểu bằng DC, sử dụng để giao tiếp với các phần mềm bên thứ ba.
LDAP là một Active Directory Service Interfaces (ADSI) provider (hiểu cơ bản là một API) hỗ trợ chức năng search trong AD. Điều này sẽ cho phép chúng ta tương tác với DC sử dụng Powershell và lấy ra các non-privileged information.
Format của LDAP provider path:
Sử dụng GetCurrentDomain
để lấy domain của user hiện tại:
Ở đây ta có domain name là corp.com
, primary DC name là DC01.corp.com
. Script để tạo LDAP Provider path:
Kết quả:
Giờ ta có thể sử dụng class DirectorySearcher với LDAP provider path trên bằng cách cung cấp SearchRoot, là một node trong AD, nơi mà quá trình tìm kiếm bắt đầu.
SearchRoot được lấy trong class DirectoryEntry. Khi không có argument nào được truyền vào -> search toàn bộ AD.
Tuy nhiên code trên sẽ nhận all object. Ta cần phải filter. Cách hay dùng nhất là sử dụng thuộc tính samAccountType, thuộc tính mà user, computer hay group object đều có. Ở đây ta dùng 0x30000000 (805306368) để enumerate all user trong domain.
Kết quả:
Vì các thuộc tính của user được lưu trong trường Properties, ta có thể in ra dễ nhìn hơn tí:
Kết quả:
Ngoài ra còn có thể filter theo username:
21.2.3 Resolving Nested Groups
Liệt kê các groups:
Xem các group con của group Secret_Group
:
Modify script bằng cách thay tên group để tìm ra các Group sâu hơn:
Code đệ quy:
21.2.4 Currently Logged on Users
Sử dụng NetWkstaUserEnum and NetSessionEnum API để enum user và user' active session.. Tuy nhiên, có thể dùng PowerView trong PowerShell Empire framework.
Import:
Xem các user đang login vào máy local:
Xem xem các session nào từ máy local đang kết nối tới DC:
21.2.5 Enumeration Through Service Principal Names
21.3 Active Directory Authentication
21.3.4 Service Account Attacks (Kerberoasting)
21.4 Active Directory Lateral Movement
Last updated