3 czerwca 2015

Aplikacja LINE, protokół Thrift i Perl

Wszystkie skrypty jakie znalazłem w sieci, które logowały się do LINE, były napisane głównie w języku Python, a ja niestety programuję w Perl. Więc po dwóch dniach walk, na podstawie znalezionego kodu w sieci, stworzyłem skrypt który loguje się do LINE i pobiera dane użytkownika. Inne funkcje można podejrzeć w pliku TalkService.pm
#!/usr/bin/perl

package customHttpClient;
use base qw(Thrift::HttpClient);

sub setCustomHeader {
    my $self = shift;
    push @{$self->{'customHeaders'}},[@_];
}

sub flush
{
    my $self = shift;

    my $ua = LWP::UserAgent->new('timeout' => 1);
    $ua->default_header('Accept' => 'application/x-thrift');
    $ua->default_header('Content-Type' => 'application/x-thrift');
    $ua->cookie_jar({}); # hash to remember cookies between redirects

    my $out = $self->{out};
    $out->setpos(0); # rewind
    my $buf = join('', <$out>);

    my $request = new HTTP::Request(POST => $self->{url}, undef, $buf);

    foreach ( @{$self->{'customHeaders'}} ) {
        $request->header(@$_);
    }

    my $response = $ua->request($request);
    my $content_ref = $response->content_ref;

    my $in = IO::String->new($content_ref);
    binmode($in);
    $self->{in} = $in;
    $in->setpos(0); # rewind

    # reset write buffer
    $out = IO::String->new;
    binmode($out);
    $self->{out} = $out;
}

package main;

use strict;
use warnings;
use Data::Dumper;
use Thrift::XS;
use TalkService;
use Try::Tiny;

use constant LINE_DOMAIN   => "http://125.209.252.15";
use constant LINE_HTTP_URL => LINE_DOMAIN . "/api/v4/TalkService.do";

my $ip          = "127.0.0.1";
my $version     = "4.0.2.366";
my $com_name    = "LineJ";

my $id = '<email>';
my $password = '<password>';

my $os_version = "6.2.9200-8-x64";
my $user_agent = sprintf("DESKTOP:WINDOWS:%s(%s)",$os_version,$version);
my $app = sprintf("DESKTOPWIN\t%s\tWINDOWS\t%s",$version, $os_version);

my $transport = new customHttpClient(LINE_HTTP_URL);
$transport->setCustomHeader('User-Agent' => $user_agent);
$transport->setCustomHeader('X-Line-Application' => $app);

my $protocol  = new Thrift::XS::CompactProtocol($transport);
my $client = new TalkServiceClient($protocol);

try {
    my $msg = $client->loginWithIdentityCredentialForCertificate(
        IdentityProvider::LINE, $id, $password, 0, $ip, $com_name, ""
    );
    $transport->setCustomHeader('X-Line-Access' => $msg->{authToken});
    print Dumper $client->getProfile();
} catch {
    print STDERR Dumper $_;
};

exit;
Moduł TalkService wygenerowałem na podstawie pliku line_main.thrift. Informacje jak wygenerować kod w Perlu (i nie tylko) znajdują się pod adresem https://thrift.apache.org/tutorial/.

8 stycznia 2014

Ubiquiti TOUGHSwitch PoE PRO i stany liczników (ruch) dla każdego portu

Odczytanie zawartości /proc/net/dev nic nie mówi o ruchu na portach, jedynie na wewnętrznych interfejsach switch'a. Aby uzyskać stany liczników (ruch) dla każdego z portów osobno, wystarczy otworzyć plik /var/tmp/status_json.

