極客大賽的碎碎念

春告鳥發表於2023-02-27

公司的應屆生都會參加極客大賽,簡單來說就是會給出各個部門根據自身業務而出的題目,參賽者從題目組裡面選擇一個自己感興趣的題目進行參賽,選擇同個題目的人就自動歸為一組進行團體賽,團隊的最大人數是八人

我最開始選擇的題目是 漏洞利用攻擊檢測-0day/Nday漏洞利用攻擊檢測方案。蒽,結果比賽負責人說這個題目只有我一個人選orz,重新考慮了一下之後去了 漏洞研究-數網知來:重歷經典漏洞的挖掘與利用歷程,雖然團隊加上我也只有三個人(人少不好摸魚

為了做一個能夠進行演示的demo,我們考慮做一個漏洞知識庫+一鍵復現的靶場平臺,團隊的專案經理主要負責專案彙報和節點的把控,星哥進行漏洞復現,文件編寫以及靶場環境的準備,我主要基於MrDoc魔改搭建知識庫平臺

MrDoc : https://github.com/zmister2016/MrDoc

先把MrDoc部署一下,分為了docker部署和原始碼部署

docker部署

ubuntu上進行docker一鍵搭建

出現報錯

INSTALLED_EXTENSIONS = metadata.entry_points().get('markdown.extensions', ())

修改requirements.txt Markdown 的版本為 3.1.1

修改後重新docker-compose up執行成功,因為埠對映的原因,實際上執行在本地8080埠

原始碼部署

魔改的話還是得進行本地的原始碼部署

準備環境

  • python3

  • pycharm

  • 順帶把虛擬環境弄一下了,防止包混亂

pip安裝包

pip install -r requirements.txt

驗證一下Django是否成功安裝

初始化資料庫

生成資料庫遷移

python manage.py makemigrations 

出現關於pymysql的報錯

pip install PyMySQL==0.10.1

重新執行出現新報錯

pip install mammoth

安裝後重新執行,出現報錯

django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on 'mrdoc-mysql' ([Errno 11001] getaddrinfo failed)")

說明沒有連線到資料庫,檢查了一會檔案結構發現配置檔案在config目錄下的config.ini檔案中,修改其中資料庫的相應配置即可

[database]
# engine,指定資料庫型別,接受sqlite、mysql、oracle、postgresql
engine = mysql

# name表示資料庫的名稱
name = mrdoc 

# user表示資料庫使用者名稱
user = root

# password表示資料庫使用者密碼
password = root

# host表示資料庫主機地址,如果mysql是容器,要填容器的名字
host = 127.0.0.1

# port表示資料庫埠
port = 3306

去mysql裡面新增一個mrdoc資料庫

重新執行 python manage.py makemigrations 就沒有報錯了

執行 python manage.py migrate,出現新的報錯

django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table ((1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(6) NOT NULL)' at line 1"))

報錯原因是Django2.1不再支援MySQL5.5,必須5.6版本以上

檢查我本地MySQL版本確實是5.5

phpmystudy mysql降版本還是比較麻煩,所以考慮降級django到2.0.0

pip install Django==2.0.0

雖然提醒我們可能會有複雜的依賴問題,但是本著沒有出現問題就沒有問題的原則,當作沒有看見

重新執行 python manage.py migrate 即成功

檢查資料庫

資料庫的初始化就完成了

建立管理員賬戶

初始化完資料庫之後,需要建立一個管理員賬戶來管理整個Mrdoc,執行python manage.py createsuperuser

賬號密碼當然用最簡單的:admin/admin123456

測試執行

執行 python manage.py runserver

瀏覽器訪問 http://127.0.0.1:8000/

在終端可以看到訪問的介面日誌

管理員後臺

我還找了半天是哪個介面管理員登入,發現原來和普通使用者是一樣的,在管理員後臺可以對整站進行管理,因為普通使用者的功能只是管理員的子集,所以我們們直接在管理員的基礎上進行功能開發和實現,如果需要的話將對應的功能遷移到普通使用者和遊客身上去

到此為止實際上知識庫的部分只需要填充文字就行了,現在需要考慮怎麼跟靶場環境結合起來

連線靶場

想要點選啟動靶場的時候,前端透過websocket連線到後端,後端連線到docker靶場,前端介面作為一個偽終端,使用者在前端執行的命令能夠傳輸到docker命令介面中,命令執行的結果回顯在瀏覽器介面上

後端與docker連線

因為後端是python寫的,這一步很容易實現

這裡使用paramiko庫中,基於使用者名稱和密碼的 transport 方式登入

安裝paramiko

pip install paramiko

transport方式登入類似於python 使用session去保持請求,可以複用連線,執行多條命令,比如執行命令、上傳/下載檔案等

一個例項程式碼如下

import paramiko
 
# 建立連線
trans = paramiko.Transport(("xx.xx.xx.xx", 22))
trans.connect(username="root", password="you_passwd")
 
# 將sshclient的物件的transport指定為以上的trans
ssh = paramiko.SSHClient()
ssh._transport = trans
 
# 剩下的就和上面一樣了
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("ls -l")
print(ssh_stdout.read())
 
# 關閉連線
trans.close()

使用AWDDocker測試一下 https://github.com/Cl0udG0d/AWDDocker

訪問127.0.0.1:8000

測試用例

import paramiko

def test():

    # 建立連線
    trans = paramiko.Transport(("127.0.0.1", 8001))
    trans.connect(username="ctf", password="test123")

    # 將sshclient的物件的transport指定為以上的trans
    ssh = paramiko.SSHClient()
    ssh._transport = trans

    # 剩下的就和上面一樣了
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("ls")
    print(str(ssh_stdout.read(),encoding = "utf-8") )

    # 關閉連線
    trans.close()


if __name__ == '__main__':
    test()

檢視輸出,因為用的python3.6的原因,會有一個警告,暫時先不管了

前端與後端連線

目的是

在瀏覽器前端模擬Linux終端命令列介面

當然這裡我們並不是單純的模擬,而是需要真正跟Linux進行互動

經過調研後發現可以使用xterm.js來實現這個目標

但是這裡需要使用npm安裝

npm install xterm

因為在這裡我使用的是原生的前端,使用這種方式對我來說過於龐雜了,在github上面翻到了另外一個專案

裡面有安裝編譯後的xterm.js檔案

原來的這個專案使用有點問題,重新fork了一份進行魔改

安裝

專案下載安裝

git clone https://github.com/Cl0udG0d/websocket_terminal
cd websocket_terminal/server-python3
pip3 install -r requirements.txt

預備

這裡我們先不執行指令碼,而是先在本地使用docker起一個能夠ssh連結的模擬伺服器,這裡使用以前的一個專案

git clone https://github.com/Cl0udG0d/AWDDocker

cd AWDDocker/web_1_example

docker-compose up -d

可以訪問 http://127.0.0.1:8000/ 檢視是否搭建成功

ssh的賬號密碼是 ctf/test123

ssh的埠對映為8001

修改server.py裡面ssh的埠為8001

執行web伺服器,這裡的伺服器後端是flask,連線伺服器ssh的方式是websocket或者原始的tcp

python3 websocket_terminal.py

改錯

瀏覽器訪問網址出現報錯

http://127.0.0.1:5002/?kind=ssh&username=ctf&password=test123

修改server.py檔案獲取引數的方式

重新訪問即可

可以看到這裡已經成功連結了伺服器ssh

然後遇到了第二個問題,我們在介面上輸入內容沒有顯示 orz

在script.js檔案裡面新增一行

現在輸入就能夠回顯在介面上了

然後又出現了回車之後游標直接到了行首這個問題

給哥們搞沉默了

在這篇文章中有回車返回行首的解決辦法 https://juejin.cn/post/6918911964009725959,但是處理方法比較複雜

切換demo

重新在github上尋找使用了xtermjs的專案,想要找一個已經實現、拿來簡單修改就可用的,發現了這個

https://github.com/cs01/pyxtermjs

嘗試安裝執行一下這個專案

pip install -r requirements.txt

又是Windows和Linux的環境差異問題

參考 - https://blog.csdn.net/weixin_53660567/article/details/124929468

定位到報錯這一行,直接註釋掉

一頓改完之後又出現了新的問題

猜測不可能只有我一個人遇到這個問題,檢視專案ISSUE

同樣的問題 https://github.com/cs01/pyxtermjs/issues/25

該專案目前僅支援類UNIX系統

替換方案

試了這麼久好像還是不行,雖然我自己可以實現一個簡單的web前端介面,但是隻能支援簡單的命令,比如 ls 、ps、whoami這種單次回顯的,對於互動比較複雜的top、vim就無能為力了

繼續搜尋之後發現了webssh https://github.com/huashengdun/webssh

沒想到這個專案異常好用,直接實現了我想要的功能,只需要簡單改一下連線伺服器的方式,從表單填寫修改為把密碼直接透過GET或者POST方式進行傳輸即可

最後

然後就是在這個基礎上進行了一些完善和美化,包括實現了一個演示的大屏介面,裡面還填充了一個透明的3D詞雲(忽悠領導專用),對上傳的dockerfile進行安全掃描等等

其中我們的專案經理還被裁了orz,本就人少的團隊雪上加霜,所以自己不僅要改程式碼還需要修改PPT了。後面又因為工作上的事情轉移了自己大部分的精力,本來還以為能夠拿一等獎,最後在決賽又墊底了

技術宅拯救不了世界了 ?

END

建了一個微信的安全交流群,歡迎新增我微信備註進群,一起來聊天吹水哇,以及一個會發布安全相關內容的公眾號,歡迎關注 ?

GIF GIF

相關文章