Category Archives: PROGRAM - Page 5

mod_ruid suExec suPHP CentOS Apache2

ApacheのCGIやPHPをユーザ権限で動かすにはmod_ruid suExec suPHP等色々ありますが今回mod_ruidを使って行ないたいと思います。
※ディフォルトのsuExecは停止させておく必要があります。

下記のパッケージをインストールする
# yum install httpd-devel
# yum install libcap-devel
ソースをダウンロードしてきてコンパイルする
# wget http://www.sourcefiles.org/Internet/WebServers/Modules/Access_Control/mod_ruid-0.6.tar.gz
# tar xvzf mod_ruid-0.6.tar.gz
# cd mod_ruid-0.6
# apxs -a -i -l cap -c mod_ruid.c

再起動するとmod_ruidが有効になる
# service httpd restart

WordPressでのエラーやphpMyAdminでのエラーの対処
※現在他の方法を模索中…
# chmod 777 /tmp/fs_sessions/ (デフォルトは700)
# chmod 777 /var/lib/php/session (デフォルトは770)

このままではapacheユーザによって作られたcgiやphpが削除できなくなったり色々と問題が発生するため現在のユーザディレクトリ内のファイル所有者を変更しpublic_htmlのパーミッションを700にするスクリプトを書いて自動で書き換える。
(色々面倒で適当に書いてるところはありますが当方が急いで書いた為なのでお気になさらずに…)

#!/usr/bin/perl
$homedir = '/home/';

opendir(DIR,$homedir);
  @list = readdir(DIR);
closedir(DIR);

foreach $udir (@list) {
$userdir = "$homedir$udir";
if(-d $userdir && $udir !~ /.|+/){
print "$userdir : $udirn";
$chown = `chown -R $udir:$udir $userdir/public_html`;
$chmod = `chmod 700 $userdir/public_html`;
  }
}

今後作成されるユーザディレクトリのパーミッションを変える
# chmod 700 /etc/skel/public_html

最後に不正に他のユーザのディレクトリやファイルが閲覧出来ない事を確認する。

Visitors 0.7日本語化 色々修正版

ソフトの窓様がVisitorsの日本語化をされていらっしゃいましたので、ファイルを元にその日本語化をもっと徹底的に行ないました。

修正内容
・残りの英語表記であった部分を日本語化しました。
・解析結果を表示するページが左寄でしたので中央寄せに修正しました。

visitors-0.7-JPORSP.tar.gz

使い方はソフトの窓様を参考にお願いします。

Perl 正規表現 半角文字全てにマッチ

意外にもあまり紹介されていないのでメモしておきたいと思う。
EUC-JPの文字コード表では次の通りに並んでる。

!”#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~

よって/[!-~]/iこれで全ての半角英数文字をマッチすることが可能である。

ORSP ブラクラ判定 リファラ隠蔽 公式サービス提供開始

http://jump.orsx.net/
リファラの隠蔽により掲示板等の設置場所をアクセス先の管理人に悟られなくする機能に加えブラウザクラッシャーや不快動画・画像、ウイルス、グロ画像、パス抜きサイト等のURLが含まれていた場合過去の経歴より判別し即座に警告表示を出す機能を追加しました。また今回、利用者自信も自分で危険なURLを登録することが可能です。よって自分でオリジナルの環境をカスタムすることが可能となっております。

利用例)
https://www.orsx.net/ へリンクしたい場合は下記の②通りの書き方が可能です
http://jump.orsx.net/www.orsx.net/blog/
http://jump.orsx.net/https://www.orsx.net/

このサービスはRental Orbit Spaceの公式サービスとして認定されております。

2ch ジャンプ確認 再現 ime.nu

全く同じ働きをするCGIを書いてみました。
※私の妄想にしか過ぎないので間違ってる可能性もあります。

#!/usr/bin/perl
#===================================
#スクリプト名:ジャンプCGI
#作者:ORBIT
#===================================

# URLの後ろパスがついているかチェック
if ($ENV{'PATH_INFO'} eq ""){&error;}

# パスにhttp:/が含まれている場合削除
$ENV{'PATH_INFO'} =~ s/http:///;

# URLの作成
$PATH = "http:/$ENV{'PATH_INFO'}";

# 出力
print "Content-type: text/htmlnn";
print <<EOT
<html><head>
<title>jump</title></head>
<body>
以下のURLに飛びますよろしいですか?<br>
<a href="$PATH">$PATH</a>
</body></html>
EOT
;

# パスが見つからなかった場合は下記を出力
sub error {
print "Content-type: text/htmlnn";
print <<EOT
<html><head>
<title>jump</title></head>
<body>
test
</body></html>
EOT
;
exit;
}

これをエラーページにしてるのかリダイレクトしてるのか多分そんなところかと思います。

CentOS 5.4 Python CGI対応

自分は使うことは無いので触る予定はありませんでしたが利用者が使いたい方もおられるでしょうので一応対応させました。
これはその際のメモです。

# yum install *python*
# ln -s /usr/bin/python /usr/local/bin/python

これで対応します。

Python CGIプログラミング入門
ここの例文を利用させていただいたところ無事動作を確認できました^^

画像認証用画像作成スクリプト CGI

原理が気になったので似たようなものを作成してみました。
※勝手に構造を妄想して作った物です。実際のものとは異なる可能性があります。
サンプル:FrontPage

#!/usr/bin/perl
#############################################
#スクリプト名:画像認証画像作成スクリプト
#バージョン:Ver.1.0.0
#作成者:ORBIT
#サイト:https://www.orsx.net/
#著作権:
#完全フリーです。
#ご自由に改造してください。参考になった場合は
#リンクしていただけると助かります。
#目的:
#画像認証に使用する画像を作成する
#############################################
#============================================
#設定
#============================================
#画像の背景
$tempfile = 'temp.jpg';
#保存する画像名
$imgname = './test.jpg';
#フォント
$font='./Bedrock.ttf';
#文字の色
$color='red';
#文字のサイズ
$fontsize = '30';
#出力する文字数
$number = '7';
#============================================
#モジュール使用宣言
use Image::Magick;

#ランダムな英数を作成する
@character = ('0'..'9','a'..'z');
for ( $i = 1; $i <= $number; $i++ ){
  $pcode .= $character[rand(@character)];
}

#画像作成
$img = Image::Magick->new;
$img->Read($tempfile);
$img->Annotate(text=>$pcode,
               geometry=>'+0+0',
               gravity=>'Center',
               fill=>$color,
               font=>$font,
               pointsize=>$fontsize);
$img->Write($imgname);
undef $img;

#表示
print "Content-type: image/jpegnn";
open IMGG, "$imgname";
binmode (IMGG);
binmode (STDOUT);
print <IMGG>;
close (IMGG);

Authen::PAMの使い方 メモ

FrontPage様が紹介されていたソースが一部崩れていたので分かる範囲で修正してメモしておきます。
注)うちのレンタルサーバでの使用は厳禁です。発覚しだい即アカウント停止します。

#!/usr/bin/suidperl -T

####################################################################

###

### newpasswd --- Webインタフェースからのパスワード変更CGI

###

### Authen::PAMモジュールが必要

### chown root:root newpasswd

### chmod 4555 newpasswd

###

####################################################################

### /etc/pam.d/newpasswd の内容

####################################################################

### #%PAM-1.0

### auth required pam_stack.so service=system-auth

### account required pam_stack.so service=system-auth

### password required pam_stack.so service=system-auth

####################################################################

use CGI qw(:standard); # CGIモジュールの宣言
use Authen::PAM; # Authen::PAMモジュールの宣言

$q = CGI->new(); # CGIモジュールの初期化
$q->import_names('P'); # 「$P::変数」でアクセスできるようにする
$homepage = "./"; # ホームページ
$myself = "./newpasswd.cgi"; # このCGIのURL
$pam_service="newpasswd"; # PAMサービス名 $cmsg = ""; # エラー・メッセージの初期化