Przykładowa zawartość, format JSON:
{
   "stats":{
      "1":{
         "poe":"0",
         "portSpeed":"100",
         "linkStatus":"1",
         "duplex":"1",
         "hasVlans":"0",
         "maxFrameSize":"1518",
         "alertEnabled":"0",
         "stpState":"No spanning",
         "stats":{
            "TxByte":117754941658,
            "TxBroad":110690,
            "TxUni":111089346,
            "TxMulti":93541,
            "TxExcCol":0,
            "TxLateCol":0,
            "RxGoodByte":27881914005,
            "RxBroad":46508,
            "RxUni":88242095,
            "RxMulti":1395,
            "RxFcsErr":1,
            "RxAllignErr":0,
            "RxJabber":0,
            "RxFragment":0,
            "RxOversize":0,
            "TRx64Byte":40993599,
            "TRx128Byte":25693523,
            "TRx256Byte":3648856,
            "TRx512Byte":1990133,
            "TRx1024Byte":2362312,
            "TRxMaxByte":13601576
         }
      },
      "2":{
         "poe":"0",
         "portSpeed":"1000",
         "linkStatus":"1",
         "duplex":"1",
         "hasVlans":"0",
         "maxFrameSize":"1518",
         "alertEnabled":"0",
         "stpState":"No spanning",
         "stats":{
            "TxByte":163126309,
            "TxBroad":1432704,
            "TxUni":453,
            "TxMulti":567588,
            "TxExcCol":0,
            "TxLateCol":0,
            "RxGoodByte":3241577,
            "RxBroad":0,
            "RxUni":1,
            "RxMulti":6191,
            "RxFcsErr":0,
            "RxAllignErr":0,
            "RxJabber":0,
            "RxFragment":0,
            "RxOversize":0,
            "TRx64Byte":34,
            "TRx128Byte":0,
            "TRx256Byte":0,
            "TRx512Byte":2471,
            "TRx1024Byte":3687,
            "TRxMaxByte":0
         }
      },
      "3":{
         "poe":"0",
         "portSpeed":"1000",
         "linkStatus":"1",
         "duplex":"1",
         "hasVlans":"0",
         "maxFrameSize":"1518",
         "alertEnabled":"0",
         "stpState":"No spanning",
         "stats":{
            "TxByte":163682077,
            "TxBroad":1433291,
            "TxUni":502,
            "TxMulti":567350,
            "TxExcCol":0,
            "TxLateCol":0,
            "RxGoodByte":2740019,
            "RxBroad":0,
            "RxUni":0,
            "RxMulti":6511,
            "RxFcsErr":0,
            "RxAllignErr":0,
            "RxJabber":0,
            "RxFragment":0,
            "RxOversize":0,
            "TRx64Byte":6,
            "TRx128Byte":0,
            "TRx256Byte":0,
            "TRx512Byte":6505,
            "TRx1024Byte":0,
            "TRxMaxByte":0
         }
      },
      "4":{
         "poe":"0",
         "portSpeed":"1000",
         "linkStatus":"1",
         "duplex":"1",
         "hasVlans":"0",
         "maxFrameSize":"1518",
         "alertEnabled":"0",
         "stpState":"No spanning",
         "stats":{
            "TxByte":1393171085555,
            "TxBroad":1431210,
            "TxUni":1290915353,
            "TxMulti":573720,
            "TxExcCol":0,
            "TxLateCol":0,
            "RxGoodByte":156045432312,
            "RxBroad":328,
            "RxUni":958413239,
            "RxMulti":4056,
            "RxFcsErr":0,
            "RxAllignErr":0,
            "RxJabber":0,
            "RxFragment":0,
            "RxOversize":0,
            "TRx64Byte":498122212,
            "TRx128Byte":318655134,
            "TRx256Byte":54161969,
            "TRx512Byte":17977988,
            "TRx1024Byte":23049878,
            "TRxMaxByte":46450443
         }
      },
      "5":{
         "poe":"0",
         "portSpeed":"1000",
         "linkStatus":"1",
         "duplex":"1",
         "hasVlans":"0",
         "maxFrameSize":"1518",
         "alertEnabled":"0",
         "stpState":"No spanning",
         "stats":{
            "TxByte":1336905838571,
            "TxBroad":241505,
            "TxUni":3710249743,
            "TxMulti":496286,
            "TxExcCol":0,
            "TxLateCol":0,
            "RxGoodByte":12183648616197,
            "RxBroad":1178135,
            "RxUni":2229543132,
            "RxMulti":77472,
            "RxFcsErr":0,
            "RxAllignErr":0,
            "RxJabber":0,
            "RxFragment":0,
            "RxOversize":0,
            "TRx64Byte":657162412,
            "TRx128Byte":1339531801,
            "TRx256Byte":523701573,
            "TRx512Byte":313405085,
            "TRx1024Byte":246887664,
            "TRxMaxByte":3445300570
         }
      },
      "6":{
         "poe":"0",
         "portSpeed":"100",
         "linkStatus":"1",
         "duplex":"1",
         "hasVlans":"0",
         "maxFrameSize":"1518",
         "alertEnabled":"0",
         "stpState":"No spanning",
         "stats":{
            "TxByte":45602466100,
            "TxBroad":151096,
            "TxUni":42552269,
            "TxMulti":92342,
            "TxExcCol":0,
            "TxLateCol":0,
            "RxGoodByte":3575597265,
            "RxBroad":26,
            "RxUni":29139075,
            "RxMulti":2768,
            "RxFcsErr":0,
            "RxAllignErr":0,
            "RxJabber":0,
            "RxFragment":0,
            "RxOversize":0,
            "TRx64Byte":17438436,
            "TRx128Byte":8498808,
            "TRx256Byte":1561161,
            "TRx512Byte":406953,
            "TRx1024Byte":563539,
            "TRxMaxByte":672972
         }
      },
      "7":{
         "poe":"0",
         "portSpeed":"1000",
         "linkStatus":"1",
         "duplex":"1",
         "hasVlans":"0",
         "maxFrameSize":"1518",
         "alertEnabled":"0",
         "stpState":"No spanning",
         "stats":{
            "TxByte":3208892838838,
            "TxBroad":1256802,
            "TxUni":2760667465,
            "TxMulti":400569,
            "TxExcCol":0,
            "TxLateCol":0,
            "RxGoodByte":293912171364,
            "RxBroad":176646,
            "RxUni":2009603876,
            "RxMulti":173290,
            "RxFcsErr":0,
            "RxAllignErr":0,
            "RxJabber":0,
            "RxFragment":0,
            "RxOversize":0,
            "TRx64Byte":1068232579,
            "TRx128Byte":683150554,
            "TRx256Byte":96470449,
            "TRx512Byte":39277959,
            "TRx1024Byte":46666621,
            "TRxMaxByte":76155650
         }
      },
      "8":{
         "poe":"0",
         "portSpeed":"100",
         "linkStatus":"1",
         "duplex":"1",
         "hasVlans":"0",
         "maxFrameSize":"1518",
         "alertEnabled":"0",
         "stpState":"No spanning",
         "stats":{
            "TxByte":7436383703602,
            "TxBroad":1352989,
            "TxUni":2343144437,
            "TxMulti":267006,
            "TxExcCol":0,
            "TxLateCol":0,
            "RxGoodByte":873321777726,
            "RxBroad":32306,
            "RxUni":648949666,
            "RxMulti":310287,
            "RxFcsErr":0,
            "RxAllignErr":0,
            "RxJabber":0,
            "RxFragment":0,
            "RxOversize":0,
            "TRx64Byte":2512756819,
            "TRx128Byte":1695780622,
            "TRx256Byte":226916928,
            "TRx512Byte":98845703,
            "TRx1024Byte":121118002,
            "TRxMaxByte":289468496
         }
      }
   },
   "timestamp":1389173254.935458,
   "now":"2014-01-08 10:27:34",
   "uptime":"506585",
   "management":{
      "up":1,
      "speed":100
   }
}

