Skip to content

Instantly share code, notes, and snippets.

@EspressoCake
Created September 21, 2023 18:01
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save EspressoCake/f3588fc339b5b681002d06df41c7e977 to your computer and use it in GitHub Desktop.
Save EspressoCake/f3588fc339b5b681002d06df41c7e977 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
from neo4j import GraphDatabase
import datetime
class Neo4j(object):
def __init__(self, ip: str = "", port: int = 0, username:str = "", password: str = "") -> None:
self.driver = GraphDatabase.driver(f'bolt://{ip}:{port}', auth=(username, password))
self.session = self.driver.session()
self.query = '''
MATCH (n) WHERE NOT n.objectid="!!!!! REPLACE ME !!!!!"
WITH n
MATCH p=shortestPath((g:Group {objectid: "!!!!! REPLACE ME !!!!!"})-[rels:MemberOf|AddSelf|WriteSPN|AddKeyCredentialLink|AddMember|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner|Owns*1..]->(n))
UNWIND p as pathing
RETURN STARTNODE(RELATIONSHIPS(pathing)[0]).name as Start,
ENDNODE(RELATIONSHIPS(pathing)[-2]).name as Intermediary,
LABELS(ENDNODE(RELATIONSHIPS(pathing)[-1]))[0] as EndObjectType,
ENDNODE(RELATIONSHIPS(pathing)[-1]).name as End,
type(RELATIONSHIPS(pathing)[-1]) as RelationshipType,
size(RELATIONSHIPS(pathing)) as ChainSize
ORDER BY ChainSize DESC, EndObjectType ASC, RelationshipType ASC
'''
def close(self):
self.driver.close()
def runTransitiveQuery(self) -> list:
self.resultantdata = list(self.session.run(self.query))
self.close()
if self.resultantdata:
# Generate a pseudo-header to parse
listObject = ['\t'.join(self.resultantdata[0].keys()) ]
for objectInstance in self.resultantdata:
listObject.append('\t'.join([str(item) if item != None else "N/A" for key, item in objectInstance.items()]))
filename = f'{datetime.datetime.now().timestamp()}_TransitiveObjects.txt'
with open(filename, 'w') as file:
file.write('\n'.join(listObject))
print(f'Completed: {filename}')
def main():
neo4jdb = Neo4j(ip='127.0.0.1', port=7687, username='neo4j', password='!!! REPLACE ME !!!')
neo4jdb.runTransitiveQuery()
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment