電脳ミツバチのコンピュータ広報室

銀座の屋上菜園を耕しています。コンピュータ畑も耕します。

セキュリティに疎い昨今だからこそ必読!「ハッカーの学校」恵贈いただきました。

古い友人のIPUSIRONさんから2015/1/23に新しく出された本「ハッカーの学校」を恵贈いただきました。

 

f:id:computermonkey:20150126113825j:plain


Amazon.co.jp: ハッカーの学校: IPUSIRON: 本

 

IPUSIRONさんはインターネット黎明期にセキュリティアカデメイアという膨大なセキュリティ情報を集めたサイトを立ち上げ、そこでは当時のどうしようもないコンピュータマニア達が日夜掲示板で数学から哲学まで様々な話題を議論していました。(現在は掲示板は消滅しているようです)

FrontPage - Security Akademeia

個人的な私見ではIPUSIRONさんはごりごりプログラムを書くハッカーというより図書館の司書ような立ち位置でいつも私たちが突拍子もなく話すむちゃくちゃな話題に丁寧に答えていただいていた記憶があります。当時のメンバーとはその後全くコンタクトは取っていませんがざっと調べてみると金床さんや愛甲健二さんなどはそのままセキュリティ業界に進まれているようです。

たのしいバイナリの歩き方:書籍案内|技術評論社 

Webサイトのセキュリティ対策 - 株式会社ビットフォレスト


現在は業界の人たちの努力により、日常セキュリティに関してほとんど意識する必要がありません。少し前でドキドキしながら入力していたネットショップの情報も今はそれほど抵抗なく入力するのではないでしょうか?そんな昨今だからこそセキュリティとは何か、を問いただす必要があるかと思います。

 

 

さて、早速いただいた本を拝見すると流石に10年以上もたってkaliやmetasploitなどだいぶ新しい技術が出ているようです。

 

kaliはペネトレーションテストを行うことに特化したlinuxOSです。クラッカーなどはこれを利用して他人を攻撃したりします。

https://www.kali.org

metasploitはexploitと呼ばれるプログラムの脆弱性をついたプログラムを扱うプラットフォームでこれにより以前は①ターゲットホストの設定→②exploit→③シェルコードをペイロードに乗せると一つ一つセッティングしなければならなかった攻撃が一連のコマンドで1000以上のexploitをターゲットホストに送ることができるようになりました。さらにポートスキャンソフトなどと合わせ、ターゲットのOS,Webサーバなどのバージョンを確認した後、これらexploitの中から該当するexploitを自動的に抽出し、その全てのexploitを総当たりでターゲットに送りこむことも可能です。もちろん私は他人にそういうことはしませんが現在amazonEC2などのサーバを仮想化して立ち上げることができるので、IPhoneなどのスマートフォンからec2のバージニアにあるlinuxサーバを立ち上げそこにインストールしたポートスキャンやmetasploitを自動的に動かすコマンドを叩き、全く何もないところから電車に乗りながら15分以内にターゲットホストに1000個以上のexploitを送り込み煙のように消えることも可能です。

Penetration Testing Software | Metasploit

 

 

その他cain&abelなどの項目も見受けられますが現在多分windowsでcainなんかを使うとその場でウィルスソフトが騒ぎ出すのではないでしょうか?

セキュリティを目指す方は全部知っていた方が良い知識だと思います。とりわけ現在はexploitもほとんど役に立たない時代なのでロストテクノロジー的な感じでしょうが古いサーバを使っているところなどはこれをみて如何に脅威が潜んでいるかを知れる良い本だと思います。 

 

 当時最も恐ろしいといわれFBIに逮捕されたケビンミトニックというクラッカーも得意だったのはソーシャルエンジニアリングといういわゆる物理クラックです。

電子データが複雑になればなるほど疎かになるのはそれを扱う窓口のセキュリティスキルです。(amazonなども日夜パスワードを聞きにくるクラッカーが多く大分苦労されているようです。)

敵を知り、己を知らば百戦危うからずという言葉の通り、IPUSIRONさんならではの膨大な知識の中から敵の攻撃に関するきちんとした知識を身につけ、皆様のビジネスに必要な対策されると良いのではないでしょうか?


Amazon.co.jp: ハッカーの学校: IPUSIRON: 本

facebookなりすまし業者の犯人特定までの一連の流れ

昨年facebookでなりすましが流行ったのを覚えておりますでしょうか?

その犯人とふとしたきっかけで出会い、ちょっとした調査で犯人が特定できたのが一年前。近年なりすまし事体が無くなったためそろそろ公開してもよいだろうと投稿を踏み切りました。

 

ことの始まりは2013年夏、私のfacebookの友人がなりすましにあったのがきっかけでした。そのなりすましは例のごとく友達の友達、つまり私に友達申請を送ってきました。私は一度承認し、彼にメッセージを送ってみました。彼からの返事はありませんでした。

 

何日も何日も経った時、ふと私のPCが不審なパケットを受信しました。

 

f:id:computermonkey:20140825115941j:plain



というのも私はパケットを眺めるのが趣味で時間があると大体ボーっと流れるパケットを見つめています^^;垂れ流しているパケットから、明らかに特権上昇を模索している人がいました。

私は慎重に該当ポートを閉じ、ルータのログをオンにして攻撃を待ちました。

f:id:computermonkey:20140825120123j:plain

 

ほどなくして彼からのポートスキャンが行われました。

f:id:computermonkey:20140825120232j:plain

 

いろんなゾンビを使っているようですが80番ポートからアタックをしているのが気になりました。ひょっとしてwebサーバからブラウザを使ってアタックできるようにしているのか。そう考えた私はブラウザで手当たり次第アクセスしたところ、そのうちの一つで多分便利用に使っているファイル置き場を発見しました。

f:id:computermonkey:20140825120524j:plain

 

amebloとかsystemとか怪しいフォルダがいっぱいありますが、興味深いのはfacebookです。この時点でもしかしたらfececbookでメッセージを送ってみた人の攻撃かもと思い調べてみました。

 

f:id:computermonkey:20140825120701j:plain

 

するとfecebookのアカウントリストと書かれた1.2Gものデータベースファイルがおいてありました。ダウンロードして適当なwebサーバを立ち上げてデータベースに流してみました。

 

f:id:computermonkey:20140825120842j:plain

 

そこにはアドレス、パスワード、苗字、名前、などのセットがおよそ100万件入っていました。最初それは私にしたことを他の人にもして何らかの方法で回収したリアルデータなのかと思いました。しかしよく見ると漢字の名前、カタカナの名前と英語の名前が一致していないなど結構適当なデータでした。
 調べるとそこにはfacebookでなりすましをされた友人の名前が入っていました。
そのカラムにあるアドレスとパスワードをfacebookのサイトで入力し見ると…

f:id:computermonkey:20140825120957j:plain

 

このアカウントはロックされています。つまり本当に使われていたデータだということがわかりました。さらに調べてみると...

 

f:id:computermonkey:20140825121220j:plain

[C:Dropbox1 CODE DATA ARIMURAxxxxxxxPHOTO 02245.jp]

photoカラムがdropboxと連動しており、あろうことか犯人の名前がそのまま出ておりました。ほかのページに犯人が作っているゲームの情報と合わせgoogleに問い合わせたところ実在する人だということがわかりました。

その後、愛宕警察署のサイバー犯罪の担当に電話してこの事件は幕を閉じます。というか警察もこういったことはあまりよく分からないらしく、正直にいうと現在も放置され、今も彼の会社のHPにアクセスするとWORKというスタイリッシュなタブの下にSNSを活用した宣伝広告と書いて仕事されているようです。(私が知らないだけで注意くらいはいっているのかも知れませんが)

特に犯人に思い入れがあるわけでもないので私も追求もせず、放置しておりましたが一年たって思い出したので投稿させていただきました。

 

 

ではまた。

 

 

Twitterのツイートを利用してwordpressで全自動の多言語対応型まとめサイトを作る方法まとめ

今日はwordpressを利用して銀座の情報をまとめたまとめサイトを作りました。

 
 

f:id:computermonkey:20141203091750p:plain

このサイトはTwitterのツイートをwordpressに流し込んで全自動で更新するマイクロブログ型のまとめサイトとなっています。
 
