특정 디렉토리에서 구조를 출력 하는 방법

디렉토리의 구조를 출력 하는 방법은 2가지가 있다.

  1. Tree 모듈을 설치 한다.

tree 명령어는 많은 옵션을 제공하고 널리 사용되는 모듈이다.

다만 쉬운 설치를 위해서 인터넷이 되어야 한다.

  1. Command 를 이용한 출력
find . -type d | sed -e "s/[^-][^\/]*\//  |/g" -e "s/|\([^ ]\)/|-\1/"

설치가 필요 없고 단순하게 철력이 가능하다. 다만, 옵션이 없기 때문에 COMMAND를 조합 해야 한다. 예를 들어 abc 디렉토리를 제외 하고 싶다면 다음과 같은 명령어를 실행 해야 한다.

find . -type d | grep -v abc | sed -e "s/[^-][^\/]*\//  |/g" -e "s/|\([^ ]\)/|-\1/"

일회성으로 쓰기 좋다!

참고 자료


Posted by lahuman

QRadar SDK를 Ubuntu 16.x에서 사용하기 위한 모듈 교체 작업

먼저 QRadar SDK를 받아야 한다.

설치는 간단하게 압축을 해제 하고 install.sh 을 실행하면된다.

설치 하고 나서 이후 의존성 문제로 qradar_app_creator 명령어를 실행하면 오류가 발생한다.

Python 버젼은 2.7.9 이상이라고 되어 있지만 기본적으로 2.7.15가 설치 되어 있다. 상위 버젼이면 호환성에 문제가 없을 것이라 생각했지만, 모듈 오류가 많이 발생하므로 2.7.9를 설치하자

Python 설치에 필요한 모듈을 함께 설치 한다.

sudo apt-get install python-pip python-dev
sudo apt-get install build-essential
sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev

wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
tar -xvf Python-2.7.9.tgz
cd Python-2.7.9/
 ./configure --enable-unicode=ucs4  # 추후 pycrypto 모듈 관련 오류 발생을 예방하기 위해 --enable-unicode=ucs4  처리를 한다.
make
sudo make install
sudo shutdown now -r

qradar_app_creator 명령어를 입력하면 몇개의 모듈이 해당 시스템을 지원하지 않는다는 메시지를 확인 할수 있다.

관련해서 pip download 를 이용해 해당 모듈을 수동으로 교체 한다.

pip download cffi==1.11.5
sudo cp cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl /usr/local/etc/QRadarAppSDK/src_packages/

pip download cryptography==1.8.1
sudo cp cryptography-1.8.1.tar.gz /usr/local/etc/QRadarAppSDK/src_packages/

pip download pycrypto==2.6.1
sudo cp pycrypto-2.6.1.tar.gz /usr/local/etc/QRadarAppSDK/src_packages/

# 더 있을 경우 pip download를 이용해서 받아 /usr/local/etc/QRadarAppSDK/src_packages/로 옮긴다.

마지막으로 실행 스크립트에서 교체된 모듈의 이름을 변경한다.

sudo vi /usr/local/bin/qradar_app_creator

# 모듈 명을 바뀐 파일로 변경하면 된다.
"|cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl|cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl|cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl|cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl|workspace"

모듈 교체는 어려운 작업은 아니지만, 하나한 확인해야 하므로 손이 많이 간다.

참고 주소


Posted by lahuman

엔진단은 Python으로 되어 있고, WEB은 JAVA로 되어 있는 프로젝트에서 AES 256기반의 암/복호화 처리를 한다.


단순하게 KEY와 SALT만 마춰주면 된다.

Python Source

from Crypto.Cipher import AES

import base64

import hashlib


BS = AES.block_size

pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)

unpad = lambda s : s[0:-ord(s[-1])]


if __name__ == '__main__':

    key = "12345678901234567890123456789012"; # 32bit

    iv = '1234567890123456' # 16bit

    

    beforeCipher = 'abcd'

    print 'Input string: ' + beforeCipher


    cipher = AES.new(key, AES.MODE_CBC, IV=iv)

    beforeCipher = pad(beforeCipher)

    afterCipher = base64.b64encode(cipher.encrypt(beforeCipher))

    print 'Cipher string: ' + afterCipher


    cipher = AES.new(key, AES.MODE_CBC, IV=iv)

    deciphed = cipher.decrypt(base64.b64decode(afterCipher))

    deciphed = unpad(deciphed)

    print 'Deciphed string: [' + deciphed +']'

결과

Input string: abcd

Cipher string: nf2mDLb4L36PWlXz3mNPTw==

Deciphed string: [abcd]


JAVA Source

package lahuman;


import org.junit.Assert;


import javax.crypto.*;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

import java.io.UnsupportedEncodingException;

import java.security.InvalidAlgorithmParameterException;

import java.security.InvalidKeyException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.security.spec.AlgorithmParameterSpec;

import java.util.Arrays;

import java.util.Base64;


import static org.hamcrest.Matchers.is;



public class Test {


    @org.junit.Test

    public void test() throws UnsupportedEncodingException, NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {

        String key = "1234567901234567980123456789012";

        String iv = "1234567890123456";


         String beforeCipher = "123456789012345";

        System.out.println("Input string: " + beforeCipher);


        SecretKey keyspec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

        AlgorithmParameterSpec ivspec = new IvParameterSpec(iv.getBytes("UTF-8"));


        //Encription

        Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");

        cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);

        int blockSize = cipher.getBlockSize();

        byte[] dataBytes = beforeCipher.getBytes("UTF-8");


        //find fillChar & pad

        int plaintextLength = dataBytes.length;

        int fillChar = ((blockSize - (plaintextLength % blockSize)));

        if (plaintextLength % blockSize != 0) {

            plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));

        }

        byte[] plaintext = new byte[plaintextLength];

        Arrays.fill(plaintext, (byte) fillChar);

        System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);


        byte[] cipherBytes = cipher.doFinal(plaintext);

        String afterCiphered = new String(Base64.getEncoder().encodeToString(cipherBytes));

        System.out.println("Cipher string: " + afterCiphered);


        //Decription

        cipher = Cipher.getInstance("AES/CBC/NoPadding");

        cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

        byte[] base64decoded = Base64.getDecoder().decode(afterCiphered.getBytes("UTF-8"));

        byte[] aesdecode = cipher.doFinal(base64decoded);

        

        // unpad

        byte[] origin = new byte[aesdecode.length - (aesdecode[aesdecode.length - 1])];

        System.arraycopy(aesdecode, 0, origin, 0, origin.length);


        String originStr =  new String(origin, "UTF-8");

        System.out.println("Decipher string: [" + originStr + "]");

    }

}

결과

Input string: abcd

Cipher string: nf2mDLb4L36PWlXz3mNPTw==

Decipher string: [abcd]


Java에서 Python의 pad, unpad와 똑같이 동작 하기 위하여 Encryption시 fillChar을 찾고 pad처리를 하고, Decryption시 unpad 처리를 한다.


참고 자료

Python Java AES 

Posted by lahuman