淺談現(xiàn)代化指紋識別及工具編寫

前言

對于龐大的網(wǎng)絡(luò)空間來說搭综,存在著各式各樣的應(yīng)用、設(shè)備等等資產(chǎn)皱炉,而對這些資產(chǎn)進(jìn)行識別,無論拿來做掃描器還是批量分析狮鸭,都是非常有價(jià)值的合搅,高效的應(yīng)用指紋識別是一個(gè)長久可研究的課題多搀,本文主要探討如何建立高效可靠的指紋識別方法。

傳統(tǒng)的指紋識別

一些掃描器里面使用的比較多的都是通過特殊路徑 靜態(tài)文件的md5 值或者大小 關(guān)鍵詞等灾部,例如使用比較廣泛的一個(gè)指紋數(shù)據(jù)庫 酗昼。

img

存在幾個(gè)問題

  1. 效率太低,每一個(gè)路徑都需要訪問一次梳猪。容易被waf攔截
  2. 目前很多網(wǎng)站的靜態(tài)資源 cdn于gzip 壓縮麻削,md5 其實(shí)是不一樣的 ,識別率很低

現(xiàn)代化指紋識別

怎么來快速的精確的指紋識別春弥,觀察了大部分的web系統(tǒng)發(fā)現(xiàn)呛哟,訪問首頁并且獲取response header 能識別出80% 的app
例如WordPress,discuz 會把獨(dú)特的cookie放到header 里面匿沛。
discuz 的關(guān)鍵詞 _saltkey=


img

默認(rèn)首頁也會有很多固定的關(guān)鍵詞扫责, WordPress wp-conetnt


img

剩下的指紋再去特殊url提取,這樣效率和準(zhǔn)確率會提高很多很多逃呼。

現(xiàn)代化指紋識別方案

指紋庫設(shè)計(jì)

數(shù)據(jù)庫結(jié)構(gòu)

[圖片上傳失敗...(image-7b51e8-1532176739869)]
指紋庫類型目前有3種 鳖孤,當(dāng)然后續(xù)還需要加上正則。
finger 規(guī)則是一個(gè) string 之后的python 字典,里面有例如狀態(tài)嗎,規(guī)則等字段,例如 weblogic 的指紋規(guī)則

{'port':7001,'url': '/console/login/LoginForm.jsp', 'code': 200, 'grep': 'WebLogic Server'}

下面介紹每一種指紋庫實(shí)例

指紋規(guī)則

web_header_contain

首頁 response 里面的 header 查找特征符
速度最快,優(yōu)先極最高抡笼。很多web cms 都會寫特殊的cookie 鍵值苏揣。
例如 discuz,jboss,wordpress 等。
規(guī)則編寫,以discuz 為例

?  tools  curl  -I    www.cctry.com
HTTP/1.1 200 OK
Server: Microsoft-IIS/6.0
Connection: keep-alive
Date: Thu, 07 Jan 2016 18:22:34 GMT
Content-Type: text/html; charset=gbk
Content-Length: 0
X-Powered-By: PHP/5.2.17
Set-Cookie: Vguy_2132_saltkey=O6srsEYk; expires=Sat, 06-Feb-2016 18:22:22 GMT; path=/; httponly
Set-Cookie: Vguy_2132_lastvisit=1452187342; expires=Sat, 06-Feb-2016 18:22:22 GMT; path=/
Set-Cookie: Vguy_2132_sid=MwE6e0; expires=Fri, 08-Jan-2016 18:22:22 GMT; path=/
Set-Cookie: Vguy_2132_lastact=1452190942%09index.php%09; expires=Fri, 08-Jan-2016 18:22:22 GMT; path=/
X-Daa-Tunnel: hop_count=1

經(jīng)過分析,字符串 _saltkey= 為discuz header 中的規(guī)則
具體規(guī)則如下
[圖片上傳失敗...(image-9dae8f-1532176739869)]

web_index_contain

在緩存的首頁里面查找關(guān)鍵詞或者正則匹配
優(yōu)先級次之,只需要 get請求一次即可推姻。
例如Office Anywhere 指紋 編寫流程
數(shù)據(jù)包分析

?  tools  curl  http://125.91.218.186:8000/   |  grep   '/images/tongda.ico'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2001  100  2001    0     0  11795      0 --:--:-- --:--:-- --:--:-- 11840
<link rel="shortcut icon" href="/images/tongda.ico">

規(guī)則編寫
[圖片上傳失敗...(image-a6e555-1532176739869)]

web_url_contain

特殊url 查找指定的關(guān)鍵詞(返回狀態(tài)碼也指定)平匈。
優(yōu)先級最低。
例如 weblogic 的指紋 finger 過程
數(shù)據(jù)包分析

?  tools  curl  -I     http://202.97.194.9:7001/console/login/LoginForm.jsp
HTTP/1.1 200 OK
Cache-Control: no-cache
Date: Thu, 07 Jan 2016 18:53:28 GMT
Pragma: no-cache
Content-Type: text/html; charset=UTF-8
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: ADMINCONSOLESESSION=XQXrWT0LQTvpf8Jv75nMnQB9vN0cGppy7bTfJxfH9S673VTGP1Wl!1715621632; path=/
Content-Language: zh-CN
X-Powered-By: Servlet/2.5 JSP/2.1

規(guī)則

{'url': '/console/login/LoginForm.jsp', 'code': 200, 'grep': 'WebLogic Server'}


[圖片上傳失敗...(image-524889-1532176739869)]

程序編寫

指紋識別模塊代碼

# coding:utf-8
"""
 *@Projet  Yafinger
 *@Author  yaseng@uauc.net
 *@Desc    playweb finger modules
"""
import ast,time
import config
from   lib                import util

def get_web_app(url):
    rsp_index = util.http_get(url)
    str_index = ""
    if rsp_index == None :
        return None
    list_app=[]
    fingers=config.get('fingers');
    for  finger  in   fingers :
        rule = ast.literal_eval(finger['finger'])
        if finger['type'] == 'web_index_contain': 
            # limit header and  body and code  exp : {'header':'jsessionid=','code': 200, 'grep': '.action'}
            if rule.has_key('header') and  rule['header'] not in   str(rsp_index['headers']).lower()  : 
                continue
            if rsp_index['code'] == rule['code'] and  rule['grep']  in rsp_index['data'] :
                list_app.append({'app_id':finger['id'], 'url':url})
                util.log("url:%s app:%s" % (url, finger['app_name']))
    
        elif finger['type'] == 'web_url_contain' :
             rsp_tmp = util.http_get(url + rule['url'])
             if rsp_tmp == None :
                 continue
             if rsp_tmp['code'] == rule['code'] and  rule['grep']  in rsp_tmp['data'] :
                 list_app.append({'app_id':finger['id'], 'url':url})
                 util.log("url:%s app:%s" % (url + rule['url'], finger['app_name']))
        elif  finger['type'] == 'web_header_contain' :

            if  rule['grep']  in  str(rsp_index['headers']).lower() :
                list_app.append({'app_id':finger['id'], 'url':url})
                util.log("url:%s app:%s" % (url , finger['app_name']))
                        
            
        time.sleep(0.01)
    return  list_app

單獨(dú)識別

簡單調(diào)用指紋識別模塊代碼

# coding:utf-8
"""
 *@Projet  Yafinger
 *@Author  yaseng@uauc.net
 *@Desc    yafinger test 
     __    __            ___                                         
    /\ \  /\ \         /'___\  __                                    
    \ `\`\\/'/   __   /\ \__/ /\_\     ___       __       __   _ __  
     `\ `\ /'  /'__`\ \ \ ,__\\/\ \  /' _ `\   /'_ `\   /'__`\/\`'__\
       `\ \ \ /\ \L\.\_\ \ \_/ \ \ \ /\ \/\ \ /\ \L\ \ /\  __/\ \ \/ 
         \ \_\\ \__/.\_\\ \_\   \ \_\\ \_\ \_\\ \____ \\ \____\\ \_\ 
          \/_/ \/__/\/_/ \/_/    \/_/ \/_/\/_/ \/___L\ \\/____/ \/_/ 
                                                 /\____/             
                                                 \_/__/ 
"""
import   os, time, sys, Queue, threading, ast
import config
from   lib                import util
from   lib.db             import *
from   optparse           import OptionParser
from   modules            import finger

