其实我觉得markdown生成的pdf报告用来做渗透测试结果的报告多好,多好看。但是不行,作一作报告还得重写。

参考地址

1
2
3
4
5
6
https://python-docx.readthedocs.io/en/latest/ 官方文档
https://stackoverrun.com 问答目录
https://zhuanlan.zhihu.com/p/23708800
https://zhuanlan.zhihu.com/p/22614722
https://zhuanlan.zhihu.com/p/21716087
https://zhuanlan.zhihu.com/p/21643475

一.python-docx基本用法

安装

1
pip install python-docx

tips:这里建议安装好库之后找到库的文件,有的时候可以直接对库文件的代码进行修改。

基本用法

基本用法在以下代码中全部体现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
from docx import Document
from docx.shared import Pt
from docx.oxml.ns import qn
from docx.shared import Inches
#打开文档
document = Document()
#加入不同等级的标题
document.add_heading('Document Title',0)
document.add_heading(u'二级标题',1)
document.add_heading(u'二级标题',2)
#添加文本
paragraph = document.add_paragraph(u'添加了文本')
#设置字号
run = paragraph.add_run(u'设置字号')
run.font.size=Pt(24)
#设置字体
run = paragraph.add_run('Set Font,')
run.font.name='Consolas'
#设置中文字体
run = paragraph.add_run(u'设置中文字体,')
run.font.name=u'宋体'
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
#设置斜体
run = paragraph.add_run(u'斜体、')
run.italic = True
#设置粗体
run = paragraph.add_run(u'粗体').bold = True
#增加引用
document.add_paragraph('Intense quote', style='Intense Quote')
#增加有序列表
document.add_paragraph(
u'有序列表元素1',style='List Number'
)
document.add_paragraph(
u'有序列别元素2',style='List Number'
)
#增加无序列表
document.add_paragraph(
u'无序列表元素1',style='List Bullet'
)
document.add_paragraph(
u'无序列表元素2',style='List Bullet'
)
#增加图片(此处使用相对位置)
#document.add_picture('jdb.jpg',width=Inches(1.25))
#增加表格
table = document.add_table(rows=3,cols=3)
hdr_cells=table.rows[0].cells
hdr_cells[0].text="第一列"
hdr_cells[1].text="第二列"
hdr_cells[2].text="第三列"
hdr_cells = table.rows[1].cells
hdr_cells[0].text = '2'
hdr_cells[1].text = 'aerszvfdgx'
hdr_cells[2].text = 'abdzfgxfdf'
hdr_cells = table.rows[2].cells
hdr_cells[0].text = '3'
hdr_cells[1].text = 'cafdwvaef'
hdr_cells[2].text = 'aabs zfgf'
#增加分页
document.add_page_break()
#保存文件
document.save('demo.docx')

表格style类型输出查看

文档中需要各种各样的类型,可以通过代码输出查看,也可以通过他的库文件直接查看。

代码方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from docx import *
document = Document()
styles = document.styles
for s in styles:
if s.type == WD_STYLE_TYPE.TABLE:
document.add_paragraph("表格样式 : "+ s.name)
table = document.add_table(3,3, style = s)
heading_cells = table.rows[0].cells
heading_cells[0].text = '第一列内容'
heading_cells[1].text = '第二列内容'
heading_cells[2].text = '第三列内容'
document.add_paragraph("\n")
document.save('demo2.docx')

库文件查看或者修改他的默认样式:

      网上下载python_docx-0.8.7-py2.py3-none-any.whl文件解压缩后文件夹中docx下面的template文件夹中存放了库的默认样式。如图。

自动化渗透测试报告

      MD,反正我就是觉得我们的报告长得丑!

漏洞标题

      生成二级标题为漏洞的名字,并且改掉它的大小和颜色,也可以直接在库文件中修改默认的值。

1
2
3
4
run = document.add_heading(u'',2)
run = run.add_run(str(count)+'. '+V[signal][1])
run.font.size = Pt(16)
run.font.color.rgb = RGBColor(0x00, 0x00, 0x00)

漏洞表格

      用了很长的时间来画一个表格,其实我觉得这里应该是可以直接修改库文件的默认格式,把自己的格式给默认进去就方便很多了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
