From c8b2634d3ce5e1cdd1ec6d5128c42b4734b22c43 Mon Sep 17 00:00:00 2001 From: "Carlos.Martin" Date: Thu, 17 Jun 2021 19:29:28 +0100 Subject: [PATCH] update --- linPEAS/builder/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 186 bytes .../linpeas_builder.cpython-39.pyc | Bin 0 -> 492 bytes linPEAS/builder/linpeas_builder.py | 342 +----------------- .../src/__pycache__/fileRecord.cpython-39.pyc | Bin 0 -> 1989 bytes .../__pycache__/linpeasBuilder.cpython-39.pyc | Bin 0 -> 8649 bytes .../src/__pycache__/peasLoaded.cpython-39.pyc | Bin 0 -> 970 bytes .../__pycache__/peassRecord.cpython-39.pyc | Bin 0 -> 652 bytes .../__pycache__/yamlGlobals.cpython-39.pyc | Bin 0 -> 1450 bytes linPEAS/builder/src/fileRecord.py | 51 +++ linPEAS/builder/src/linpeasBuilder.py | 240 ++++++++++++ linPEAS/builder/src/peasLoaded.py | 26 ++ linPEAS/builder/src/peassRecord.py | 7 + linPEAS/builder/src/yamlGlobals.py | 30 ++ linPEAS/linpeas.sh | 224 ++++++------ 15 files changed, 469 insertions(+), 451 deletions(-) create mode 100644 linPEAS/builder/__init__.py create mode 100644 linPEAS/builder/__pycache__/__init__.cpython-39.pyc create mode 100644 linPEAS/builder/__pycache__/linpeas_builder.cpython-39.pyc create mode 100644 linPEAS/builder/src/__pycache__/fileRecord.cpython-39.pyc create mode 100644 linPEAS/builder/src/__pycache__/linpeasBuilder.cpython-39.pyc create mode 100644 linPEAS/builder/src/__pycache__/peasLoaded.cpython-39.pyc create mode 100644 linPEAS/builder/src/__pycache__/peassRecord.cpython-39.pyc create mode 100644 linPEAS/builder/src/__pycache__/yamlGlobals.cpython-39.pyc create mode 100644 linPEAS/builder/src/fileRecord.py create mode 100644 linPEAS/builder/src/linpeasBuilder.py create mode 100644 linPEAS/builder/src/peasLoaded.py create mode 100644 linPEAS/builder/src/peassRecord.py create mode 100644 linPEAS/builder/src/yamlGlobals.py diff --git a/linPEAS/builder/__init__.py b/linPEAS/builder/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/linPEAS/builder/__pycache__/__init__.cpython-39.pyc b/linPEAS/builder/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b066e4e5f4e600ca06ce3e4385b5929e193d511 GIT binary patch literal 186 zcmYj~F$w}P6hyONA;KQSBKt2OqJ^ypi*=0Ik9^1`%l}!$TX+r6;tgy)f}NE~r33SZ znPzNV&s5gUJq{&b1^=pYS!K&4qf@P#SKGVdGXL-~uoq+jXW2(-ddrCdoG8J-bS94{ z)F{q+nlTh9`3@P3p+L!)X1G45i#~Rv$7MNwXR9yO CwK3KJ literal 0 HcmV?d00001 diff --git a/linPEAS/builder/__pycache__/linpeas_builder.cpython-39.pyc b/linPEAS/builder/__pycache__/linpeas_builder.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e0850cbcf2e7326a68ce620e19bedf3de09697f GIT binary patch literal 492 zcmYjNy-EW?5T3ce93e?z=^I>eIj|Pdh+POmu-WEZZ`ZK6_rvZ*5t1rCh?c&Hjc<_F z%2%**_7Xw{=3~Cu*>CuU4~KoA_$t2dBLw(yGGP= zo)WaMfi<+af(@>5h40>nlLwN=S>hWvYy%Q%wH=q-w5rM$s?8dso|TphnMzx5&0AGhDSwf+E@f&9qng&HcBxvKX;nEp*t`8)it ecq#L|Gjs%Dr+!}6VyWeYySt4E1~>@fD8_%|{&z_L literal 0 HcmV?d00001 diff --git a/linPEAS/builder/linpeas_builder.py b/linPEAS/builder/linpeas_builder.py index f119eb0..c7ebbc3 100644 --- a/linPEAS/builder/linpeas_builder.py +++ b/linPEAS/builder/linpeas_builder.py @@ -1,344 +1,8 @@ -import os -import yaml -import re - - -CURRENT_DIR = os.path.dirname(os.path.realpath(__file__)) -LINPEAS_BASE_PATH = CURRENT_DIR + "/linpeas_base.sh" -FINAL_LINPEAS_PATH = CURRENT_DIR + "/../" + "linpeas.sh" -YAML_NAME = "sensitive_files.yaml" -FILES_YAML = CURRENT_DIR + "/../../build_lists/" + YAML_NAME - -with open(FILES_YAML, 'r') as file: - YAML_LOADED = yaml.load(file, Loader=yaml.FullLoader) - -ROOT_FOLDER = YAML_LOADED["root_folders"] -DEFAULTS = YAML_LOADED["defaults"] -COMMON_FILE_FOLDERS = YAML_LOADED["common_file_folders"] -COMMON_DIR_FOLDERS = YAML_LOADED["common_directory_folders"] -assert all(f in ROOT_FOLDER for f in COMMON_FILE_FOLDERS) -assert all(f in ROOT_FOLDER for f in COMMON_DIR_FOLDERS) - - -PEAS_FINDS_MARKUP = YAML_LOADED["peas_finds_markup"] -FIND_LINE_MARKUP = YAML_LOADED["find_line_markup"] -FIND_TEMPLATE = YAML_LOADED["find_template"] - -PEAS_STORAGES_MARKUP = YAML_LOADED["peas_storages_markup"] -STORAGE_LINE_MARKUP = YAML_LOADED["storage_line_markup"] -STORAGE_LINE_EXTRA_MARKUP = YAML_LOADED["storage_line_extra_markup"] -STORAGE_TEMPLATE = YAML_LOADED["storage_template"] - -INT_HIDDEN_FILES_MARKUP = YAML_LOADED["int_hidden_files_markup"] - - - -class FileRecord: - def __init__(self, - regex: str, - bad_regex: str=DEFAULTS["bad_regex"], - check_extra_path: str =DEFAULTS["check_extra_path"], - files: dict={}, - good_regex: str=DEFAULTS["good_regex"], - just_list_file: bool=DEFAULTS["just_list_file"], - line_grep: str=DEFAULTS["line_grep"], - only_bad_lines: bool=DEFAULTS["only_bad_lines"], - remove_empty_lines: bool=DEFAULTS["remove_empty_lines"], - remove_path: str=DEFAULTS["remove_path"], - remove_regex: str=DEFAULTS["remove_regex"], - search_in: list=DEFAULTS["search_in"], - type: str=DEFAULTS["type"], - ): - - self.regex = regex - self.bad_regex = bad_regex - self.check_extra_path = check_extra_path - self.files = [FileRecord(regex=regex,**fr) for regex,fr in files.items()] - self.good_regex = good_regex - self.just_list_file = just_list_file - self.line_grep = line_grep - self.only_bad_lines = only_bad_lines - self.remove_regex = remove_regex - self.remove_empty_lines = remove_empty_lines - self.remove_path = remove_path - self.type = type - self.search_in = self.__resolve_search_in(search_in) - - def __resolve_search_in(self, search_in): - """ Resolve spacial values to the correct directories """ - - if "all" in search_in: - search_in.remove("all") - search_in = ROOT_FOLDER - - if "common" in search_in: - search_in.remove("common") - if self.type == "d": - search_in = list(set(search_in + COMMON_DIR_FOLDERS)) - else: - search_in = list(set(search_in + COMMON_FILE_FOLDERS)) - - #Check that folders to search in are specified in ROOT_FOLDER - assert all(r in ROOT_FOLDER for r in search_in) - - return search_in - - -class PEASRecord: - def __init__(self, name, auto_check: bool, exec: list, filerecords: list): - self.name = name - self.bash_name = name.upper().replace(" ","_").replace("-","_") - self.auto_check = auto_check - self.exec = exec - self.filerecords = filerecords - - -class PEASLoaded: - def __init__(self): - to_search = YAML_LOADED["search"] - self.peasrecords = [] - for name,peasrecord_json in to_search.items(): - filerecords = [] - for regex,fr in peasrecord_json["files"].items(): - filerecords.append( - FileRecord( - regex=regex, - **fr - ) - ) - - self.peasrecords.append( - PEASRecord( - name=name, - auto_check=peasrecord_json["config"]["auto_check"], - exec=peasrecord_json["config"].get("exec", DEFAULTS["exec"]), - filerecords=filerecords - ) - ) - - -class LinpeasBuilder: - def __init__(self, ploaded:PEASLoaded): - self.ploaded = ploaded - self.hidden_files = set() - self.bash_find_f_vars, self.bash_find_d_vars = set(), set() - self.bash_storages = set() - self.__get_files_to_search() - with open(LINPEAS_BASE_PATH, 'r') as file: - self.linpeas_sh = file.read() - - def build(self): - find_calls = self.__generate_finds() - self.__replace_mark(PEAS_FINDS_MARKUP, find_calls, " ") - - storage_vars = self.__generate_storages() - self.__replace_mark(PEAS_STORAGES_MARKUP, storage_vars, " ") - - #Check all the expected STORAGES in linpeas have been created - for s in re.findall(r'PSTORAGE_[\w]*', self.linpeas_sh): - assert s in self.bash_storages, f"{s} isn't created" - - #Replace interesting hidden files markup for a list of all the serched hidden files - self.__replace_mark(INT_HIDDEN_FILES_MARKUP, self.hidden_files, "|") - - #Check if there are duplecate peass marks - peass_marks = self.__get_peass_marks() - for i,mark in enumerate(peass_marks): - for j in range(i+1,len(peass_marks)): - assert mark != peass_marks[j], f"Found repeated peass mark: {mark}" - - #Generate autocheck sections - sections = self.__generate_sections() - for section_name, bash_lines in sections.items(): - mark = "peass{"+section_name+"}" - assert mark in peass_marks, f"Mark {mark} wasn't found in linpeas base" - self.__replace_mark(mark, list(bash_lines), "") - - #Check that there aren peass marks left in linpeas - peass_marks = self.__get_peass_marks() - assert len(peass_marks) == 0, f"There are peass marks left: {', '.join(peass_marks)}" - - self.__write_linpeas() - - - def __get_peass_marks(self): - return re.findall(r'peass\{[\w\-\._ ]*\}', self.linpeas_sh) - - - def __get_files_to_search(self): - """Given a PEASLoaded and find the files that need to be searched on each root folder""" - self.dict_to_search = {"d": {}, "f": {}} - self.dict_to_search["d"] = {r: set() for r in ROOT_FOLDER} - self.dict_to_search["f"] = {r: set() for r in ROOT_FOLDER} - - for precord in self.ploaded.peasrecords: - for frecord in precord.filerecords: - for folder in frecord.search_in: - self.dict_to_search[frecord.type][folder].add(frecord.regex) - - if frecord.regex[0] == "." or frecord.regex[:2] == "*.": - self.hidden_files.add(frecord.regex.replace("*","")) - - - def __generate_finds(self) -> list: - """Given the regexes to search on each root folder, generate the find command""" - finds = [] - for type,searches in self.dict_to_search.items(): - for r,regexes in searches.items(): - if regexes: - find_line = f"{r} " - - if type == "d": - find_line += "-type d " - bash_find_var = f"FIND_DIR_{r[1:].replace('.','').upper()}" - self.bash_find_d_vars.add(bash_find_var) - else: - bash_find_var = f"FIND_{r[1:].replace('.','').upper()}" - self.bash_find_f_vars.add(bash_find_var) - - find_line += '-name \\"' + '\\" -o -name \\"'.join(regexes) + '\\"' - find_line = FIND_TEMPLATE.replace(FIND_LINE_MARKUP, find_line) - find_line = f"{bash_find_var}={find_line}" - finds.append(find_line) - - return finds - - def __generate_storages(self) -> list: - """Generate the storages to save the results per entry""" - storages = [] - all_f_finds = "$" + "\\n$".join(self.bash_find_f_vars) - all_d_finds = "$" + "\\n$".join(self.bash_find_d_vars) - all_finds = "$" + "\\n$".join(list(self.bash_find_f_vars) + list(self.bash_find_d_vars)) - - for precord in self.ploaded.peasrecords: - bash_storage_var = f"PSTORAGE_{precord.bash_name}" - self.bash_storages.add(bash_storage_var) - - #Select the FIND_ variables to search on depending on the type files - if all(frecord.type == "f" for frecord in precord.filerecords): - storage_line = STORAGE_TEMPLATE.replace(STORAGE_LINE_MARKUP, all_f_finds) - elif all(frecord.type == "d" for frecord in precord.filerecords): - storage_line = STORAGE_TEMPLATE.replace(STORAGE_LINE_MARKUP, all_d_finds) - else: - storage_line = STORAGE_TEMPLATE.replace(STORAGE_LINE_MARKUP, all_finds) - - #Grep by filename regex (ended in '$') - bsp = '\\.' #A 'f' expression cannot contain a backslash, so we generate here the bs need in the line below - grep_names = f" | grep -E \"{'|'.join([frecord.regex.replace('.',bsp).replace('*', '.*')+'$' for frecord in precord.filerecords])}\"" - - #Grep by searched folders - grep_folders_searched = f" | grep -E \"^{'|^'.join(list(set([d for frecord in precord.filerecords for d in frecord.search_in])))}\"".replace("HOMESEARCH","GREPHOMESEARCH") - - #Grep extra paths. They are accumulative between files of the same PEASRecord - grep_extra_paths = "" - if any(True for frecord in precord.filerecords if frecord.check_extra_path): - grep_extra_paths = f" | grep -E '{'|'.join(list(set([frecord.check_extra_path for frecord in precord.filerecords if frecord.check_extra_path])))}'" - - #Grep to remove paths. They are accumulative between files of the same PEASRecord - grep_remove_path = "" - if any(True for frecord in precord.filerecords if frecord.remove_path): - grep_remove_path = f" | grep -v -E '{'|'.join(list(set([frecord.remove_path for frecord in precord.filerecords if frecord.remove_path])))}'" - - #Construct the final line like: STORAGE_MYSQL=$(echo "$FIND_DIR_ETC\n$FIND_DIR_USR\n$FIND_DIR_VAR\n$FIND_DIR_MNT" | grep -E '^/etc/.*mysql|/usr/var/lib/.*mysql|/var/lib/.*mysql' | grep -v "mysql/mysql") - storage_line = storage_line.replace(STORAGE_LINE_EXTRA_MARKUP, f"{grep_remove_path}{grep_extra_paths}{grep_folders_searched}{grep_names}") - storage_line = f"{bash_storage_var}={storage_line}" - storages.append(storage_line) - - return storages - - - - def __generate_sections(self) -> dict: - """Generate sections for records with auto_check to True""" - sections = {} - - for precord in self.ploaded.peasrecords: - if precord.auto_check: - section = f' print_2title "Analizing {precord.name} Files (limit 70)"\n' - - for exec_line in precord.exec: - if exec_line: - section += " " + exec_line + "\n" - - for frecord in precord.filerecords: - section += " " + self.__construct_file_line(precord, frecord) + "\n" - - sections[precord.name] = section - - return sections - - def __construct_file_line(self, precord: PEASRecord, frecord: FileRecord, init: bool = True) -> str: - real_regex = frecord.regex[1:] if frecord.regex.startswith("*") else frecord.regex - real_regex = real_regex.replace("*",".*").replace(".","\\.") - real_regex += "$" - - analise_line = "" - if init: - analise_line = 'printf "%s" "$PSTORAGE_'+precord.bash_name+'" | grep -E "'+real_regex+'" | while read f; do ls -ld "$f" | sed -${E} "s,'+real_regex+',${SED_RED},"; ' - - #If just list, just list the file/directory - if frecord.just_list_file: - if frecord.type == "d": - analise_line += 'ls -lRA "$f";' - analise_line += 'done; echo "";' - return analise_line - - if frecord.type == "f": - grep_empty_lines = ' | grep -IEv "^$"' - grep_line_grep = f' | grep -E {frecord.line_grep}' if frecord.line_grep else "" - grep_only_bad_lines = f' | grep -E "{frecord.bad_regex}"' if frecord.bad_regex else "" - grep_remove_regex = f' | grep -Ev "{frecord.remove_regex}"' if frecord.remove_regex else "" - sed_bad_regex = ' | sed -${E} "s,'+frecord.bad_regex+',${SED_RED},g"' if frecord.bad_regex else "" - sed_good_regex = ' | sed -${E} "s,'+frecord.good_regex+',${SED_GOOD},g"' if frecord.good_regex else "" - - if init: - analise_line += 'cat "$f" 2>/dev/null' - else: - analise_line += 'cat "$ff" 2>/dev/null' - - if grep_empty_lines: - analise_line += grep_empty_lines - - if grep_line_grep: - analise_line += grep_line_grep - - if frecord.only_bad_lines and not grep_line_grep: - analise_line += grep_only_bad_lines - - if grep_remove_regex: - analise_line += grep_remove_regex - - if sed_bad_regex: - analise_line += sed_bad_regex - - if sed_good_regex: - analise_line += sed_good_regex - - analise_line += '; done; echo "";' - return analise_line - - #In case file is type "d" - if frecord.files: - for ffrecord in frecord.files: - ff_real_regex = ffrecord.regex[1:] if ffrecord.regex.startswith("*") else ffrecord.regex - ff_real_regex = ff_real_regex.replace("*",".*") - analise_line += 'for ff in $(find "$f" -name "'+ffrecord.regex+'"); do ls -ld "$ff" | sed -${E} "s,'+ff_real_regex+',${SED_RED},"; ' + self.__construct_file_line(precord, ffrecord, init=False) - - analise_line += 'done; echo "";' - return analise_line - - - def __replace_mark(self, mark: str, find_calls: list, join_char: str): - """Substitude the markup with the actual code""" - self.linpeas_sh = self.linpeas_sh.replace(mark, join_char.join(find_calls)) #New line char is't needed - - def __write_linpeas(self): - """Write on disk the final linpeas""" - with open(FINAL_LINPEAS_PATH, "w") as f: - f.write(self.linpeas_sh) - +from .src.peasLoaded import PEASLoaded +from .src.linpeasBuilder import LinpeasBuilder +#python3 -m builder.linpeas_builder def main(): ploaded = PEASLoaded() lbuilder = LinpeasBuilder(ploaded) diff --git a/linPEAS/builder/src/__pycache__/fileRecord.cpython-39.pyc b/linPEAS/builder/src/__pycache__/fileRecord.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6358e3665f2ac63033b24b6a55569987e7dc6729 GIT binary patch literal 1989 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 W=tsuQ_zG_^Is>g_fE4t5xA6b-Xt z9iXy*G98<#YHoGkR}^AlXC|0l#*CYmBGblWvzf@bvP3F7VdEsCR4!QkmZ4h6X}AK_ znub)@;@tX&6CLX!SF1L8#Xga#`ij&#n7>4DpoP*w%#oAB=0TE{!AzxZpu0p2 zgpQeHWm@C|_EzX369XNqbXMwtoER(yk jIAl`S6RXEiBiyKB$yK(L@$WayJ+ND?ZQ(BN;x+OY`A+Pw literal 0 HcmV?d00001 diff --git a/linPEAS/builder/src/__pycache__/peassRecord.cpython-39.pyc b/linPEAS/builder/src/__pycache__/peassRecord.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8610b94a66993f0f9c24b455e24f658d05f536e9 GIT binary patch literal 652 zcmY*Xv5pfl5Vd!`xezWCM@NCEkWy^6qeAEqLUa-0M3cri_T#9*+dsck}DRQz^u6b`C8k=ahgaL~n!>PF@qP zvbk{CnV963;&)7ucS^v=L?GtUiFpP&C{RxR$X(|0Yc(&NqUs`z-oAc$_6}?v-6T&V z)3vp>7hpdo1(#sc{iP2OcX_l0eeu?K&r+`l_>8ERz0kxrawBdsCtbG5XeGf-Mwz^4 zR((!f^on@k1YJSRw(?1mdMnGxQBrHOf>d-(12G*%Xo9gYzqc@Wp*a;ZQi?p3$l}z1 zLI}$^6R-8qzi)&$e~dR>|?fb|MW zw9z*$me~0gs^Hf=sA|#q;2>5QZPkE5+>dVBd`&~G{o1!$^EGhys&XJ75eD+x!~bKR z-kzIH23*8#X`Mz|uWHu?-XClIsWahUMlI?(Bo#ci@d5YAZ5_~faMd4z_zQ+@oPGcR literal 0 HcmV?d00001 diff --git a/linPEAS/builder/src/__pycache__/yamlGlobals.cpython-39.pyc b/linPEAS/builder/src/__pycache__/yamlGlobals.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0637651d10cb6e419428f339b2f0d429d0a074f2 GIT binary patch literal 1450 zcmbVLOK;;g5GG~CmS2fqYbSjGy#{Ek?R~MRx>k1G`VrVpyGx)@6_ZZ1r6rY=(RyZfh3+x`p#Nck{s3Nk>bbX`I+QJAb1fy#$N7dc8V*N(wOT?j-qCm8txbgf(#re8 z0_AgY&1~I`5y*7T&rP5@3Z}D49@+?n{4k87>TnAAT))w6(MbPsd#EPJo zSecb*VQu{O38^sry2`ZNr`E3qIrs*?VImW)a~OrS&yc)%jBxtA0?7_&@d%L`UJ|M(L9jDbB!+2)r0Gi48G4SXJfZym4=*Z}MRHUSR- zTYyJ^j{rXaYy*A>*a7^A;wd^l{99LRbl0@IU7H7C%zWux_>y(y)m=f8@ZOcS7EQJ! z3uTZ5*UVc4oXPI3zvOrA?N-=*u?jf#cpwvLD=dz&$`2x+GC?XLiV|-TaZsePC|md| zo=DQ1N6TdtrtvZ}Ioy&o5Nw`A;x@C);U;&(fK?9W9Hwl8c!R#({|Udr3A#pKL&bkE zD4L>sJi5oKJQhL6CZSw~HX8(u31| zzlupsYj9N|%b04)By1VOIT>lCJ`&3BU$UKBb4xt%JbFN~n?(3o&{}5N#q9)P;#~!l zvdyh$p^raSMkI-;Yo^TDPp(t}8X)wSOj&~YJf$pe(<&Y*KRcgH+|kVI^(Ul0=#O;u zy)T@p>zz5X7o>68A2|arGo)Pcl`|Z8BWLK6(rJI-PCZR1Gm2TLOx@GUYNW|Q`LMn9uCJNPY2s}*HksOBqX-uaz5vzo~8(S^`_p? znS6DAMrvBqNxB(RO_`ZHJR3MOm$Xu!>1;f4o