sub conv { # PAMとの情報交換のための関数

   my @res;			# 戻値を保存する変数の初期化
   while ( @_ ) {		# 与えられたパラメータの処理
       my $mtype = shift;	# メッセージの種類
       my $msg = shift;	# メッセージ
       my $ans = "";		# 入力する反応
       if ($mtype == PAM_ERROR_MSG()) {	# エラーメッセージの処理
           $cmsg .= "$msg<BR>n";		# エラーを記録
       } elsif ($mtype == PAM_TEXT_INFO()) {	# なんらかのテキスト
           $cmsg .= "$msg<BR>n";		# そのまま記録
       } elsif ($mtype == PAM_PROMPT_ECHO_OFF()) {	# プロンプト
           if ($pam_state eq "AUTHENTICATE") {		# ユーザー認証を要求
               $ans = $P::old;				# 現在のパスワードを入力
               $pam_state = "CHAUTH-AUTHEN";		# ステータスにパスワード変更認証をセット
           } elsif ($pam_state eq "CHAUTH-AUTHEN") {	# パスワード変更のための認証が要求されている場合の処理
               $ans = $P::old;				# 現在のパスワードを入力
               $pam_state = "CHAUTHTOK";		# ステータスにパスワード変更をセット
           } else {					# 新パスワードの処理
               $ans = $P::new;				# 新しいパスワードをセット
           }
           $cmsg .= "$msg<BR>n";			# メッセージがあれば記録
       } else {					# プロンプトが表示されない場合
           $cmsg .= "Error. $msg<BR>n";		# エラーメッセージを記録
       };
       push @res, (0, $ans);				# 戻値をセット
   }
   push @res, PAM_SUCCESS();				# 成功のステータスをセット
   return @res;					# 関数の終了

}

sub stringcheck { # 不適当な文字列をチェック

   my $str = shift;					# チェックする文字列を$strにセット
   return 1 if ($str =~ /[\000-\037177-377]/);	# パスワード用文字列のチェック
   return 2 if ($str !~ /^(w[w-"]+)$/);		# ユーザー名文字列のチェック
   return 0;						# エラーなし

}

##

## HTMLの用意

##
print header(-charset=>'EUC-JP'); # へッダの出力。文字コードにEUC-JPを指定する
print start_html(-title=>'パスワード変更',-lang=>"ja",-encoding=>"EUC-JP"); # Webページの<HEAD>タグの内容をセット。ここでは言語(lang)と文字コード(EUC-JP)を指定する

# print header(-charset=>'Shift_JIS'); # シフトJISでスクリプトを作成する場合は、charsetにShift_JISを指定する

# print start_html(-title=>'パスワード変更',-lang=>"ja",-encoding=>"Shift_JIS"); # シフトJISでスクリプトを作成する場合は、encodingにShift_JISを指定する

print h1('パスワード変更'); # タイトルの表示

if (! $P::flag) { # $flagが設定されていなければ、入力フォームを表示

##

## このブロックでは最初の入力画面を表示させる。

##

   print p("パスワードを変更します。");
   print start_form(-method=>post,-action=>$myself);	# フォームの開始。ここでは安全のためにPOSTメソッドを使う。
   print hidden(-name=>"flag", -value=>"x"),		# $flagにダミーの値をセット
         p("ユーザーID: ", textfield(-name=>"username")),	# ユーザーIDの入力欄
         p("現在のパスワード: ", password_field(-name=>"old")),  # 古い(現在の)パスワードの入力欄
         p("新しいパスワード: ", password_field(-name=>"new")),  # 新しいパスワードの入力欄
         p("新しいパスワード(再入力): ", password_field(-name=>"new2")),	# 確認のための新しいパスワードの再入力欄
         p(submit("変更"));					# 変更ボタンの表示
   print end_form;						# フォームの終了

} else { # $flagがセットされている場合は、入力データが存在するものとみなしてパスワードの変更を行う

   ##
   ## ユーザー名、パスワードのチェック
   ##
   if ($P::new ne $P::new2) {				# 新パスワードの誤入力チェック
       print p("新パスワードと確認用に入力したパスワードが違っています。"),
             p("パスワードを入力し直してください。");
   } elsif (length($P::new) < 8 || length($P::new) > 255) {	# 新パスワードの長さのチェック
       print p("8文字以上255文字以下のパスワードを入力してください。");
   } elsif (length($P::username) < 2 || length($P::username) > 10) {	# ユーザー名の入力チェック
       print p("ユーザー名を入力してください。");
   } elsif (stringcheck($P::username)) {			# ユーザー名として不適当な文字があればエラー
       print p("ユーザー名が不適切です。");
   } elsif (stringcheck($P::new) == 1) {		# パスワードにコントロールコードが含まれている場合はエラー
       print p("新しいパスワードに不適切な文字が含まれています。");
   } else {						# 問題がなければパスワード変更処理を行う
       ##
       ## PAMによる認証とパスワードの変更
       ##
       $prv = pam_start($pam_service, $P::username, &conv, $pamh);	# PAMの初期化
       $pam_state = "AUTHENTICATE";					# 最初は認証を行う
       $prv = pam_authenticate($pamh, 0);				# 認証を実行
       if ($prv != PAM_SUCCESS) {					# 認証に失敗した場合はエラー
           print p("認証エラー:", pam_strerror($pamh, $prv));
       } else {							# 認証が通ればパスワードの変更
           $prv = pam_chauthtok($pamh);				# パスワード変更処理
           if ($prv != PAM_SUCCESS) {					# パスワード変更に失敗した場合はエラー
               print p("トークン変更失敗:", pam_strerror($pamh, $prv));
           }
       };
       ##
       ## 結果の表示
       ##
       if ($prv == PAM_SUCCESS ) {			# PAMからの戻値が成功であれば無事終了
           print p("パスワードを変更しました。");
       } else {					# PAMからの戻値がエラーなら、メッセージを表示して終了
           print p("パスワードの変更に失敗しました。");
           print p($cmsg);
       };
       $prv = pam_end($pamh, 0);			# PAMの終了処理
   };

};
print hr, "<A HREF="$myself">元に戻る</A> | <A HREF="$homepage">ホームページ</A>"; # フッタのリンクを表示
print end_html; # HTMLの終了

##

Vine Linux 5.0 Python CGIを使う

色々と足りないのがあるのでインストールします。
※私の環境ではpythonは使える環境にありました。
# apt-get install python
# apt-get install python-devel
# apt-get install python-egenix-mx-base
# apt-get install python-tools
# apt-get install python-setuptools
# apt-get install python-babel
# apt-get install python-genshi
# apt-get install mod_python

基本.htaccessを使わないといけなくなるのでhttpd.confには以下の設定に変更しておく。
# vi /etc/apache2/conf/httpd.conf
AllowOverride NoneをAllowOverride FileInfoへ設定

# service apache2 restart

PythonをCGIで使う場合文字化けのためかshiftがエラーになったのでUTF-8で書きましょう。

hello.pyをcgiとして動かす場合は下記のような設定を.htaccessへ記述する。
AddHandler mod_python .py
PythonHandler hello
PythonDebug On

hello.pyの内容

from mod_python import apache

def handler(req):
  req.content_type = "text/plain"
  req.send_http_header()
  req.write("Hello, World")
  return apache.OK

# end.

毎回スクリプトごとに設定してたら気が狂うので下記のような設定方法もあります。
AddHandler mod_python .py
PythonHandler mod_python.publisher
PythonDebug On

慣れないですね^^;
やっぱりPerlが使いやすいかな・・・・・・

Slowloris対策 今後の課題有り Vine linux

先ほど紹介したSlowlorisに対抗するモジュールが紹介されていたのでVineLinuxでのインストール方法に関して紹介します。

※インストールする前に!!
このモジュールは改良版Slowlorisには必ずしも有力な対抗能力を示さない事が分かっております。自己責任でインストールしてください。

# wget http://mod-pacify-slowloris.googlecode.com/files/mod-pacify-slowloris-0.0.1.tgz
# tar xvzf mod-pacify-slowloris-0.0.1.tgz
# cd mod-pacify-slowloris
# /usr/bin/apxs -i -a -c mod_pacify_loris.c
#
# vi /etc/apache2/conf/httpd.conf

以下が追加されていることを確認
LoadModule pacify_loris_module modules/mod_pacify_loris.so

# service apache2 restart

参考元:
にわか鯖管の苦悩日記

アンインストール方法
# cd /usr/lib/apache2/modules
# rm -r mod_pacify_loris.so
# vi /etc/apache2/conf/httpd.conf
LoadModule pacify_loris_module modules/mod_pacify_loris.so
にカーソルを合わせてddで削除