Twitterのツイートをブログ化するメリットは
  • 検索に引っかかる
  • wordpressのplug-inで多言語対応出来る
  • wordpressのplug-inやタグ機能で訪問された方が関連情報を素早く情報収集して頂ける
  • 広告が自由に設定出来る
などが挙げられます。
 
 
何かのお役に立つか分かりませんが簡単な覚書を残しておきます。
 
 
まずwordpressを用意します。私はamazonのec2を利用しましたがwordpressがあればなんでも大丈夫だと思います。
次にテーマをデフォルトで入っているtwentytwelveに変更します。
 
f:id:computermonkey:20141203052113j:plain
 
 
デフォルトのテーマでマイクロブログ型の最も使いやすテーマかと思います。
 
さて、ここでwordpressにOzh' Tweet Archiverというplug-inを入れます。
 
 
これがTwitterのツイートをwordpressに流し込んでくれます。更に自動でタグ機能やイメージまで貼り付けてくれます。
 
しかしながら少し問題があり、タイトルとコンテンツに全く同じ文章を流し込むのでこのままでは使えません。そこで使えるようにする方法は
 
  • タイトル欄にコンテンツを表示させて通常のコンテンツ欄のコンテンツは消す
という操作が必要になります。
 
具体的にはtwentytwelveのテーマのフォルダのcontent.phpを開きます。
そこで25行目付近のthe_title()をthe_content()に変更します。
 
f:id:computermonkey:20141203054129j:plain
f:id:computermonkey:20141203105158j:plain
 
これによりタイトル部分でイメージやリンクを表示してもらえるようになりました。
続いてコンテンツ部分はいらないので消してしまいます。
同じくcontent.phpの43-46行目付近の
<div class="entry-content">〜</div>
までを削除してしまいます
 
f:id:computermonkey:20141203055228j:plain
 
これでタイトル部分で完結するマイクロブログが完成しました。
 
 
さて、この後はコンテンツ部分で関連情報を表示させます。これにはwordpressのplug-inでYet Another Related Posts Plugin (YARPP) というのを入れます。
 
 
 
これで関連情報をコンテンツ内で表示することが出来ました。設定からタグとタイトルで関連情報収集を選択します。
 
f:id:computermonkey:20141203105553j:plain
 
 
特にタグ機能での関連情報収集が優秀なので最初は過去の投稿のタグを編集してやると精度が上がります。
 
ついでですので多言語対応しましょう。
これはwordpressのplug-inでGoogle Language Translatorというのがあります。
 
 
f:id:computermonkey:20141203092808j:plain 
 
何語だろうと一瞬で翻訳してくれます^^
 
ウィジェットで表示しても良いですがどうせならヘッダー部分で国旗を貼りたいですよね。
そこでwordpress設定画面で言語の編集をした後、
header.phpの45行目付近のタイトル部分での後に
 
<?php echo do_shortcode('[google-translator]'); ?>   
と挿入するだけで国旗を表示できます
 
 f:id:computermonkey:20141203104531j:plain
 
以上でTwitterのツイートを利用した多言語対応型マイクロブログの完成です。
 
やってみて驚いたのはwordpressのとてつもない優秀さでした。
一から作ってたのでは到底週末が幾つあっても足りないはずでしたが実際のところ2日程度で作る事が出来ました。
wordpress万歳^^
 

【サイト】自動翻訳掲示板ー10ちゃんねる

2年ほど前に職場で思いついてさっと作ってみました。

10ch/10ちゃんねる


f:id:computermonkey:20150211190151j:plain

それは2ちゃんねるの住人と4chanの住人(英語圏2ちゃんねるのようなところ)を交流させたら面白いんじゃないかということだでした。

お互いの趣味嗜好は一致しており唯一の問題は言語の壁だけでした。

そこで日本語で書けば英語で、英語で書けば日本語に自動で翻訳するあめぞう掲示板を作ることにしました。

この時使った翻訳APIはgoogleAPI。

日本語ー英語の精度は低かったが、日本語ー韓国語の精度は語順が同じため、完璧で全く翻訳を意識させないくらい上出来でした。

