def set_cant_split(self, row): tr = row._tr trPr = tr.get_or_add_trPr() tblHeader = OxmlElement('w:cantSplit') tblHeader.set(qn('w:val'), "true") trPr.append(tblHeader) return row
def set_vert_cell_direction(cell): # https://github.com/python-openxml/python-docx/issues/55 tc = cell._tc tcPr = tc.tcPr textDirection = OxmlElement('w:textDirection') textDirection.set(qn('w:val'), 'btLr') tcPr.append(textDirection)
def cellStyle(self, cells, background): self.make_rows_bold(cells) for cell in cells: tcPr = cell._tc.get_or_add_tcPr() tcVAlign = OxmlElement("w:shd") tcVAlign.set(qn("w:fill"), background) tcPr.append(tcVAlign)
def set_table_margins(self, tbl, width: dict = None): """ <w:tbl> <w:tblPr> <w:tblStyle w:val="LightShading"/> <w:tblW w:type="auto" w:w="0"/> <w:tblCellMar> <w:left w:type="dxa" w:w="63"/> <w:right w:type="dxa" w:w="63"/> </w:tblCellMar> <w:tblLook w:firstColumn="1" w:firstRow="1" w:lastColumn="0" w:lastRow="0" w:noHBand="0" w:noVBand="1" w:val="04A0"/> </w:tblPr> """ # noqa # 67 = Cm(0.11) ...? if width is None: width = dict(left=67, right=67) margins = OxmlElement('w:tblCellMar') for side, w in width.items(): margin = OxmlElement(f'w:{side}') margin.set(qn('w:w'), str(w)) margin.set(qn('w:type'), 'dxa') margins.append(margin) tbl._tbl.tblPr.append(margins)
def new(cls, text): """ Return a new ``<w:t>`` element. """ t = OxmlElement('w:t') t.text = text return t
def new(cls, pic_id, image_filename): nvPicPr = OxmlElement('pic:nvPicPr') nvPicPr.append(CT_NonVisualDrawingProps.new( 'pic:cNvPr', pic_id, image_filename )) nvPicPr.append(CT_NonVisualPictureProperties.new()) return nvPicPr
def set_shade_cell(cell, shade): tcpr = cell._tc.get_or_add_tcPr( ) # récupération de lélément XML correspondant à la cellule tcvalign = OxmlElement( "w:shd") # création d'un élément XML pour le background tcvalign.set(qn("w:fill"), shade) # set de la valeur de la vcouleur de fond tcpr.append(tcvalign) # ajout de l'élement XML à la cellule
def new(cls): """ Return a new ``<w:tc>`` element, containing an empty paragraph as the required EG_BlockLevelElt. """ tc = OxmlElement("w:tc") p = CT_P.new() tc.append(p) return tc
def add_tbl_border(self, tbl): """Add table bottom border with OxmlElement""" borders = OxmlElement('w:tblBorders') bottom_border = OxmlElement('w:bottom') bottom_border.set(qn('w:val'), 'single') bottom_border.set(qn('w:sz'), '4') borders.append(bottom_border) tbl._tbl.tblPr.append(borders)
def new(cls): """ Return a new ``<w:tc>`` element, containing an empty paragraph as the required EG_BlockLevelElt. """ tc = OxmlElement('w:tc') p = CT_P.new() tc.append(p) return tc
def add_drawing(self, inline_or_anchor): """ Return a newly appended ``CT_Drawing`` (``<w:drawing>``) child element having *inline_or_anchor* as its child. """ drawing = OxmlElement('w:drawing') self.append(drawing) drawing.append(inline_or_anchor) return drawing
def set_repeat_table_header(row): """ set repeat table row on every new page """ tr = row._tr trPr = tr.get_or_add_trPr() tblHeader = OxmlElement('w:tblHeader') tblHeader.set(qn('w:val'), "true") trPr.append(tblHeader) return row
def new(cls, num_id, abstractNum_id): """ Return a new ``<w:num>`` element having numId of *num_id* and having a ``<w:abstractNumId>`` child with val attribute set to *abstractNum_id*. """ abstractNumId = CT_DecimalNumber.new('w:abstractNumId', abstractNum_id) num = OxmlElement('w:num', {qn('w:numId'): str(num_id)}) num.append(abstractNumId) return num
def new(cls): """ Return a new ``<w:tbl>`` element, containing the required ``<w:tblPr>`` and ``<w:tblGrid>`` child elements. """ tbl = OxmlElement("w:tbl") tblPr = CT_TblPr.new() tbl.append(tblPr) tblGrid = CT_TblGrid.new() tbl.append(tblGrid) return tbl
def set_cell_vertical_alignment(cell, align="center"): try: tc = cell._tc tcPr = tc.get_or_add_tcPr() tcValign = OxmlElement('w:vAlign') tcValign.set(qn('w:val'), align) tcPr.append(tcValign) return True except: traceback.print_exc() return False
def new(cls, pic_id, filename, rId, cx, cy): """ Return a new ``<pic:pic>`` element populated with the minimal contents required to define a viable picture element, based on the values passed as parameters. """ pic = OxmlElement('pic:pic', nsmap=nspfxmap('pic', 'r')) pic.append(CT_PictureNonVisual.new(pic_id, filename)) pic.append(CT_BlipFillProperties.new(rId)) pic.append(CT_ShapeProperties.new(cx, cy)) return pic
def new(cls, num_id, abstractNum_id): """ Return a new ``<w:num>`` element having numId of *num_id* and having a ``<w:abstractNumId>`` child with val attribute set to *abstractNum_id*. """ abstractNumId = CT_DecimalNumber.new( 'w:abstractNumId', abstractNum_id ) num = OxmlElement('w:num', {qn('w:numId'): str(num_id)}) num.append(abstractNumId) return num
def shade_cells(cells, shade): """Gives background color to the inputted cells of a table in a .docx file. :param cells: The cells which you want to be colored. It could be a full row, such as the header row. :type cells: list :param shade: HEX color code like: "#f3f3f3" (grey) :type shade: str """ for cell in cells: tcPr = cell._tc.get_or_add_tcPr() tcVAlign = OxmlElement("w:shd") tcVAlign.set(qn("w:fill"), shade) tcPr.append(tcVAlign)
def set_repeat_table_header(row): """Sets property 'repeat header row on every new page' of table. :param row: Header row :type row: [type] :return: Row :rtype: [type] """ tr = row._tr trPr = tr.get_or_add_trPr() tblHeader = OxmlElement('w:tblHeader') tblHeader.set(qn('w:val'), "true") trPr.append(tblHeader) return row
def add_emboss(self): """ Return a newly added <w:emboss/> child element. """ emboss = OxmlElement('w:emboss') self.insert(0, emboss) return emboss
def add_vanish(self): """ Return a newly added <w:vanish/> child element. """ vanish = OxmlElement('w:vanish') self.insert(0, vanish) return vanish
def add_i(self): """ Return a newly added <w:i/> child element. """ i = OxmlElement('w:i') self.insert(0, i) return i
def add_webHidden(self): """ Return a newly added <w:webHidden/> child element. """ webHidden = OxmlElement('w:webHidden') self.insert(0, webHidden) return webHidden
def add_specVanish(self): """ Return a newly added <w:specVanish/> child element. """ specVanish = OxmlElement('w:specVanish') self.insert(0, specVanish) return specVanish
def add_iCs(self): """ Return a newly added <w:iCs/> child element. """ iCs = OxmlElement('w:iCs') self.insert(0, iCs) return iCs
def add_strike(self): """ Return a newly added <w:strike/> child element. """ strike = OxmlElement('w:strike') self.insert(0, strike) return strike
def add_noProof(self): """ Return a newly added <w:noProof/> child element. """ noProof = OxmlElement('w:noProof') self.insert(0, noProof) return noProof
def add_oMath(self): """ Return a newly added <w:oMath/> child element. """ oMath = OxmlElement('w:oMath') self.insert(0, oMath) return oMath
def add_cs(self): """ Return a newly added <w:cs/> child element. """ cs = OxmlElement('w:cs') self.insert(0, cs) return cs
def add_rtl(self): """ Return a newly added <w:rtl/> child element. """ rtl = OxmlElement('w:rtl') self.insert(0, rtl) return rtl
def add_outline(self): """ Return a newly added <w:outline/> child element. """ outline = OxmlElement('w:outline') self.insert(0, outline) return outline
def add_shadow(self): """ Return a newly added <w:shadow/> child element. """ shadow = OxmlElement('w:shadow') self.insert(0, shadow) return shadow
def add_smallCaps(self): """ Return a newly added <w:smallCaps/> child element. """ smallCaps = OxmlElement('w:smallCaps') self.insert(0, smallCaps) return smallCaps
def add_snapToGrid(self): """ Return a newly added <w:snapToGrid/> child element. """ snapToGrid = OxmlElement('w:snapToGrid') self.insert(0, snapToGrid) return snapToGrid
def add_imprint(self): """ Return a newly added <w:imprint/> child element. """ imprint = OxmlElement('w:imprint') self.insert(0, imprint) return imprint
def addMetadata(p, text): # colored small text r = p.add_run(text) rPr = r._r.get_or_add_rPr() rStyle = OxmlElement('w:color') rStyle.set(qn('w:val'), '888888') rPr.insert(0, rStyle) rStyle = OxmlElement('w:sz') rStyle.set(qn('w:val'), '18') rPr.insert(0, rStyle) rStyle = OxmlElement('w:szCs') rStyle.set(qn('w:val'), '18') rPr.insert(1, rStyle)
def new(cls, cx, cy, shape_id, pic): """ Return a new ``<wp:inline>`` element populated with the values passed as parameters. """ name = 'Picture %d' % shape_id uri = nsmap['pic'] inline = OxmlElement('wp:inline', nsmap=nspfxmap('wp', 'r')) inline.append(CT_PositiveSize2D.new('wp:extent', cx, cy)) inline.append(CT_NonVisualDrawingProps.new( 'wp:docPr', shape_id, name )) inline.append(CT_GraphicalObject.new(uri, pic)) return inline
def new(cls): stretch = OxmlElement('a:stretch') stretch.append(CT_RelativeRect.new()) return stretch
def new(cls, prst): prstGeom = OxmlElement('a:prstGeom') prstGeom.set('prst', prst) return prstGeom
def new(cls, cx, cy): spPr = OxmlElement('pic:spPr') spPr.append(CT_Transform2D.new(cx, cy)) spPr.append(CT_PresetGeometry2D.new('rect')) return spPr
def new(cls, nsptagname_str, shape_id, name): elt = OxmlElement(nsptagname_str) elt.set('id', str(shape_id)) elt.set('name', name) return elt
def new(cls, nsptagname_str, cx, cy): elm = OxmlElement(nsptagname_str) elm.set('cx', str(cx)) elm.set('cy', str(cy)) return elm
def run(self, \ args, \ report_directory, \ lookup, whois_result, \ dns_result, \ google_result, \ shodan_result, \ paste_scrape_result, \ theharvester_result, \ webscrape_result, \ cred_result, \ pyfoca_result): for l in lookup: print('[+] Starting OSINT report for '.format(l)) self.document = docx.Document() #add logo self.document.add_picture('./resources/logo.png', height=Inches(1.25)) #add domain cover info paragraph = self.document.add_paragraph() run_paragraph = paragraph.add_run('%s' % l) font = run_paragraph.font font.name = 'Arial' font.size = Pt(28) font.color.rgb = RGBColor(0x00, 0x00, 0x00) #add cover info paragraph = self.document.add_paragraph() run_paragraph = paragraph.add_run('Open Source Intelligence Report\n\n\n\n\n\n\n\n\n\n\n') font = run_paragraph.font font.name = 'Arial' font.size = Pt(26) font.color.rgb = RGBColor(0xe9, 0x58, 0x23) paragraph = self.document.add_paragraph() run_paragraph = paragraph.add_run('Generated on: %s' % self.today) font = run_paragraph.font font.name = 'Arial' font.size = Pt(16) font.color.rgb = RGBColor(0x00, 0x00, 0x00) #page break for cover page self.document.add_page_break() #add intro text on intropage heading = self.document.add_heading() run_heading = heading.add_run('Executive Summary') font = run_heading.font font.name = 'Arial' font.size = Pt(20) font.color.rgb = RGBColor(0xe9, 0x58, 0x23) paragraph = self.document.add_paragraph() run_paragraph = paragraph.add_run('\nThis document contains information about network, technology, and people associated with the assessment targets. The information was obtained by programatically querying various free or low cost Internet data sources.\n') font = run_paragraph.font font.name = 'Arial' font.size = Pt(11) run_paragraph = paragraph.add_run('\nThese data include information about the network, technology, and people associated with the targets.\n') font = run_paragraph.font font.name = 'Arial' font.size = Pt(11) run_paragraph = paragraph.add_run('\nSpecific data sources include: whois, domain name system (DNS) records, Google dork results, and data from recent compromises such as LinkedIn. Other sources include results from Shodan, document metadata from theHarvester and pyFoca, as well as queries to Pastebin, Github, job boards, etc. \n') font = run_paragraph.font font.name = 'Arial' font.size = Pt(11) #page break for cover page self.document.add_page_break() heading = self.document.add_heading() run_heading = heading.add_run('Table of Contents') font = run_heading.font font.bold = True font.name = 'Arial' font.size = Pt(20) font.color.rgb = RGBColor(0x0, 0x0, 0x0) #TOC https://github.com/python-openxml/python-docx/issues/36 paragraph = self.document.add_paragraph() run = paragraph.add_run() font.name = 'Arial' font.size = Pt(11) fldChar = OxmlElement('w:fldChar') # creates a new element fldChar.set(qn('w:fldCharType'), 'begin') # sets attribute on element instrText = OxmlElement('w:instrText') instrText.set(qn('xml:space'), 'preserve') # sets attribute on element instrText.text = 'TOC \o "1-3" \h \z \u' # change 1-3 depending on heading levels you need fldChar2 = OxmlElement('w:fldChar') fldChar2.set(qn('w:fldCharType'), 'separate') fldChar3 = OxmlElement('w:t') fldChar3.text = "Right-click to update field." fldChar2.append(fldChar3) fldChar4 = OxmlElement('w:fldChar') fldChar4.set(qn('w:fldCharType'), 'end') r_element = run._r r_element.append(fldChar) r_element.append(instrText) r_element.append(fldChar2) r_element.append(fldChar4) p_element = paragraph._p #page break for toc self.document.add_page_break() if cred_result is not None: print('[+] Adding credential dump results to report') #header heading = self.document.add_heading(level=3) run_heading = heading.add_run('Credentials found from recent compromises (LinkedIn, Adobe, etc.) related to: %s' % l) font = run_heading.font font.name = 'Arial' font.color.rgb = RGBColor(0xe9, 0x58, 0x23) paragraph = self.document.add_paragraph() for c in cred_result: run_paragraph = paragraph.add_run(''.join(c)) font = run_paragraph.font font.name = 'Arial' font.size = Pt(11) self.document.add_page_break() #add whois data with header and break after end if whois_result is not None: print('[+] Adding whois results to report') #header heading = self.document.add_heading(level=3) run_heading = heading.add_run('Whois Data for: %s' % l) font = run_heading.font font.name = 'Arial' font.color.rgb = RGBColor(0xe9, 0x58, 0x23) #content paragraph = self.document.add_paragraph() for line in whois_result: if ':' in line: run_paragraph = paragraph.add_run(''.join(line)+'\n') font = run_paragraph.font font.name = 'Arial' font.size = Pt(10) self.document.add_page_break() #add dns data with header and break after end if dns_result is not None: print('[+] Adding DNS results to report') #header heading = self.document.add_heading(level=3) run_heading = heading.add_run('Domain Name System Data for: %s' % l) font = run_heading.font font.name = 'Arial' font.color.rgb = RGBColor(0xe9, 0x58, 0x23) #content paragraph = self.document.add_paragraph() for d in dns_result: run_paragraph = paragraph.add_run('\n'.join(d)) font = run_paragraph.font font.name = 'Arial' font.size = Pt(10) self.document.add_page_break() #google dork output if google_result is not None: print('[+] Adding google dork results to report') #header heading = self.document.add_heading(level=3) run_heading = heading.add_run('Google Dork Results for: %s' % l) font = run_heading.font font.name = 'Arial' font.color.rgb = RGBColor(0xe9, 0x58, 0x23) #content paragraph = self.document.add_paragraph() for r in google_result: run_paragraph = paragraph.add_run(''.join(r+'\n')) font = run_paragraph.font font.name = 'Arial' font.size = Pt(10) self.document.add_page_break() #harvester output if theharvester_result is not None: print('[+] Adding theHarvester results to report') #header heading = self.document.add_heading(level=3) run_heading = heading.add_run('theHarvester Results for: %s' % l) font = run_heading.font font.name = 'Arial' font.color.rgb = RGBColor(0xe9, 0x58, 0x23) #content paragraph = self.document.add_paragraph() for h in theharvester_result: run_paragraph = paragraph.add_run(''.join(h)) #set font stuff font = run_paragraph.font font.name = 'Arial' font.size = Pt(10) self.document.add_page_break() #pastebin scrape output if paste_scrape_result is not None: print('[+] Adding pastebin scrape results to report') heading = self.document.add_heading(level=3) run_heading = heading.add_run('Pastebin URLs for %s' % l) font = run_heading.font font.name = 'Arial' font.color.rgb = RGBColor(0xe9, 0x58, 0x23) paragraph = self.document.add_paragraph() self.document.add_paragraph(paste_scrape_result) font = run_paragraph.font font.name = 'Arial' font.size = Pt(10) self.document.add_page_break() #general scrape output if webscrape_result is not None: print('[+] Adding website scraping results to report') #header heading = self.document.add_heading(level=3) run_heading = heading.add_run('Website Scraping Results for %s' % l) font = run_heading.font font.name = 'Arial' font.color.rgb = RGBColor(0xe9, 0x58, 0x23) #content paragraph = self.document.add_paragraph() for sr in webscrape_result: for line in sr: run_paragraph = paragraph.add_run(line) font = run_paragraph.font font.name = 'Arial' font.size = Pt(10) self.document.add_page_break() #pyfoca results if pyfoca_result is not None: print('[+] Adding pyfoca results to report') heading = self.document.add_heading(level=3) run_heading = heading.add_run('pyFoca Results for: %s' % l) font = run_heading.font font.name = 'Arial' font.color.rgb = RGBColor(0xe9, 0x58, 0x23) paragraph = self.document.add_paragraph() for fr in pyfoca_result: run_paragraph = paragraph.add_run(''.join(str(fr).strip(("\\ba\x00b\n\rc\fd\xc3")))) font = run_paragraph.font font.name = 'Arial' font.size = Pt(10) self.document.add_page_break() #shodan output if shodan_result is not None: heading = self.document.add_heading(level=3) run_heading = heading.add_run('Shodan Results for: %s' % l) font = run_heading.font font.name = 'Arial' font.color.rgb = RGBColor(0xe9, 0x58, 0x23) paragraph = self.document.add_paragraph() for shr in shodan_result: try: run_paragraph = paragraph.add_run(str(shr).strip(("\\ba\x00b\n\rc\fd\xc3"))) #set font stuff font = run_paragraph.font font.name = 'Arial' font.size = Pt(10) except: print ('probably an encoding error...') continue print('[+] Writing file: ./reports/{}/OSINT_{}_.docx'.format(l, l)) #saves to ./reports/domain.com/OSINT_domain.com_.docx self.document.save(report_directory+'{}/OSINT_{}_.docx'.format(l, l))
def new(cls, nsptagname_str, x, y): elm = OxmlElement(nsptagname_str) elm.set('x', str(x)) elm.set('y', str(y)) return elm
def new(cls, rId): blip = OxmlElement('a:blip') blip.set(qn('r:embed'), rId) return blip
def new(cls, uri, pic): graphicData = OxmlElement('a:graphicData') graphicData.set('uri', uri) graphicData.append(pic) return graphicData
def new(cls, cx, cy): spPr = OxmlElement('a:xfrm') spPr.append(CT_Point2D.new('a:off', 0, 0)) spPr.append(CT_PositiveSize2D.new('a:ext', cx, cy)) return spPr
def new(cls, uri, pic): graphic = OxmlElement('a:graphic') graphic.append(CT_GraphicalObjectData.new(uri, pic)) return graphic
def new(cls, rId): blipFill = OxmlElement('pic:blipFill') blipFill.append(CT_Blip.new(rId)) blipFill.append(CT_StretchInfoProperties.new()) return blipFill