25 października 2012

'iptables' i szybkie usuwanie wszystkich reguł...

Poniżej szybkie usuwanie wszystkich reguł z iptables. Zarówno z wbudowanych łańcuchów jak i z łańcuchów użytkownika.

#!/bin/bash

echo "*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
" | iptables-restore

22 października 2012

Ubiquiti, SSH i zmiana hasła

Zmianę hasła w Ubiquiti, można przeprowadzić w poniższych krokach:

  1. Najpierw znajdujemy zmieniane hasło dla danego użytkownika.

    # konsola Ubiquiti
    
    cat /tmp/system.cfg | grep users.1.password | cut -d= -f2
    
  2. Teraz ze starego hasła odzyskujemy salt, czyli w Ubiquiti dwa pierwsze znaki hasła.

    # Perl
    
    my $salt;
    ($salt) = $old_password =~ m/^(..)/; 
    # BASH
    
    SALT=`echo ${OLD_PASSWORD} | cut -c1,2`

  3. Generujemy nowe hasło.
    # Perl
    
    my $new_password_crypted = crypt($new_password,$salt);
  4. Mając wszystkie potrzebne dane, podmieniamy hasło.

    # konsola Ubiquiti
    
    sed -e 's/$old_password/$new_password_crypted/' /tmp/system.cfg
    
    # zapisujemy zmiany
    
    cfgmtd -w
    
  5. Gotowe

Powyższa procedura działa, jak na razie, na wszystkich dostępnych mi urządzeniach Ubiquiti.

Gotowy skrypt w Perlu: chpasswd-ubiquiti.pl

18 października 2012

Ubiquiti i zmiana MAC adresu

Aby zmienić adres MAC interfejsu radiowego w Ubiquiti, możemy go po prostu zmienić za pomocą polecenia ifconfig.

Jednak zmiany te, nie zachowują się po restarcie urządzenia. Należy więc zmieniać adres MAC po każdym starcie systemu, a prosty skrypt ustawiający nowy adres zapisać w pamięci nieulotnej.

Poniżej procedura zmiany adresu MAC:

  1. Edytujemy plik /etc/persistent/rc.poststart. Jeśli pliku brak, tworzymy go.
  2. Edytujemy zawartość pliku tak, aby zawierał poniższy kod:
    ifconfig ath0 down
    ifconfig ath0 hw ether XX:XX:XX:XX:XX:XX
    ifconfig ath0 up
    Wartość XX:XX:XX:XX:XX:XX należy zastąpić nowym adresem MAC
  3. Zapisujemy dane do pamięci nieulotnej, uwzględniając pliki w /etc, wykonując polecenie cfgmtd -w -p /etc/
  4. Gotowe

Po zrestartowaniu urządzenia, adres MAC będzie ustawiany na nową wartość