
UNIX系ファイルシステム上で特定のプロパティを持つファイルを効率的に検索するPythonスクリプト(findより高速)
ペネトレーションテスト中にリモートマシンへのアクセスを獲得した後、特権昇格を試みるために、興味深い設定ファイルやバイナリを探したいと思うかもしれません。
このスクリプトは自己完結型で、Python3 と Python2.7 の両方で動作します。そのため、最近のマシン(デフォルトで python2 を同梱していない)と、それほど最近ではないマシンの両方と互換性があります。
複数の find コマンドを実行する代わりに、このシンプルなスクリプトはディスクツリー全体を1回走査するだけで、すべての述語(ファイルにのみ適用される述語の場合は _p または _filep で終わる関数)を適用して、それらを追跡します。
まだ WIP(作業中)ですが、コードは非常にタイトで、独自の述語を書くのはとても簡単です。ファイルパスを受け取りブール値を返す関数であればよいのです。
最後に、すべてのファイルセットは d という辞書に保存され、そのキーは述語名です。アクセスするには、単に python3 -i diskwalk.py を実行してください。python の REPL が起動し、これらは python のセットなので、次のような操作を簡単に行えます。
d['executable_files'] & d['writable_files']
書き込み可能かつ実行可能なファイルのセットを取得するには
d['executable_files'] - d['readable_files']
実行可能だが読み取り不可のファイルを取得するには
d['owned_by_nobody_dirs'] | d['owned_by_nobody_files']
nobody ユーザーが所有するディレクトリとファイルの和集合を取得するには
取得したデータは pickle 化および圧縮されたファイル dump.gz に保存されます。引数としてそれを指定して読み込むだけで、ディスクの再スキャンを避けることができます。
python -i diskwalk.py dump.gz
python の pickle の仕組み上、通常の注意事項が適用されます。例えば、ファイルを生成するために使用した python インタプリタとは異なる python インタプリタで、この同じファイルを読み込むことはできません。