思路分享 | 指纹考勤机实现远程打卡测试
0×00
指紋考勤機(jī)被越來越多的使用在企業(yè)中, 實(shí)現(xiàn)了人、地、時三者合一,為企業(yè)職員的出勤考察提供了極大的方便。在考勤機(jī)驗(yàn)證指紋成功的一瞬間,會向服務(wù)器發(fā)送一條職員打卡請求,然后服務(wù)器將打卡信息存入數(shù)據(jù)庫,這時人們通過瀏覽器就能瀏覽到你的考勤信息。那么,如果我們能把考勤機(jī)發(fā)送的這條“打卡請求”通過抓包的方式捕獲,然后在“適宜”的時間發(fā)送出去,是不是就可以實(shí)現(xiàn)打卡了。本文根據(jù)這個思路,進(jìn)行了一系列實(shí)驗(yàn)。
0×01
我們的最終目的就是獲取考勤機(jī)發(fā)送的數(shù)據(jù)包。為此我們進(jìn)行了如下實(shí)驗(yàn)。
首先考勤機(jī)沒有設(shè)置代理的功能,如果想捕獲考勤機(jī)發(fā)出的請求,首先想到的是ARP欺騙,但是既然我們能直接接觸到考勤機(jī),所以這里直接采取一個暴力的方法:先保證電腦和考勤機(jī)在同一個網(wǎng)段,使用USB網(wǎng)卡和一根網(wǎng)線將電腦和考勤機(jī)連接,為了保證考勤機(jī)能正常聯(lián)網(wǎng),還需要將USB網(wǎng)卡和能上網(wǎng)的網(wǎng)卡進(jìn)行橋接,此時考勤機(jī)可以正常聯(lián)網(wǎng)并且所有流量都會經(jīng)過電腦端。最后,電腦端開啟wireshark,選中USB網(wǎng)卡開始抓包,這樣考勤機(jī)發(fā)送的數(shù)據(jù)就會一目了然。現(xiàn)在的網(wǎng)絡(luò)拓?fù)淙缦拢?/p>
0×02
捕獲到的網(wǎng)絡(luò)流量如下,沒錯,使用了TLS(傳輸層安全協(xié)議),加密了所有的數(shù)據(jù)。目前大多數(shù)證書都使用1024位或2048位密鑰。2048位密鑰非常可靠,要想通過暴力的方式破解,這幾乎是不可能的。
通過查閱資料,找到兩種突破SSL的工具:SSLStrip和SSLSplit。SSLStrip很強(qiáng)大,它的核心原理是將HTTPS強(qiáng)制降級為HTTP。SSLSplit的原理是以中間人的身份將偽造的證書插入到服務(wù)器和客戶端中間,從而截?cái)嗫蛻舳撕头?wù)器之間的流量。這里我們使用SSLStrip。(希望考勤機(jī)沒有校驗(yàn)證書的真?zhèn)危?=
同時我們注意到考勤機(jī)的IP位于4網(wǎng)段,網(wǎng)關(guān)為192.168.4.1。
0×03
接下來我們需要搭建一個虛假的網(wǎng)關(guān),來截?cái)嗫记跈C(jī)發(fā)出的所有流量。
將之前的USB網(wǎng)卡(eth2)接入Kali系統(tǒng),Kali使用NAT方式進(jìn)行聯(lián)網(wǎng),IP:192.168.127.134,子網(wǎng)掩碼:255.255.255.0
命令如下:
//配置USB網(wǎng)卡的IP為192.168.4.1,子網(wǎng)掩碼255.255.255.0root@bogon:~# ifconfig eth2 192.168.4.1 netmask 255.255.255.0//使能USB網(wǎng)卡root@bogon:~# ifconfig eth2 up//開啟IP轉(zhuǎn)發(fā)root@bogon:~# echo 1 > /proc/sys/net/ipv4/ip_forward//為了保證這個虛假網(wǎng)關(guān)能聯(lián)網(wǎng),將eth2和eth0進(jìn)行關(guān)聯(lián)root@bogon:~# iptables -A FORWARD -i eth2 -o eth0 -j ACCEPT//開啟地址偽裝root@bogon:~# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
同時我們還要搭建一個DHCP服務(wù)為考勤機(jī)分配IP,這里使用dnsmasq,配置如下,并啟動服務(wù)。
root@bogon:~# service dnsmasq start
此時一個4網(wǎng)段的網(wǎng)關(guān)已經(jīng)設(shè)置好,USB網(wǎng)卡模擬網(wǎng)關(guān)并分配IP地址。這時將考勤機(jī)連接應(yīng)該可以正常聯(lián)網(wǎng)。
網(wǎng)絡(luò)拓?fù)淙缦拢?/p>
0×04
下面請SSLSplit登場。
先生成一個key文件:
openssl genrsa -out ca.key 2048
然后自簽名用生成的key生成公鑰證書:
openssl req -new -x509 -days 1096 -key ca.key -out ca.crt
這樣我們就把根證書建好了。
接著是用iptables進(jìn)行流量轉(zhuǎn)發(fā),把我們需要的端口進(jìn)行轉(zhuǎn)發(fā):
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8443
接著啟動SSLSplit
sslsplit -D -l connect.log -j /root -S logdir/ -k ca.key -c ca.crt ssl 0.0.0.0 8443 tcp 0.0.0.0 8080
連接考勤機(jī)并進(jìn)行打卡,會發(fā)現(xiàn)生產(chǎn)日志文件,里面應(yīng)該就是我們想要的明文數(shù)據(jù)包。
0×05
打開一看,部分亂碼。好吧,這又是什么加密?不慌,我們距離成功僅差一步。
仔細(xì)觀察,我們可以得到服務(wù)器的IP,并且知道考勤機(jī)使用了websocket。簡單來說websocket是一種網(wǎng)絡(luò)協(xié)議,實(shí)現(xiàn)了全雙工,客戶端和服務(wù)器可以相互主動發(fā)送信息給對方。數(shù)據(jù)傳輸使用的是一系列數(shù)據(jù)幀,出于安全考慮,客戶端發(fā)送的數(shù)據(jù)幀必須進(jìn)行掩碼處理后才能發(fā)送到服務(wù)器,不論是否是在TLS安全協(xié)議上都要進(jìn)行掩碼處理。WebSocket協(xié)議已經(jīng)設(shè)計(jì)了心跳,這個功能可以到達(dá)檢測鏈接是否可用。一個數(shù)據(jù)幀的結(jié)構(gòu)如下:
廢話不多說,既然數(shù)據(jù)幀進(jìn)行了掩碼處理,我們怎么解密呢,網(wǎng)上解密代碼很多,我寫了一個Java版的,部分代碼如下:
0×06
運(yùn)行程序,終于終于看到了明文===
第一部分代表考勤機(jī)發(fā)出的登陸請求,包含考勤機(jī)的一些信息:設(shè)備ID,token
第二部分為websocket的心跳包。
第三部分,在校驗(yàn)指紋時捕獲到的,所以應(yīng)該就是我們想要的打卡請求。包含userCode(工號),checkTime(打卡時間)
目前為止,我們已經(jīng)可以成功解析這個亂碼的文件:
0×07
開始擼代碼。現(xiàn)在已經(jīng)知道了考勤機(jī)與服務(wù)器之間的通信內(nèi)容,現(xiàn)在需要寫一個支持SSL的websocket客戶端將打卡信息發(fā)送給服務(wù)器。代碼參考這位大神寫的:
https://github.com/palmerc/SecureWebSockets
稍加修改,一個具有打卡功能的安卓客戶端誕生。
下面是打卡后服務(wù)器返回的數(shù)據(jù),type=”result”時表示成功。通過查閱考勤記錄,確實(shí)成功打卡。
修改了一哈界面,是不是很帥呢===
自從有了它,媽媽再也不用擔(dān)心我上班遲到了===
0×08
總的來說:
1、實(shí)現(xiàn)遠(yuǎn)程打卡的思路可以簡單概括為四個字:抓包重放。原理雖然簡單,但是我們在抓包的過程中遇到了很多困難。
2、考勤機(jī)的核心問題在于,沒有檢測SSL證書的真?zhèn)危瑢?dǎo)致我們可以偽造證書,獲取考勤機(jī)與服務(wù)器通信的明文數(shù)據(jù)包,最終我們寫了一個APP來發(fā)送打卡信息,實(shí)現(xiàn)了遠(yuǎn)程打卡。
總結(jié)
以上是生活随笔為你收集整理的思路分享 | 指纹考勤机实现远程打卡测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php基础篇-二维数组排序 array_
- 下一篇: 关于电脑(window)后门查看的一些总