if __name__ == "__main__":
    usage= '''%prog --host  host --port  port --finger  <all|app_name>   \r\nExample:%prog  --url  http://127.0.0.1    --finger phpmyadmin  '''
    parser = OptionParser(usage=usage)
    parser.add_option("-u", "--url", dest="url", help="target url")
    parser.add_option("-f", "--finger", dest="finger", help="finger_db app_name,default all ", default="all")
    options, arguments = parser.parse_args()
    if options.url == None :
        parser.print_help() 
        exit(0)
    db = MySQL(config.db_config)
    sql_finger_where=' '  if options.finger == 'all' else "  and  app_name='%s' "  % options.finger
    db.query("SELECT  * from  pw_finger_db  where  `enable`=1   %s "  % sql_finger_where)
    fingers = db.fetch_all()
    if len(fingers) == 0 :
        util.log('finger app_name %s not found' % options.finger ,3,'finger') 
    config.set("fingers",fingers)
    util.log("load fingers count %d" % len(fingers),1,'finger')
    finger.get_web_app(options.url)

img

批量識別

可以使用線程池來實(shí)現(xiàn)批量指紋識別藏古。

指紋結(jié)果

融合到系統(tǒng)中指紋保存在數(shù)據(jù)庫中增炭,本模塊可以快速整合到掃描器或者其他項(xiàng)目中。

yafinger

yet another web fingerprinter
https://github.com/yaseng/yafinger

issue

  1. 指紋庫需要補(bǔ)充
  2. 可以不局限于web指紋
  3. 某些情況可能目前的指紋規(guī)則不符合拧晕,還需要添加新的指紋規(guī)則隙姿,例如正則
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市厂捞,隨后出現(xiàn)的幾起案子输玷,更是在濱河造成了極大的恐慌,老刑警劉巖蔫敲,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饲嗽,死亡現(xiàn)場離奇詭異炭玫,居然都是意外死亡奈嘿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門吞加,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裙犹,“玉大人尽狠,你說我怎么就攤上這事∫镀裕” “怎么了袄膏?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長掺冠。 經(jīng)常有香客問我沉馆,道長,這世上最難降的妖魔是什么德崭? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任斥黑,我火速辦了婚禮,結(jié)果婚禮上眉厨,老公的妹妹穿的比我還像新娘锌奴。我一直安慰自己,他們只是感情好憾股,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布鹿蜀。 她就那樣靜靜地躺著,像睡著了一般服球。 火紅的嫁衣襯著肌膚如雪茴恰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天斩熊,我揣著相機(jī)與錄音琐簇,去河邊找鬼。 笑死座享,一個(gè)胖子當(dāng)著我的面吹牛婉商,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播渣叛,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼丈秩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了淳衙?” 一聲冷哼從身側(cè)響起蘑秽,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎箫攀,沒想到半個(gè)月后肠牲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡靴跛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年缀雳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梢睛。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肥印,死狀恐怖识椰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情深碱,我是刑警寧澤腹鹉,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站敷硅,受9級特大地震影響功咒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绞蹦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一航瞭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坦辟,春花似錦刊侯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挪蹭,卻和暖如春亭饵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梁厉。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工辜羊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人词顾。 一個(gè)月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓八秃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肉盹。 傳聞我的和親對象是個(gè)殘疾皇子昔驱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,979評論 3 119
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理上忍,服務(wù)發(fā)現(xiàn)骤肛,斷路器,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 下班回家吃完飯窍蓝,和爍媽帶著大爍轉(zhuǎn)了一大圈腋颠,小伙子感覺挺美的
    易如人生閱讀 97評論 0 0
  • 那是一個(gè)夏日午后淑玫,天氣太熱了,天空卻藍(lán)的出奇琼掠,知了不停地叫右莱,吵得人很煩廓译。我坐在小鎮(zhèn)唯一的咖啡館里,卻喝著喜歡的冰橘...
    透明的橙閱讀 134評論 1 4