tables = document.add_table(rows=5, cols=4, style='Table Grid')
tables.alignment = WD_ALIGN_PARAGRAPH.CENTER
tables.autofit = False
document.styles['Normal'].font.name = u'宋体'
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
document.styles['Normal'].font.size = Pt(14)
tables.cell(0, 2).vertical_alignment = WD_ALIGN_VERTICAL.CENTER # 单元格居中
shading_elm_1 = parse_xml(r'<w:shd {} w:fill="BABABA"/>'.format(nsdecls('w')))
shading_elm_2 = parse_xml(r'<w:shd {} w:fill="BABABA"/>'.format(nsdecls('w')))
shading_elm_3 = parse_xml(r'<w:shd {} w:fill="BABABA"/>'.format(nsdecls('w')))
shading_elm_4 = parse_xml(r'<w:shd {} w:fill="BABABA"/>'.format(nsdecls('w')))
shading_elm_5 = parse_xml(r'<w:shd {} w:fill="BABABA"/>'.format(nsdecls('w')))
shading_elm_6 = parse_xml(r'<w:shd {} w:fill="BABABA"/>'.format(nsdecls('w')))
for i in range(5):
tables.cell(i, 0).width = Inches(0.6)
tables.cell(i, 1).width = Inches(4.2)
tables.cell(i, 3).width = Inches(0.6)
tables.cell(i, 2).width = Inches(0.6)
tables.cell(i, 0).autofit = True
for j in range(4):
tables.cell(i, j).vertical_alignment = WD_ALIGN_VERTICAL.CENTER
tables.cell(0, 2)._tc.get_or_add_tcPr().append(shading_elm_1)
tables.cell(0, 0)._tc.get_or_add_tcPr().append(shading_elm_2)
tables.cell(1, 0)._tc.get_or_add_tcPr().append(shading_elm_3)
tables.cell(2, 0)._tc.get_or_add_tcPr().append(shading_elm_4)
tables.cell(3, 0)._tc.get_or_add_tcPr().append(shading_elm_5)
tables.cell(4, 0)._tc.get_or_add_tcPr().append(shading_elm_6)
tables.cell(0, 0).text = "漏洞名称"
cell1 = tables.cell(0, 0)
run = cell1.paragraphs[0].runs[0]
run.font.bold = True
tables.cell(0, 2).autofit = True;
tables.cell(0, 3).autofit = True
tables.cell(0, 2).text = "风险等级"
cell2 = tables.cell(0, 2)
run = cell2.paragraphs[0].runs[0]
run.font.bold = True
tables.cell(1, 0).text = "URL"
tables.cell(1, 1).merge(tables.cell(1, 3))
cell3 = tables.cell(1, 0)
run = cell3.paragraphs[0].runs[0]
run.font.bold = True
tables.cell(2, 0).text = "漏洞说明"
tables.cell(2, 1).merge(tables.cell(2, 3))
cell4 = tables.cell(2, 0)
run = cell4.paragraphs[0].runs[0]
run.font.bold = True
tables.cell(3, 0).text = "漏洞截图"
tables.cell(3, 1).merge(tables.cell(3, 3))
cell5 = tables.cell(3, 0)
run = cell5.paragraphs[0].runs[0]
run.font.bold = True
tables.cell(4, 0).text = "修复建议"
tables.cell(4, 1).merge(tables.cell(4, 3))
cell6 = tables.cell(4, 0)
run = cell6.paragraphs[0].runs[0]
run.font.bold = True

数据写入

      写入到表格的指定位置。

1
2
3
4
tables[count-1].cell(0, 1).text = V[signal][1]
tables[count-1].cell(0, 3).text = V[signal][2]
tables[count-1].cell(2, 1).text = V[signal][3]
tables[count-1].cell(4, 1).text = V[signal][4]

demo展示

      根据提示信息,提供漏洞库数据的展示,拼音缩写对应的漏洞名称。报告的名称,并且在桌面生成。生成的漏洞表格的数量。其中的所有输入都有格式进行判断。最后使用pyinstaller分别在mac下和windows下打包。

总结

      mac下面的打包坑有点多啊,舍弃了单文件打包,但是windows下只要把default.docx拷出来就可以。

留言

2018-12-02

本文总阅读量
⬆︎TOP