<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

    Python實現Awvs自動化掃描

     最近再做一個python的小程序,主要功能是實現Acuenetix Web Vulnerability Scanner的自動化掃描,批量對一些目標進行掃描,然后對掃描結果寫入mysql數據庫。寫這篇文章,分享一下一些思路。
      程序主要分三個功能模塊,Url下載、批量掃描、結果入庫,
      有一個另外獨立的程序,在流量鏡像服務器上進行抓包,抓取Http協議的包,然后對包進行篩選處理,保留一些帶有各種參數的url,然后對url進行入庫。url下載功能主要是從mysql數據庫中下載url。
      批量掃描功能主要調用了Awvs的命令行wvs_console.exe,調研的時候先是嘗試用awvs計劃任務來實現批量掃描,但是發現在將一些awvs設置發包給計劃任務的時候會遇到各種困難,計劃任務貌似也不是一個網頁,采用的是XML模版,技術有限,最后沒實現,只好放棄。
      之后發現Awvs支持命令行,wvs_console.exe就是主程序,有很多命令參數,基本能實現Awvs界面操作的所有功能。批量掃描主要是讀取下載到本地的url,進行逐一掃描。要將掃描結果保存到本地access數據庫文件,需要使用savetodatabase參數。
      Awvs會自動將掃描結果保存到本地的access數據庫中,具體的表是Wvs_alerts,也可以設置保存到Mssql數據庫中,具體的是在Application Setting進行設置。結果入庫模塊的功能是從access數據庫篩選出危害等級為3的漏洞,然后將它們寫入到mysql數據庫。主要用了正則表達式對request中的host,漏洞文件,get或post提交的請求進行篩選拼湊,獲取到完整的漏洞測試url。
      貼上代碼,很菜,代碼各種Bug,最主要的是程序的整個流程設計存在問題,導致后來被大佬給否掉了,沒有考慮到重復掃描和程序異常中止的情況,導致我的程序只能一直運行下去 ,否則重新運行又會從頭對url進行掃描。
      對此很郁悶,某天晚上下班回家想了想,覺得可以通過以下方法來解決以上兩個問題:
      Awvs掃描結果數據庫中有一個Wvs_scans表,保存的都是掃描過的url,以及掃描開始時間和結束時間。可以將當天下載的url保存到一個list中,然后在掃描之前先將之前所有掃描過的URL查詢出來,同樣保存在list中,讀取list中的url,判斷是否在掃描過的URL list中,如果存在將之從url list中刪除掉;如果不存在則再進行掃描。
      異常中止的話貌似只能增加系統計劃任務,每天結束再打開,不知道如何時時監視系統進程,通過是否存在wvs的進程來判斷。
      以上只是一個大概的程序介紹,貼上代碼,代碼可能存在一些問題,有興趣的童鞋去完善完善,大佬覺得我的效率和編碼能力有待提高,so,讓繼續學習,所以沒再繼續跟進這個項目。
      downurl.py 代碼:
    #coding:utf-8
    import MySQLdb
    import os,time,shutil
    import hashlib,re
    datanow=time.strftime('%Y-%m-%d',time.localtime(time.time()))
    #filetype='.txt'
    #urlfilename=datanow+filetype
    #path="D:\wvscan\url\\"
    #newfile=path+urlfilename
    datanow=time.strftime('%Y-%m-%d',time.localtime(time.time()))
    con=MySQLdb.Connect('10.1.1.1','root','12345678','wvsdb')
    cur=con.cursor()
    sqlstr='select url from urls where time like %s'
    values=datanow+'%'
    cur.execute(sqlstr,values)
    data=cur.fetchall()
    #將當天的URL保存到本地url.txt文件
    f=open(r'd:\Wvscan\url.txt','a+')
    uhfile=open(r'd:\Wvscan\urlhash.txt','a+')
    line=uhfile.readlines()
    #保存之前對url進行簡單的處理,跟本地的hash文件比對,確保url.txt中url不重復
    for i in range(0,len(data)):
    impurl=str(data[i][0]).split('=')[0]
    urlhash=hashlib.new('md5',impurl).hexdigest()
    urlhash=urlhash+'\n'
    if urlhash in line:
    pass
    else:
    uhfile.write(urlhash)
    newurl=str(data[i][0])+'\n'
    f.writelines(newurl)
    cur.close()
    con.close()
    抓包程序抓到的url可能重復率較高,而且都是帶參數的,保存到本地的時候截取了最前面的域名+目錄+文件部分進行了簡單的去重。Awvs可能不大適合這樣的方式,只需要將全部的域名列出來,然后逐一掃描即可,site Crawler功能會自動爬行。
      writeinmysql.py 結果入庫模塊,代碼:
    #coding:UTF-8
    import subprocess
    import os,time,shutil,sys
    import win32com.client
    import MySQLdb
    import re,hashlib
    reload(sys)
    sys.setdefaultencoding('utf-8')
    #需要先在win服務器設置odbc源,指向access文件。實際用pyodbc模塊可能更好一些
    def writeinmysql():
    conn = win32com.client.Dispatch(r'ADODB.Connection')
    DSN = 'PROVIDER=Microsoft Access Driver (*.mdb, *.accdb)'
    conn.Open('awvs')
    cur=conn.cursor()
    rs = win32com.client.Dispatch(r'ADODB.Recordset')
    rs.Open('[WVS_alerts]', conn, 1, 3)
    if rs.recordcount == 0:
    exit()
    #遍歷所有的結果,cmp進行篩選危害等級為3的,也就是高危
    while not rs.eof:
    severity = str(rs('severity'))
    if cmp('3', severity):
    rs.movenext
    continue
    vultype = rs('algroup')
    vulfile=rs('affects')
    #由于mysql庫中要求的漏洞類型和access的名稱有點差別,所以還需要對漏洞類型和危害等級進行二次命名,sql注入和xss為例
    xss='Cross site'
    sqlinject='injection'
    if xss in str(vultype):
    vultype='XSS'
    level='低危'
    elif sqlinject in str(vultype):
    vultype="SQL注入"
    level='高危'
    else:
    level='中危'
    #拼湊出漏洞測試url,用了正則表達式, post和get類型的request請求是不同的
    params = rs('parameter')
    ss = str(rs('request'))
    str1 = ss[0:4]
    if 'POST'== str1:
    requestType = 'POST'
    regex = 'POST (.*?) HTTP/1\.\d+'
    str1 = re.findall(regex, ss);
    else:
    requestType = 'GET'
    regex = 'GET (.*?) HTTP/1\.\d+'
    str1 = re.findall(regex, ss);
    regex = 'Host:(.*?)\r\n'
    host = re.findall(regex, ss);
    if host == []:
    host = ''
    else:
    host = host[0].strip()
    if str1 == []:
    str1 = ''
    else:
    str1 = str1[0]
    url =host + str1
    timex=time.strftime('%Y-%m-%d',time.localtime(time.time()))
    status=0
    scanner='Awvs'
    comment=''
    db = MySQLdb.connect(host="10.1.1.1", user="root", passwd="12345678", db="wvsdb",charset='utf8')
    cursor = db.cursor()
    sql = 'insert into vuls(status,comment,vultype,url,host,params,level,scanner) values(%s,%s,%s,%s,%s,%s,%s,%s)'
    values =[status,comment,vultype,'http://'+url.lstrip(),host,params,level,scanner]
    #入庫的時候又進行了去重,確保mysql庫中沒有存在該條漏洞記錄,跟本地保存的vulhash進行比對,感覺這種方法很原始。
    hashvalue=str(values[2])+str(values[4])+str(vulfile)+str(values[5])
    vulhash=hashlib.new('md5',hashvalue).hexdigest()
    vulhash=vulhash+'\n'
    file=open(r'D:\Wvscan\vulhash.txt','a+')
    if vulhash in file.readlines():
    pass
    else:
    file.write(vulhash+'\n')
    cursor.execute(sql, values)
    delsql='delete from vuls where vultype like %s or vultype like %s'
    delvaluea='Slow HTTP%'
    delvalueb='Host header%'
    delinfo=[delvaluea,delvalueb]
    cursor.execute(delsql,delinfo)
    db.commit()
    rs.movenext
    rs.close
    conn.close
    cursor.close()
    db.close()
    if __name_=='__main__':
    writeinmysql()
    time.sleep(10)
    #備份每天的掃描數據庫,用原始數據庫替換,方便第二天繼續保存。
    datanow=time.strftime('%Y-%m-%d',time.localtime(time.time()))
    filetype='.mdb'
    urlfilename=datanow+filetype
    path="D:\wvscan\databak\\"
    databakfile=path+urlfilename
    shutil.copyfile(r'D:\Wvscan\data\vulnscanresults.mdb',databakfile)
    shutil.copyfile(r'D:\Wvscan\vulnscanresults.mdb',r'D:\Wvscan\data\vulnscanresults.mdb')
      startwvs.py,掃描模塊,這個模塊問題較多,就是之前提到的,沒有考慮重復掃描和異常終止的問題,貼上代碼:
    #coding:utf-8
    import subprocess
    import os,time,shutil
    file=open(r"D:\Wvscan\url.txt","r")
    def wvsscan():
    for readline in file:
    url=readline.strip('\n')
    cmd=r"d:\Wvs\wvs_console.exe /Scan "+url+r" /SavetoDatabase"
    doscan=subprocess.Popen(cmd)
    doscan.wait()
    if __name__=='__main__':
    wvsscan()
    English »
     
    Text-to-speech function is limited to 100 characters

    posted on 2014-12-23 00:01 順其自然EVO 閱讀(1182) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

    <2014年12月>
    30123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲欧洲在线观看| 亚洲嫩模在线观看| 老牛精品亚洲成av人片| 97免费人妻无码视频| 亚洲免费一级视频| 美丽的姑娘免费观看在线播放| 亚洲宅男永久在线| 国产成人yy免费视频| 亚洲AV无码乱码在线观看代蜜桃 | 精品多毛少妇人妻AV免费久久| 亚洲AV无码专区日韩| 草久免费在线观看网站| 亚洲欭美日韩颜射在线二| 在线免费观看伊人三级电影| 亚洲成av人片天堂网| 中文字幕视频免费| 亚洲一线产品二线产品| www.亚洲色图| 久久这里只精品热免费99| 亚洲一级毛片免费在线观看| 大陆一级毛片免费视频观看| 成人a毛片视频免费看| 国产亚洲欧洲Aⅴ综合一区 | 天堂亚洲免费视频| 久热综合在线亚洲精品| 蜜臀98精品国产免费观看| 亚洲国产成人久久精品软件 | 亚洲AV福利天堂一区二区三| 国产免费不卡视频| 国产精品亚洲а∨无码播放不卡 | 亚洲欧洲国产经精品香蕉网| 午夜a级成人免费毛片| 2022国内精品免费福利视频| 亚洲AV无码成人精品区蜜桃| 最近免费中文字幕视频高清在线看 | 亚洲欧洲国产精品你懂的| 国产大片线上免费观看| 一级特黄a免费大片| 亚洲白嫩在线观看| 亚洲AV永久无码精品一区二区国产| 热99RE久久精品这里都是精品免费 |