Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Python学习记录(十六):Awvs自动化扫描&单步扫描实现 #17

Open
PyxYuYu opened this issue Mar 17, 2016 · 0 comments
Open

Comments

@PyxYuYu
Copy link
Owner

PyxYuYu commented Mar 17, 2016

All sad people like poetry, happy people like songs.

0x01 Wooyun

  • 心脏出血 OpenSSL
  • 设计错误/逻辑缺陷
    • 安全狗上传绕过
      • bypass.phpX : Xhex为0x90
    • bypass.php X : 扩展名和 X 中间加个空格
  • SQL 注入
0x02 Awvs自动化扫描

  • Awvs 批量扫描 url.txt 中的 url
    • 单个 url 传入 wvs_console.exe 中被执行

    • wvs_console.exe 执行完之后会将结果保存,保存的结果自定义为扫描的 url 命名,通过 os.listdir(path) 可以查看是否已经有以这个命名的扫描结果,如果有的话,证明已经扫描过的 url ,可以跳过,继续下一个目标 url,或者用队列的方式,将所有的目标保存在队列中,利用队列的安全性,不会有相同的目标被二次扫描

    • os.system(command) 可以运行命令行命令,但是在 Python2.4 后引入新模块 subprocess 替换

    • subprocess 模块

      • subprocess 模块的目的就是启动一个新的进程并且与之通信
    • 使用 subprocess 包中的函数创建子进程时,需要注意:

      • 创建子进程之后,父进程是否暂停,并等待子进程运行
      • 函数返回什么
      • returncode 不为0,父进程如何处理
    • subprocess 模块定义了一个类: Popen,可以通过使用Popen来创建进程,并于进程进行复杂的交互

    • subprocess Popen(args, bufsize=0, executable=None, stdin=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

      • args 应该是一个程序参数的序列(如:list元组 )或者一个单一的字符串,默认情况下,如果 args 是一个序列,那么执行的程序是 args 的第一个元素(第一个元素通常是可执行文件的路径),也可以显式的使用 executable 参数来指定可执行文件的路径,如果 args 是一个字符串,那么其解释将于平台无关
      • 参数 stdinstdoutstderr 分别表示程序的标准输入、输出、错误句柄,它们可以是 PIPE,文件描述符或文件对象,也可以设置为 None ,表示从父进程继承
      • 如果参数 shell 设置为 true,程序将通过 shell 来执行
      • 参数 env 是字典类型,用于指定子进程的环境变量,如果 env=None ,子进程的环境变量将从父进程继承
    • subprocess.PIPE 管道工具

      • 在创建 Popen 对象时, subprocess.PIPE 可以初始化 stdinstdoutstderr 参数,表示与子进程通信的标准流
    • subprocess.STDOUT

      • 创建 Popen 对象时,用于初始化 stderr 参数,表示将错误通过标准输出流输出
    • Popen 的方法

      • Popen.poll() 用于检查子进程是否已经结束,设置并返回 returncode 属性
      • Popen.wait() 等待子进程结束,设置并返回 returncode 属性。
      • Popen.communicate(input=None)
        • 与子进程进行交互,向 stdin 发送数据,或从 stdoutstderr 中读取数据。可选参数 input 指定发送到子进程的参数。Communicate() 返回一个元组:(stdoutdata, stderrdata)。注意:如果希望通过进程的 stdin 向其发送数据,在创建Popen 对象的时候,参数 stdin 必须被设置为 PIPE 。同样,如果希望从 stdoutstderr 获取数据,必须将 stdoutstderr 设置为 PIPE
      • Popen.send_signal(signal) 向子进程发送信号
      • Popen.terminate()
        • 停止 (stop) 子进程,在 windows 平台下,该方法将调用 Windows API TerminateProcess() 来结束子进程。
      • Popen.kill() 杀死子进程。
      • Popen.pid 获取子进程的进程ID。
      • Popen.returncode 获取进程的返回值。如果进程还没有结束,返回 None

      p = subprocess.Popen("dir", shell=True)
      p.wait()
      • p.wait() 可以得到命令的返回值,如果a = p.wait(),那么 a 就是returncodeprint a 就是0(表示执行成功)
    • 如果想得到进程的输出,管道是个很方便的方法

      • (stdoutput, erroutput) = p.communicate()
      • p.communicate 会一直等到进程退出,并将标准输出和标准错误输出返回,这样就可以得到子进程的输出了
      p=subprocess.Popen("dir", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)   
      (stdoutput,erroutput) = p.communicate()
      • 通过 communicatestdin 发送数据,然后使用一个 tuple 接收命令的执行结果
      • 上面,标准输出和标准错误输出是分开的,也可以合并起来,只需要将 stderr 参数设置为 subprocess.STDOUT 就可以了
      p=subprocess.Popen("dir", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)   
      (stdoutput,erroutput) = p.communicate() 
      • 如果想一行行处理子进程的输出
      p=subprocess.Popen("dir", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)   
      while True:   
            buff = p.stdout.readline()   
            if buff == '' and p.poll() != None:
                break
      • 如果使用了管道,不去处理管道的输出,一旦子进程输出数据过多,死锁就会发生,比如
      p=subprocess.Popen("longprint", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
      p.wait()
      • longprint 是一个假想的有大量输出的进程,输出到一定量,死锁就会发生,当然,如果用 p.stdout.readline 或者 p.communicate 去清理输出,那么无论输出多少,死锁都是不会发生的。或者不使用管道,比如不做重定向,或者重定向到文件,也都是可以避免死锁的
        • 所以可以看出,推荐使用 p.communicate ,这个方法会把输出放在内存,而不是管道,如果需要获得程序返回值,可以在调用 p.communicate() 之后去 p.returncode 的值,也就是说如果使用
        • subprocess.Popen,就不使用 p.wait() ,而使用 p.communicate() 阻塞,来等待外部程序执行完成
    • subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) 父进程等待子进程完成,返回退出信息

      • 执行 args 描述的命令,等待命令完成,然后返回 returncode 属性
      • 如果子进程不需要交互,就可以使用该函数来创建
    • 回到上面的调用 Awvs 进行扫描,首先需要保存,用 时间\目标 的方式保存

      • 时间 就是扫描的日期
      • 目标 就是 url
      • 上面两个都是文件夹形式,扫描结果就保存在目标这个文件夹下面,会有3个文件
        • 一个 xml ,一个 wvs ,一个 csv
0x03 一天总结

  • subprocess 模块的使用
    • subprocess.Popen()Popen.communicate() 一起使用阻塞,而不用 Popen.wait()
    • subprocess.call() 阻塞,子进程不需要交互的情况
  • 今天在 Seebug 上提交了一个漏洞详情,换了个邀请码,明天开始需要多加一项 Seebug 的学习了

@PyxYuYu PyxYuYu changed the title Python学习记录(十五):Awvs自动化扫描&单步扫描实现 Python学习记录(十六):Awvs自动化扫描&单步扫描实现 Mar 17, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant