完了!TCP出了大事!
本文轉載自微信公眾號「編程技術宇宙」,作者軒轅之風 。轉載本文請聯(lián)系編程技術宇宙公眾號。
不速之客夜黑風高,烏云蔽月。
兩位不速之客,身著黑衣,一高一矮,潛入Linux帝國。
這一潛就是一個多月,直到他們收到了一條消息······
高個:“上峰終于給我們派任務了”
矮個:“什么任務?我都閑的發(fā)慌了”
高個:“上峰讓我們配合他們完成TCP連接的劫持”
矮個:“TCP劫持?我們就是個普通程序,并沒有內核權限,怎么去修改網(wǎng)絡連接啊,這不是強人所難嘛”
高個:“是啊,我也很奇怪。信上只約定了讓我們到時候告訴他們一個計數(shù)器的值就行,其他我們不用管”
矮個:“計數(shù)器,什么計數(shù)器?”
高個:“DelayedACKLost,信上說執(zhí)行cat /proc/net/netstat就能看到”
矮個:“不需要特殊權限嗎?”
高個:“我也不知道,要不咱先試一下?”
兩人收起信件,環(huán)顧一圈,見四下無人,便偷偷執(zhí)行了這一條命令:
“這都是些什么啊?怎么這么多?”,矮個子問到。
“看樣子,像是記錄了Linux帝國網(wǎng)絡協(xié)議棧的很多統(tǒng)計信息”,高個子一邊說一邊仔細的查看著。
“這些信息居然是公開的,誰都可以看?”
“也只能看,又改不了。怕啥?快找吧,找到DelayedACKLost再說”
兩人瞪大了眼睛,總算在一片密密麻麻的輸出中,找到了他們要的計數(shù)器。
可這一個小小的計數(shù)器怎么就能助上峰完成TCP的劫持,二人卻是百思不得其解。
秘密任務
第二天晚上。
“快醒醒,上峰又來消息了”,在高個子的一陣搖晃中,矮個睜開了困頓的雙眼。
“又是什么消息啊?”
“讓我們立即匯報DelayedACKLost的值”
兩人趕緊起身,再次執(zhí)行了那條命令,拿到了計數(shù)器的值,報了上去。
剛發(fā)完消息還沒緩過神,上峰的指示又來了:DelayedACKLost有無增加?
兩人互相看了一眼,不解其意,不過還是再次查看了計數(shù)器,確認沒有增加,再次把結果報了上去。
就這樣,來來回回幾十次,上峰一直詢問這個計數(shù)器有無增加,可把哥倆忙壞了。
終于,上峰不再來消息,兩人有了喘息的時間。
古怪的TCP連接
而此刻,Linux帝國網(wǎng)絡部協(xié)議棧大廈還是燈火通明。
“今晚是怎么回事,網(wǎng)絡怎么這么差,我都收到了好多錯誤包了”,新來的Robert嘆了口氣。
“不至于吧,是不是因為剛來還不太熟練?”,一旁的Cerf隨口問到。
“不是啊,有一條連接,我收到的包序列號不是太小,就是太大,搞了好多次才正確的,我還沒見過這種情況呢!”,Robert繼續(xù)說到。
一聽這話,Cerf趕緊放下了手里的工作,來到Robert工位旁邊,“這么邪乎?你說這情況我來這里這么久也沒見過,讓我看看”
Cerf仔細查看了過去一段時間的通信,這條連接上,不斷有數(shù)據(jù)包發(fā)送過來,但因為TCP序列號一直不對,所以一直給丟掉了。
“有點奇怪,這家伙怎么感覺像是在猜序列號啊?而且奇怪的是最終居然讓他給猜出來了!這條連接一定有古怪,多半是被人劫持了。劫持方因為不知道序列號,所以一直在嘗試猜測序列號”,Cerf說到。
Robert也看了一看,“你這么一說,確實是,而且你看,他不是瞎猜,好像是用二分法在猜!序列號是個32位的整數(shù),二分法猜測,只需要32次就能猜出來”
“二分法?要用二分法的前提他得知道他是猜大了還是猜小了,得不到這個反饋,他就只能瞎猜了。他是如何得知猜大還是猜小的呢?”
兩人思來想去,也想不通對方是如何用二分法猜出了最終的序列號,隨后將此事報給了網(wǎng)絡部傳輸層主管,主管又將這事報給了帝國安全部長。
揪出潛伏者
部長得知這個消息后,高度重視,要求全面排查網(wǎng)絡部TCP小組相關的代碼。
大家尋著TCP數(shù)據(jù)包處理的流程,在序列號檢查處的位置發(fā)現(xiàn)了問題。
如果序列號檢查不通過,就會進入tcp_send_dupack,大家都把注意力放到了這里:
“這里這個before判斷是什么意思?”,主管問到。
Cerf上前回答說:“這是在判斷收到的數(shù)據(jù)包的序列號是不是比期望的序列號小,如果小的話,說明網(wǎng)絡有重傳,就要關閉延遲回復ACK的機制,需要立即回復ACK”
“延遲回復ACK?”
“哦,主管,這是我們TCP小組的一個優(yōu)化,TCP傳輸需要確認,但是如果每一次交互數(shù)據(jù)都發(fā)送ACK就太浪費了,所以我們做了一個優(yōu)化,等到多次或者有數(shù)據(jù)發(fā)送的時候,一并把回復的ACK帶上,就不用了每次發(fā)送ACK報文,我們把這個叫Delayed ACK,也就是延遲確認。”,Cerf繼續(xù)解釋到。
“那下面這個tcp_enter_quickack_mode是不是就是關閉這個機制,進入快速ACK回復模式?”,主管問到。
“沒錯沒錯!”
這時,安全部長指著一行問到,“這里看著有些古怪,是在干嘛?”
“這個我知道,Cerf昨天教過我,這個是在進行統(tǒng)計。把這一次延遲ACK的丟失計入對應的全局計數(shù)器中”,Robert說到。
經(jīng)驗老道的安全部長此刻意識到了問題,“如此看來,收到的序列號比期望小的時候,這個計數(shù)器才會增加,如果大了就不會增加。各位試想一下,如果那個猜測的家伙能看到這個計數(shù)器有無增長,不就能知道是猜大了還是猜小了?”
Robert搖了搖頭說到:“不會吧,這計數(shù)器在我們這里,網(wǎng)絡上其他人怎么可能知道。再說了,這個計數(shù)器大家都在用,用這個判斷,誤差太大啦!”
主管也搖了搖頭,“不對,雖說是大家都在用,不過這里這個計數(shù)器很特別,發(fā)生的概率很小,一般不會走到這里來,網(wǎng)絡哪那么容易出問題嘛”
安全部長說到:“根據(jù)目前掌握的信息,之前就有其他部門反映帝國有奸細混了進來,不過他們一直藏在暗處,至今還沒有揪出來。如若他們和外界勾結,作為眼線,觀察這個計數(shù)器的變化,外面就能知道他的猜測是大是小。對,一定是這樣!”
隨后,安全部長來到了文件系統(tǒng)部門,調用了/proc/net/netstat的訪問記錄,根據(jù)記錄很快定位到了隱藏在Linux帝國的兩個細作,下令將他們逮捕。
高矮兩位奸細如實交代了一切······
未完待續(xù)······