早速日本は2ちゃんねるで、英語圏4chanで、韓国語圏はThredicで呼びかけました。

結果は恐ろしいくらい順調ですぐに一日10000PVを超える人々が集まりました。


こだわった点は4つ。

  • 投稿する前に翻訳の出来を知ることで少しでも正確な翻訳にしたいという要望から翻訳チェックボタンを作って投稿前におおよそ確認できるようにした
  • 2ちゃんねるを真似てascii artを書く人が多く、翻訳すると崩れてしまうのでメール欄にascii art と書くと翻訳されない機能を付けた
  • 炎上しているスレッドを一般の方がメール欄にgironと書くとスレッドごと飛ばせる機能などを盛り込んだ。因みにこのスレッドを飛ばす機能で4chanのanonymousを名乗る外人に荒らされまくった
  • 書いた人がどの国籍か分かる国籍判別機能。プロクシなどを刺すと偽装できるのでまぁ参考程度。日本人と外国人を半々にするのが難しかったが、そのうち日本人同士が英語で、外国人同士が日本語で盛り上がったりしてあまりこだわらなくなった


しかしGoogleAPIが有料化するとともにMicrosoftAPIに移行し、自動翻訳の精度も落ちたところで韓国と日本の常時炎上する歴史問題や竹島スレッドに対処するのが面倒臭くなり放置してしまいました。

いまはほとんど人がいなくなってしまったけどたまに思い出したように書き込みがあるのでまた気が向いたら集客してみようと思います。

使った言語はPerl




10ch/10ちゃんねるはこちら


【動画】複雑ネットワーク・3次元コンタクトプロセス

9年ぶりに復活したので投稿してみる。

因みに現在はIT業界にはおらずのんびり?銀座で農業やってます^^

複雑ネットワークモデル・3次元コンタクトプロセス

一定確率で隣接する個体が感染し、一定期間過ぎると元に戻る。700個から始まって1­%の感染率の場合と15個から始まって10%の感染率の場合を3次元でモデル化しました。コン­タクトプロセスはある一点の感染率と治癒率(ティッピングポイント)を境に完全にウィ­ルスが浄化するかパンデミックを起こすかが決まります。

昔遊びでDirectXで作ってみました^^


友愛数判定

友愛数判定に挑戦してみる。
友愛数とは例えば220や284などで220の約数は1,2,4,5,10,11,20,22,44,55,110で合計すると284。同様に284の約数は1,2,4,71,142で合計で220である。
このように約数が互いを示す数のことを友愛数とよび、ピタゴラスが発見した。しかしながら2組目はピエール・ド・フェルマーが1636年に17296と18416を発見するまで見つかっておらず、数学者など数を愛する人たちに神秘的な数としてよく数学者の物語などに
登場する。最近では「博士の愛した数式」等に出てきてちょっとした話題になった。
現在数百種類見つかっている。因みに現在の2番目に小さい数は1184と1210で16歳のイタリア人学生が見つけた。

さて、ともかくまず約数を判定するコードが無ければならない。
掛ける数と掛けられる数をiとjとし、
二重ループでi*j==Nの時にiとjを足すことにする。

/*約数判定*/

#include<stdio.h>
#define N 18416
main()
{
	int i,j;/*jが掛けられるほう*/
	int divsum=0;
	for(i=1;i<N&&i*i<=N;i++)/*i*iがNを超えたらそれ以上は鏡なので無意味*/
	{
		for(j=N;j>=i;j--)
		{		
			if(N==i*j)
			{
				printf("%d,%d\n",i,j);
				if(i!=j)/* iとjが同じなら同じ数字を二回足してしまう*/
					{divsum=divsum+i+j;}
					else
					{divsum=divsum+i;}
			}
			
		}
	
	}
	divsum-=N;/*約数合計にNを含んでいるので消す*/
	printf("%d\n",divsum);
}

結果

Nを284
1,284
2,142
4,71
220

Nを220
1,220
2,110
4,55
5,44
10,22
11,20
284

Nを18416
1,18416
2,9208
4,4604
8,2302
16,1151
17296

何とかうまくいっている模様。
コツはi==jになってしまったらどちらか一方を足すことにすることと、
最後に必ず1*N=NというNが入ってしまうので引いてあげる。

