<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    【白帽故事】打造一款多線程目錄爆破掃描器

    VSole2022-03-04 12:35:33

    聲明:文章中涉及的程序(方法)可能帶有攻擊性,僅供安全研究與教學之用,讀者將其信息做其他用途,由用戶承擔全部法律及連帶責任,文章作者不承擔任何法律及連帶責任。

    背景介紹:

    今天的分享來自國外一位ID為Mayank Pandey的白帽子,他分享了使用Python多線程功能打造的一款多線程網站目錄爆破掃描器。廢話不多說,上代碼(代碼很少,100行不到):

    from threading import Threadimport time,requests,sys,os.path
    def usage():    print("----------USAGE INSTRUCTION ---------")    print(f"{sys.argv[0]} URL WORDLIST NUMBER_OF_THREADS(Default is 10)")    sys.exit()
    def prepare(myList,numOfChunks):    for i in range(0, len(myList), numOfChunks):        yield myList[i:i + numOfChunks]
    def brute(myList,url):    start=time.perf_counter()    for lists in myList:        threads.append(Thread(target=worker,args=(lists,url),daemon=True))    for thread in threads:        try:            thread.start()        except KeyboardInterrupt:            print("Received Keyboard Interrupt  , Terminating threads")            sys.exit()    for thread in threads:        try:            thread.join()        except KeyboardInterrupt:            print("Received Keyboard Interrupt  , Terminating threads")            sys.exit()    finish=time.perf_counter()    print(f"\t\t Checked {total_len} Directories in {round(finish-start,2)} Seconds")
    def worker(lists,url):    try:        for word in lists:            if word.startswith("/"):                word=word[1:]            url2=url+"/"+word.strip()            r=requests.get(url2)            if str(r.status_code) in match:                print(f"/{word.strip():<40}  [ Status: {r.status_code}  Length:{len(r.content)} ]")    except KeyboardInterrupt:        print("Received Keyboard Interrupt  , Terminating threads")        sys.exit()    except Exception as e:        print(f"An error Occurred : {e}")        sys.exit()
    if __name__ == "__main__":    try:            match=['200','301','302','401','403','429'] #change this to filter responses        try:            if sys.argv[1]:                url=sys.argv[1]            if sys.argv[2]:                wordlist=sys.argv[2]            try:                if sys.argv[3]:                    numOfThreads=int(sys.argv[3])            except:                numOfThreads=10        except:            usage()        if os.path.isfile(wordlist)==False:            print(f"The file {wordlist} doesn't exist")            sys.exit()        with open(wordlist,'r') as w:            myList=w.readlines()        total_len=len(myList)        final=[]        threads=[]        if numOfThreads>total_len or numOfThreads<0:            print("Too High Value for Threads with Respect to Input Word-list")            sys.exit(1)        numOfChunks=len(myList)//numOfThreads        if url.endswith("/"):            url=url[0:-1]        print(f'''        ======================================        URL           --> {url}        Word-list     --> {wordlist}        Threads       --> {numOfThreads}        Status Codes  --> {','.join([w for w in match])}        ======================================                    ''')        print("------- Started Brute forcing Directories -------")        myList_new=prepare(myList,numOfChunks)        brute(myList_new,url)    except Exception as e:        print(f"An error Occurred : {e}")        sys.exit()
    

    代碼詳解:

    導入和使用詳細信息:

    from threading import Threadimport time,requests,sys,os.path def usage():        print("----------USAGE INSTRUCTION ---------")        print(f"{sys.argv[0]} URL WORDLIST NUMBER_OF_THREADS")        sys.exit()
    

    這一段代碼主要是導入線程和相關模塊,Usage()函數向用戶展示了如何使用程序,它在命令行參數不足時會被觸發。

    分塊處理:

    def prepare(myList,numOfChunks):        for i in range(0, len(myList), numOfChunks):            yield myList[i:i + numOfChunks]
    

    該函數是線程數發揮作用的主要地方,利用它對主列表進行分塊處理。

    多線程邏輯:

    def brute(myList,url):    start=time.perf_counter()    for lists in myList:        threads.append(Thread(target=worker,args=(lists,url),daemon=True))    for thread in threads:        try:            thread.start()        except KeyboardInterrupt:            print("Received Keyboard Interrupt  , Terminating threads")            sys.exit()    for thread in threads:        try:            thread.join()        except KeyboardInterrupt:            print("Received Keyboard Interrupt  , Terminating threads")            sys.exit()    finish=time.perf_counter()    print(f"\t\t Checked {total_len} Directories in {round(finish-start,2)} Seconds")
    def worker(lists,url):    try:        for word in lists:            if word.startswith("/"):                word=word[1:]            url2=url+"/"+word.strip()            r=requests.get(url2)            if str(r.status_code) in match:                print(f"/{word.strip():<40}  [ Status: {r.status_code}  Length:{len(r.content)} ]")    except KeyboardInterrupt:        print("Received Keyboard Interrupt  , Terminating threads")        sys.exit()    except Exception as e:        print(f"An error Occurred : {e}")        sys.exit()
    

    上面定義了兩個函數brute()和worker(),線程會從brute()函數開始,worker()函數將負責處理請求。

    threads.append(Thread(target=worker,args=(lists,url),daemon=True))
    

    從分塊列表中提取列表,并使用它啟動Thread。

    線程將以Worker函數作為目標,這些函數將被附加到包含所有線程的列表中,在此之后,將啟動并關聯所有線程。

    for thread in threads:      thread.start()        for thread in threads:            thread.join()
    

    thread.start():

    創建線程實例時,它并不會立即執行,所以需要調用它的start()方法。一旦啟動,線程將獨立運行,直到目標函數返回。

    thread.join():

    在調用join()方法時,調用線程會被阻塞,直到終止線程對象(在其上調用線程),線程對象會在以下任何一種情況下終止:

    • 正常情況
    • 處理一個不當的異常時
    • 發生超時

    這有助于所有線程完成其工作并正常退出。

    在Worker方法關閉(所有線程都關閉)之后,控制將返回到brute()函數,然后繼續接下來正常的程序流程。

    大概就是這樣,使用Python的多線程創建一個簡單的掃描工具,但是請記住不要使用太多的線程來運行你的程序,因為一旦處理不當,可能會導致其它程序的崩潰。

    當然這個掃描器的代碼目前已經放在Github上

    線程多線程
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    Java 8 的內存結構
    2022-03-10 14:37:13
    java8內存結構圖虛擬機內存與本地內存的區別Java虛擬機在執行的時候會把管理的內存分配成不同的區域,這些
    Java線程安全:狹義地認為是多線程之間共享數據的訪問。 Java語言中各種操作共享的數據有5種類型:不可變、絕對線程安全、相對線程安全、線程兼容、線程獨立
    任務的狀態保存及再加載, 這段過程就叫做上下文切換。上下文切換會導致額外的開銷,常常表現為高并發執行時速度會慢串行,因此減少上下文切換次數便可以提高多線程程序的運行效率。在這種機制下,一個線程的堵塞不會導致整個進程堵塞。當CPU接收到中斷請求時,會在正在運行的程序和發起中斷請求的程序之間進行一次上下文切換。高并發,低耗時的情況,建議少線程
    前兩天做了一個導入的功能,導入開始的時候非常慢,導入2w條數據要1分多鐘,后來一點一點的優化,從直接把list懟進Mysql中,到分配把list導入Mysql中,到多線程把list導入Mysql中。 時間是一點一點的變少了。非常的爽,最后變成了10s以內。 下面就展示一下過程。
    通過Scala對文件進行讀寫操作在實際業務中應用也比較多,這里介紹幾種常用的方式,直接上代碼:1.從文件中讀取內容object Main {. 但是ArrayBuffer 進行添加元素時,使用方法:+=。= new ArrayBuffer[Int],索引容量情況:下當array長度為1,但大小0已經大于16,并且array沒有及時擴展時,會報越界。
    聲明:文章中涉及的程序(方法)可能帶有攻擊性,僅供安全研究與教學之用,讀者將其信息做其他用途,由用戶承擔全部
    多線程是Java的一個難點,但是它也很有趣,聽說玩得溜得起飛的人,人生都開啟多線程模式了…
    ArrayList是線程不安全的,于是JDK新增加了一個線程并發安全的List——CopyOnWriteList,中心思想就是copy-on-write,簡單來說是讀寫分離:讀時共享、寫時復制(原本的array)更新(且為獨占式的加鎖),而我們下面分析的源碼具體實現也是這個思想的體現。 繼承體系:
    Carbon Black的安全研究人員在周三的一份報告中說,一種名為Conti的勒索病毒正在使用多達32個并行CPU線程來對受感染計算機上的文件進行加密,以達到極快的加密速度。Conti只是今年發現的一系列勒索軟件中最新的一種。安全研究人員于今年 2 月初首次發現了Conti開發人員,但是Carbon Black現在報道其TAU 發現了Conti感染。Carbon Black的TAU在周三發布的技術報告中說,在分析Conti代碼時突出的項目是對多線程操作的支持。
    介紹一個好用的web信息收集工具 其功能包括: 子域名收集 多線程子域名爆破 指紋信息收集 備案信息收集 批量子域名收集和批量子域名爆破 是一款挖掘SRC的實用小工具
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类