KIỂM THỬ XÂM NHẬP
T- Pof?| là một nền tang honeypof| đa chức năng và linh hoạt, giúp mô phỏng
5.1 Hiện thực hóa quá trình
5.1.3. Quá trình tìm kiếm lỗ hổng bảo mật
Sau khi job Host Control đã hoàn thành thực thi, job Web Control được khởi chạy.
Theo mô tả trong mục|4.2} khi job Web Control được khởi chạy, chương trình sẽ
tiến hành chờ cho tới khi tat cả các job được tao ra từ job Host Control được hoàn thành theo luồng sau:
© Lay các đối tượng job Host Control từ hàng đợi Redis.
© Lấy kết quả trả về từ các job Host Control, từ đây lay được các đối tượng
subHost_jobs từ hàng đợi Redis.
# get jobs from host control job
redis =Redis(host=self.redis_host, port=self.redis_port)
q = Queue(connection=redis)
hostsControl_job =q.fetch_job(self.jobs_id)
subHost_jobid =hostsControl_job.result
subHost_jobs =[q.fetch_job(id) for id in subHost_jobid]
* Chờ tới khi tat cả các job subHost_jobs được hoàn thành.
“https: //github.com/s0md3v/Smap
70
Chương 5. Hiện thực và Thực nghiệm
e Tiếp theo, chương trình tổng hợp dữ liệu trả về từ các job subHost_jobs và
lưu trữ chúng xuống cơ sở đữ liệu.
Sau khi đã lưu dữ liệu bao gồm cổng va dịch vụ đang hoạt động của hệ thống xuống cơ sở dữ liệu, chương trình thực hiện:
¢ Chương trình truy vấn cơ sở đữ liệu để lay các dữ liệu bao gồm: tên miền
con và các địa chỉ IP ứng với nó, địa chỉ IP và các cổng đang mở.
° Dựa trên dữ liệu về địa chỉ IP và các cổng đang mở, chương trình sử dụng
công cụ HTTPX để xác định xem cổng đó có phải đang chạy một ứng dụng web hay không, và nếu có, liệu ứng dụng đó sử dụng giao thức HTTPS hay
HTTP
Bây giờ, chương trình đã có danh sách các đường dẫn URL, nó tiến hành tạo ra 5 job mới với mỗi đường dẫn URL với mục đích tìm kiếm các lỗ hổng bảo mật (như
Hình :
1. Nuclei: Tại đây, chương trình thực thi công cu nuclei, ghi kết quả vào một
tệp tạm rồi đọc nó và trả về kết quả:
def run(self) : print("Nuclei scan: ", self.urls)
outfile =f£"TEMPLATES-FILE"
cmd =f"nuclei -silent -u {self.urls} -t TEMPLATES-PATH -no-color -je
{outfile}"
proc =subprocess.Popen(
shlex.split(cmd),
stderr=subprocess.DEVNULL,
stdout=subprocess.PIPE)
try:
stdout, stderr =proc.communicate()
except Exception as e:
proc.kill() raise (e)
if os.path.isfile(outfile):
return json.load(open(outfile, "r")) return []
71
Chương 5. Hiện thực và Thực nghiệm
2. Các job SQli, XSS, OS-Injection, LFI: Các job này có chung luồng hoạt động
như Hình|4.5
e Chương trình tìm các đường dẫn bằng cách sử dụng công cụ dirsearch
và gospider:
def run(self):
if exists(f"CACHE-FILE"):
return 1
cmd =f"python3 Modules/Webs/dirsearch/dirsearch.py -u {self.url}
--format plain -o CACHE-FILE -i 200"
process =subprocess.Popen(cmd, shell=True, stdout=open(os.devnull,
tự)
process.wait ()
def run(self):
cmd =f"~/go/bin/gospider -s {self.target_urls} -o .cache/web/
-c 10 -d 3 -q"
print (cmd) process =subprocess.Popen(cmd,
shell=True,
stdout=subprocess.PIPE) process.wait()
® Sau khi có các thư mục trên trang web, tiến hành tìm kiếm các đối số
đầu vào bằng cách phân tích các thẻ form và thẻ <a>:
forms =sourp.findAl1('form')
for form in forms:
temp ={}
temp["ur1"] =url if (str(form.get ("action") )=="#" or
str(form.get ("action") )=="" or str (form. get ("action") )=="None")
else
urljoin(url, str(form.get("action")))
if not temp["url"].startswith("http"):
temp["url"] =self.nomal_url(temp["url"] ) temp["method"] =form.get("method") and
form.get ("method") or "GET"
72
Chương 5. Hiện thực và Thực nghiệm
temp["param_name"] =[]
inputs =form.findAll("input") button =form.find("button")
if button:
temp ["param_name"] .append(button. get ("name") ) for i in range(len(inputs)):
temp ["param_name "] .append (inputs [i] .get ("name") ) temp["param_name"] =[i for i in temp["param_name"] if i !=None] temp ["param_name"] .sort ()
data.append(str (temp) )
def parse_link(self,sourp): # parse link in tag a
links =sourp.findAl1("a"
path = []
for link in links:
1 =link.get("href")
if 1:
if "=" not in l1:
continue
if not 1.startswith("http"):
if 1.startswith("mailto: "):
continue
1 = parse.urlparse(self.url).scheme +
"://"+parse.urlparse(self.url).netloc +
"/" +1
1 =self.nomal_ur1(1) path.append (1)
return self.parse_href (path)
def parse_href (self,data) : final =[]
for i in data:
href ={}
u =i.split("?") [0]
method ="get"
params =i.split("?") [1] .split("&") param =[j.split("=")[0] for j in params]
href ["url"] =u href ["method"] =method href ["param_name"] =param
73
Chương 5. Hiện thực và Thực nghiệm
final.append(str (href))
return final
® Sau khi đã có các thư mục và các đối số đầu vào tương ứng, chương
trình sẽ kiểm tra các lỗ hổng bảo mật (mỗi job kiểm tra một loại lỗ
hổng bảo mật) bằng cách lần lượt đưa các tải trọng vào các đối số đầu vào và quan sát hành vi của máy chủ để xác định xem máy chủ có ton tại lỗ hổng hay không. Ví du, job LEI có nhiệm vụ tìm kiếm các 16 hổng LEI, chương trình đưa vào các trọng tải với mong muốn đọc tệp
/etc/passwd:
self.payload =[
h,./../../../../../../../../../../../../../etc/passwd",
"/proc/self/root/etc/passwd",
"/,./.,./../../../../../../etc/passwd"]
Với hành vi đọc tệp của lỗ hổng LFI, để xác định xem máy chủ có chứ lỗ hổng LFI hay không, chương trình sẽ kiểm tra xem phản hồi của máy
chủ có chứa chuỗi "root :x:0:0:root" hay không.