さて、次に2つの約数を混ぜるにはどうしたらよいだろうか・・?
一番簡単なのは2つ並べて最後に2つが友愛数であるか判定する。
処理にオーバーヘッドがかかりすぎだが出来ないよりはずっといいのでとりあえずやってみる。

/*友愛数判定*/

#include<stdio.h>
#define N 18416
#define M 17296
main()
{
	int i,j;/*jが掛けられるほう*/
	int divsum=0,divsum2=0;
	for(i=1;i<N&&i*i<=N;i++)/*i*iがNを超えたらそれ以上は鏡なので無意味*/
	{
		for(j=N;j>=i;j--)
		{		
			if(N==i*j)
			{
				printf("%d,%d\n",i,j);
				if(i!=j)/* iとjが同じなら同じ数字を二回足してしまう*/
					{divsum=divsum+i+j;}
					else
					{divsum=divsum+i;}
			}
			
		}
	
	}
	divsum-=N;/*約数合計にNを含んでいるので消す*/
	printf("%d\n\n",divsum);
	

	for(i=1;i<M&&i*i<=M;i++)/*i*iがNを超えたらそれ以上は鏡なので無意味*/
	{
		for(j=M;j>=i;j--)
		{		
			if(M==i*j)
			{
				printf("%d,%d\n",i,j);
				if(i!=j)/* iとjが同じなら同じ数字を二回足してしまう*/
					{divsum2=divsum2+i+j;}
					else
					{divsum2=divsum2+i;}
			}
			
		}
	
	}
	divsum2-=M;/*約数合計にNを含んでいるので消す*/
	printf("%d\n",divsum2);

	if(divsum==M&&divsum2==N)
		puts("友愛数です。");
	else if(divsum==M||divsum==N)
		puts("準友愛数です。");
	else
		puts("友愛数ではない");
	
	
}
結果
1,18416
2,9208
4,4604
8,2302
16,1151
17296

1,17296
2,8648
4,4324
8,2162
16,1081
23,752
46,376
47,368
92,188
94,184
18416
友愛数です。

まあ、何とかうまく動いた。
次は1から順に調べていきたい・・何か新しい友愛数があるかも・・(99.9999.....%)無いが。w
とりあえずこの駄コードでCPU暖房機を生産する。

/*友愛数判定*/

#include<stdio.h>
#define LIMIT	1211
main()
{
	
	int i,j;
	int divsum=0,divsum2=0;
	int N,M;

	for(N=1;N<=LIMIT;N++)
	{
	for(M=1;M<=LIMIT;M++)
	{

	for(i=1;i<N&&i*i<=N;i++)
	{
		for(j=N;j>=i;j--)
		{		
			if(N==i*j)
			{
				if(i!=j)
					{divsum=divsum+i+j;}
					else
					{divsum=divsum+i;}
			}
			
		}
	
	}
	divsum-=N;
	

	for(i=1;i<M&&i*i<=M;i++)
	{
		for(j=M;j>=i;j--)
		{		
			if(M==i*j)
			{
				if(i!=j)
					{divsum2=divsum2+i+j;}
					else
					{divsum2=divsum2+i;}
			}
		}
	
	}
	divsum2-=M;

	if((divsum==M&&divsum2==N)&&N!=M)
		printf("%dと%dは友愛数です。",N,M);
		
	divsum=0;
	divsum2=0;/*初期化*/
	}
	}
	

	
}

	
	
	


結果
220と284は友愛数です。284と220は友愛数です。1184と1210は友愛数です。1210と1184は
友愛数です。 -- Press any key to exit (Input "c" to continue) --

入れ子が多すぎて他人の読む限界をおそらく超えてしまったコードになったが思考過程を辿っていけば当たり前に書ける駄コードなので解説は抜いた。
人前に出す必要があるなら関数にして分かりやすく記述する必要がある。
自分用コードなので処理の手間を少しでも短くするほうを選んだ。
まぁ1211までの中に新たな友愛数は無いことは分かった。





リスト

Lispでその名を轟かせたデータ構造リストだが、簡単に図で表すと

          • >①----->②---->③----->④

このように項目(node)の最後と次の項目の最初をつなげたものである。
つながっていると言う点では配列と同じと思うかもしれないが配列よりも優れている点として、

  1. 実行中に大きくなったり小さくなったり出来ることである。配列も可変長配列のアルゴリズムを使えば出来なくはないが、リストの場合、最大の大きさがわかっている必要すらない。これによりいくつかのデータ構造が記憶領域を共有するのに、あまり相互の大きさに注意を払わなくてよい。
  2. 項目の並べ替えが楽である。配列がいちいち全ての項目を一つづつずらさねばならないのに対して
                  ________________
         ↓              |
ー----①-----    ②----→③    ④
            |____________________↑

こんな具合に調整できる。
デメリット(リストに向いていない動作)として入れ替えが自由に行えることにより、特定の項目を参照する(search)能力が相対的に落ちる。


リストのやり方として最初と最後の点を考える。つまりダミーを置いてやるのだ
仮に最初をheadとし、終わりをzと置く(セジウィック先生流)と、これにより先頭や末尾の接点も中の要素同様に入れ替えなどの操作が可能になる。

                           __________
                ________|________  |
 head       ↓      |       |  |     z
 □--------     ①----→②    ③  ------□
            |____________________↑

①→②→③から③→①→②へと変換

リストによる挿入はもっと簡単である。

                          
                  _⑥_
 head               |  |        z
 □-------→①----→②   ③------□

①→②→③から①→②→⑥→③へと変換        

削除は書くまでも無く⑥を消す動作である。②と③を繋げればよい。
実装してみるとこうなる。

#include<stdio.h>
#include<stdlib.h>

struct node
{int key;struct node *next;};    /*最後が次の構造体をさす*/
struct node *head,*z,*t;

listinitialize()
{
	head=(struct node *)malloc(sizeof *head);
	z=(struct node *)malloc(sizeof *z);
	head->next=z;
	z->next=z;
}

deletenext(struct node *t)
{t->next=t->next->next;}

struct node *insertafter(int v,struct node *t)
{
	struct node *x;
	x=(struct node *)malloc(sizeof *x);
	x->key=v;
	x->next=t->next;
	t->next=x;
	return x;
}
main(){}

ヘッダファイルなんかに入れてやると使えるかもしれない。
ただ、リストは実装が簡単なので毎回直接書くことが多い。
特に今は何もやっていない。
説明するとリストはnode(節点)いくつかからなり、各々の接点は整数一つとリストの次のnodeを指すリンクからなる。最初にheadとzを定義して後々増やしていく又は消していくプログラム。

  • >等の意味が分からなければ構造体の項なんかを参照すればよい。

例えばhead->next->keyはリストの最初の番号をさし、head->next->next->keyはリスト二番目をさす。

この実装において与えられた項目の直前の項目を見つける操作を直接出来るようにしたものを両方向リスト(doubly linked list)という。
ただ、これを実装させると各々の項目に2つのリンクを保持しなければならないので基本操作におけるリンクの回数が2倍になる。
又この実装においてzがheadを指してぐるぐる回すことも出来る。
この時のリストのことを循環リスト(circular list)と呼ぶ。
代表的なアルゴリズムにJosephus problemがある。

配列での実装

配列はコンピュータの記憶装置で直接実現できるので配列でデータ構造を実現する方法を調べればより低レベルでの実現できる。
ここで並列的配列を用いると便利なことが多い。
これは一つの配列の添え字の部分にさらに配列を入れるというもの。
例えばkey[next[head]]が一番目の項目をあらわし、key[next[next[head]]]が次の項目をあらわすと言う具合である。
この利点はkeyにはデータのみ入れておき、データ構造の部分はnextの中で作れること。

#include<stdio.h>
#define max	3
	
int key[max+2],next[max+2];
int x,head,z;
listinitialize()
{
	head=0;z=1;x=2;
	next[head]=z;next[z]=z;
}
deletenext(int t)
{
	next[t]=next[next[t]];
}
int insertafter(int v,int t)
{
	key[x]=v;
	next[x]=next[t];
	next[t]=x;
	return x++;
}

main(){}

こんな感じになる。