blog.area23.at - a simple url encoder/decoder

 a simple url encoder/decoder
 http://blog.area23.at

Labels

Wirtschaft (120) Österreich (92) Pressefreiheit (65) IT (49) Staatsschulden (30) code (27) EZB (19) Pensionssystem (13) France (1) music (1)

2012-06-09

Intransparentes Ausspionieren geht auf Rechnung der anderen

Durch geheime Spionage in Bezug auf immaterielle Rechtsgüter entstanden Kleinunternehmen bereits Kosten bzw. ein potentielles Risiko von externen ausspioniert zu werden! Warum das so ist, zeigt folgende tatsächliche Begebenheit:


In meiner letzten Firma installierte ich mir die Synchronisationssoftware  für mein privates Smartphone am Arbeitsplatz-PC. Das war legal und genehmigt. Nach der Installation passierten eigenartige Dinge. Ich hatte Grund zur Annahme, dass der IIS gepacht wurde. Mit Sicherheit konnte ich feststellen, dass eine Kommunikationsverbindung nach außen vom FirmenPC aufgemacht wurde und Daten übertragen wurden. Ich berichtete das alles sofort, machte ein Backup des eigenartigen Systemzustands und führte im Anschluss eine Systemwiederherstellung vor dem Zeitpunkt der Softwareinstallation durch. Ich postete diese Tatsachen in Google Buzz. Da sah ich, einige andere Leuten hatten zu diesem Thema schon detailliertere Beiträge mit besseren Analysen verfasst. Bevor das weitere Kreise ziehen konnte, meldete sich die asiatische Herstellerfirma sofort zu Wort: 


"Aufgrund von Digital Rights Management und den für Europa und USA rechtlichen Exportbestimmungen, die man erst zu spät erkannte, hatte wir ein System entwickeln müssen, dass Kopien von geschützten immateriellen Rechtsgütern, konkret Musik und Videos protokolliert."
"Wir als Hersteller hatten die Richtung Smartphone -> PC zuerst nicht für nötig gehalten, unsere Juristen sahen das aber anders. Aufgrund des Zeitdrucks kurz vor dem Launch ist Qualität etwas zu kurz gekommen und wir haben das Standard MFC Icon auf der Programmdatei  belassen, was auch natürlich von NO-Name  Firmen, Hobbybastlern oder Hackern auch oft so praktiziert wird. Man hat die Datei schnell in den Installer dazukopiert ohne vorhandene Signatur."


Da inzwischen auch sehr clevere/gescheite Leute das Programm analysiert hatten und sie das Statement vollkommen untermauerten, wurde plötzlich aus der bedrohlichen Chimäre des spionierenden asiatischen Smartphone- Herstellers, ein alltägliches IT-Missverständnis. Viele IT-ler egal ob GF, Manager, Programmierer, Tester oder Sysadmins hatten in ihrem Berufsleben schon einmal eine ähnliche Situationen erlebt und die Reaktion gegenüber dem Hersteller war allgemeines Verständnis. 
Nichts desto trotz gibt es schwarze Schafe unter den Firmen, die Kunden ausspionieren. 
Wo und wie viele das sind kann ich nicht sagen, dazu müsste ich in die Kristallkugel schauen. Die Kosten für die ganze Aktion trug mein damaliger Chef, dem ich auch noch weitere Nerven kostete, als ich später eine verbalen emotionalen Disput mit aggressiver halbstarker Rhetorik mit einer Hackergruppe anfing. Ich rechne ihm die beiden zugedrückten Augen hoch an und auch der Hackergruppe ihre richtige Einschätzung der Situation. (Ich war einfach etwas daneben)


P.S.: Im Nachhinein stellte sich noch dazu heraus, dass diese Protokollierung gar nie als Import/Export Bestimmung gefordert war, die Firmenjuristen hatten eine Interpretation herangezogen, die jeden Einwand, der auf ein Exportverbot abzielen könnte, sofort 100% widerlegen würde. 
P.P.S.: In der nächsten Softwareversion des Herstellers war dieses leidige Programm auch nicht mehr vorhanden.
P.P.P.S.: Es ist super wenn der Geschäftsführer eines Kleinunternehmens die Wahl zwischen: Ich lass mich ausspionieren bzw. die Jungs und Mädels untersuchen das auf meine Kosten hat, oder?

2012-06-07

Dekompilieren von Software um Spionage zu entdecken ist strafbar!?

Eigentlich ist bei closed source Ausspionieren von Kunden mittels der eigenen Software relativ gefahrloser, als bei OpenSource. Um Spionage-Routinen des Programms / der Bibliothek zu erkennen und zu beweisen muss man in vielen Fällen die vorhandene Software dekompilieren.


Das Untersuchen eines Programms auf vorhandene Spionage-Routinen einer gemieteten / geleasten / gekauften Software würde ich nicht unbedingt als die Schaffung interoperabler Schnittstellen sehen.
Also ist Dekompilieren auch zum Zweck der Sicherheit per Urheberrecht in Deutschland und Österreich verboten und kriminell, siehe:
http://dejure.org/gesetze/UrhG/69e.html 
http://www.jusline.at/40e_Dekompilierung_UrhG.html


Du als Kunde hast somit nicht das Recht gelieferte Software auf Ausspähroutinen per dekompilieren  zu untersuchen, daher die Frage:
Ist tracen des Netzwerktraffics eines Programmes auch bei Aufbrechen von SSL zur Analyse eigentlich gestattet?

2012-05-17

Too heavy optimization could trigger unwanted dangerous effects

All random occasional events, that occur from time to time, 
might imply a certain discrepancy between 
the estimated / preditcted / anticipated / expected system state.
and the real system state.

"A system is optimized too heavy, when a random occasional event might produce heavy damage or trigger a partial system collapse."

"A system is optimized to death, when any little random occasional event could trigger a total systemwide collapse."

2012-05-16

Simple Html Injection Detection for MS-SQL

A very simple prototype how html injection detection can be made on Microsoft SQLServer.
Please notice, that a full content injection detection is much more complex...

If Exists(Select Top 1 object_id 
  From tempdb.sys.tables Where name = '##InjWatch'
)
  Delete From ##InjWatch
Else
  Create Table ##InjWatch(
    ctext varchar(max), tab varchar(768), col varchar(768)
  );
GO 

Set TRANSACTION ISOLATION LEVEL read uncommitted;

Declare
 CheckHtmlInjectCursor Cursor FAST_FORWARD READ_ONLY For 
  Select
    'Cast([' + c.name + '] As nvarchar(Max))' As c_cast,
    c.name As c_name, '' +
    s.name + '.[' +T.name + ']' As sT_name
  From sys.tables T
  Inner Join sys.columns c On c.object_id = T.object_id
    And c.max_length > 16
    And c.system_type_id In (
      Select system_type_id From sys.types Where name In (     
      -- TODO: check XML, 'user defined' string & binary types :(
        'varchar''nvarchar''char''nchar''text''ntext'   
      )
    ) 
  Inner Join sys.schemas s On s.schema_id = T.schema_id

Declare @c_cast varchar(1024),
        @c_name varchar(768), @sT_name varchar(768)
Open CheckHtmlInjectCursor
  Fetch Next From CheckHtmlInjectCursor 
    Into @c_cast, @c_name, @sT_name

  While
 (@@FETCH_STATUS = 0)
  Begin
    Declare @execSQL nvarchar(max
    Set @execSQL = 
    'Insert Into ##InjWatch(ctext, tab, col) ' + 
    'Select ' + @c_cast + ' As ctext, ''' + 
                @sT_name + ''' As tab, ''' +
                @c_name + ''' As col ' + 
    'From   ' + @sT_name + ' ' 
    'Where (' + @c_cast + ' Like ''%<%'' And + 
                @c_cast + Like  ''%>%'') ' + 
    '  Or   ' + @c_cast + Like  ''%script:%''+ 
    '  Or   ' + @c_cast + ' Like ''%://%''' + 
    '  Or   ' + @c_cast + ' Like ''%href%''' 
    '  Or   ' + @c_cast + ' Like ''%return%'''   

    Execute sp_executesql @execSQL; 
  
    Fetch Next From CheckHtmlInjectCursor 
      Into @c_cast, @c_name, @sT_name 
  End 

Close CheckHtmlInjectCursor 
Deallocate CheckHtmlInjectCursor 


Select Distinct * From ##InjWatch 
GO

Mysql Sample:
/* CREATE TEMPORARY TABLE Test.HtmlSQLInjection (
 Content Varchar(1024) NULL
    , TableName VARCHAR(512) NOT NULL
    , ColumnName VARCHAR(512) NOT NULL
    , SchemaName VARCHAR(512) NOT NULL
); */


USE test;
DELIMITER $$
DROP PROCEDURE IF EXISTS  cursor_proc $$
CREATE PROCEDURE cursor_proc()
BEGIN

DECLARE v_done INTEGER DEFAULT 0;
DECLARE v_s VARCHAR(512) DEFAULT '';
DECLARE v_t VARCHAR(512) DEFAULT '';
DECLARE v_c VARCHAR(512) DEFAULT '';
DECLARE v_queryString VARCHAR(1024) DEFAULT '';
DECLARE CheckHtmlInjectCursor CURSOR FOR 
 select  
  information_schema.TABLES.TABLE_SCHEMA, 
        information_schema.TABLES.TABLE_NAME,
        information_schema.COLUMNS.COLUMN_NAME
 From information_schema.TABLES CALL `test`.`cursor_proc`();
CALL `test`.`cursor_proc`();

 inner join information_schema.COLUMNS 
  on information_schema.TABLES.TABLE_NAME = information_schema.COLUMNS.TABLE_NAME
where information_schema.TABLES.TABLE_SCHEMA = information_schema.COLUMNS.TABLE_SCHEMA
 and information_schema.COLUMNS.DATA_TYPE in 
 ('char', 'varchar', 'binary', 'varbinary', 'blob', 'longblob', 'text', 'mediumtext', 'longtext')
    and information_schema.COLUMNS.CHARACTER_MAXIMUM_LENGTH > 15;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1;

OPEN CheckHtmlInjectCursor;

read_loop: LOOP
  FETCH CheckHtmlInjectCursor INTO v_s, v_t, v_c;
 IF v_done = 1 THEN
      LEAVE read_loop;
      CLOSE CheckHtmlInjectCursor;
 END IF;
    SELECT v_c,  v_s, v_t;
    
   'SELECT ', v_c, ' FROM ', v_s, '.', v_t, '.', v_c, ' WHERE ', v_c, ' like ''%'' '));
    SET @queryString = (
  SELECT CONCAT(
   'SELECT ', v_c, '.',  v_s, '.', v_t, ' FROM ', v_t));
 PREPARE stmt FROM @queryString;
 EXECUTE stmt;
 DEALLOCATE PREPARE stmt; 
 */

END LOOP read_loop;
/* CLOSE CheckHtmlInjectCursor; */

END $$
 
DELIMITER ;


Google Groups shows NNTP-Posting-Host public for everyone

"Google Mail" shows original SMTP-Header only to account owner,
GoogleShowYouTheOrigSMTPMessage.png

but "Google Groups" shows NNTP-Posting-Host public for everyone (anonymous):

flex - fast lexical analyzer generator sample


Who remember flex: fast lexical analyzer generator? 

I have written a short mail logfile scanner sample long time ago under gnu linux with gcc and flex. MailScanner.yy  is a win32 port using gnuwin32 flex and getoptwin:


%option noyywrap

%{
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "getopt.h"
#include <string.h> 
#define MAXLEN 1024
#define OUT (void)printf


int i, j, idx, len, mode = 0;
char tmps[MAXLEN], reverse[MAXLEN];

%}
SEGA  [2][5][0-5]
SEGB  [2][0-4][0-9]
SEGC  [1][0-9]{2}
SEGD  [1-9][0-9]{0,1}
SEG   {SEGA}|{SEGB}|{SEGC}|{SEGD}
IP    {SEG}["."]{SEG}["."]{SEG}["."]{SEG}

HOSTDOMAINSEGMENT [0-9a-zA-Z_"\-"]+["."]
TOPLEVELDOMAIN [a-zA-Z]{2,7}
HOSTNAME {HOSTDOMAINSEGMENT}+{TOPLEVELDOMAIN}
USER [0-9A-Za-z_"\-""."]+

EMAIL1 {USER}"@"{HOSTNAME}
EMAIL2 {USER}"@"{IP}

URIPROTOCOL [a-zA-Z]{2,10}"://"
URISUFFIX [^ \t\n\r"@"","">""<""("")""{""}"]
URL1   {URIPROTOCOL}{HOSTNAME}{URISUFFIX}*
URL2   {URIPROTOCOL}{IP}{URISUFFIX}*

%%
<<EOF>> {
        exit(1);
    }

{EMAIL1} |
{EMAIL2} {
    
  if (strchr(yytext, '@') != (char *)NULL) 
  {
  switch((mode % 16))
    {
      case 0: 
        strcpy(tmps, yytext); 
        break;
case 1: 
        strcpy(tmps, strchr(yytext, (int)'@'));
        break;
case 2: 
        strcpy(tmps, &strchr(yytext, (int)'@')[1]);
        break;
  case 4:
        strcpy(tmps, &strchr(yytext, (int)'@')[1]);
len = strlen(tmps); 
for (j = 0, idx = 0; ((j < len) && (j < MAXLEN-1)); j++) 
{
if (tmps[j] == '.'
{
for (i = idx; i <= j; 
reverse[(len-j) + (i-idx)] = tmps[i++]);
 idx = j + 1;
}
}
for (i = idx; i <= j; i++)
{
          reverse[(len-j) + (i-idx)] = (i < len) ? tmps[i] : '.';
} 
reverse[len + 1] = '\0';
strcpy(tmps, reverse);
break;
case 8: 
        strcpy(tmps, &strrchr(yytext, (int)'.')[1]);
        break;
default:
        strcpy(tmps, yytext);
        break;
  }
  OUT("%s\n", tmps);
  }
}

{URL1} |
{URL2} {
  if (mode < 16) 
{
  switch((mode % 16)) 
  {
  case 0:
        strcpy(tmps, yytext);
        break;
  case 1:
        strcpy(tmps, strchr(yytext, (int)'/'));
        break;
  case 2:
        strcpy(tmps, &strrchr(yytext, (int)'/')[1]);      
        break;
  case 4:
        strcpy(tmps, &strrchr(yytext, (int)'/')[1]);
        len = strlen(tmps);
        for (j = 0, idx = 0; ((j < len) && (j < MAXLEN-1)); j++)
        {
          if (tmps[j] == '.'
          {
            for (i = idx; i <= j; reverse[(len-j) + (i-idx)] = tmps[i++]);
            idx = j + 1;
          }
        }
        for (i = idx; i <= j; i++)
{ 
          reverse[(len-j) + (i-idx)] = (i < len) ? tmps[i] : '.';
        }
        reverse[len + 1] = '\0';
        strcpy(tmps, reverse);
        break;
      case 8:
        strcpy(tmps, &strrchr(yytext, (int)'.')[1]);
        break;
      default:
        strcpy(tmps, yytext);
        break;
    }
    OUT("%s\n", tmps);
  }  

^[\n;] { ; }

[\r\n]+ { ; }

. { ; }

%%
void yyerror() { exit(1); }

void usage(const char *cmd) 
{
  OUT("Usage: %s [-f file] [-a ] [ -r ] [ -u ]\n", cmd);
  OUT("\tsimple email address and uri lexer reads from stdin \n");
  OUT("\t-a,--noat   \tprints FQDN email (chars left of \'@\')\n");
  OUT("\t-u,--nouser \tprints email without username \n");
  OUT("\t-t,--top    \tprints topleveldomain with option -a|-u\n");
  OUT("\t-n,--nouris \tprints only email address and not URIs\n");
  OUT("\t-r,--reverse\treverses FQDB/IP address segments\n");
  exit(0);
}

int _tmain(int argc, TCHAR** argv)
{
  static int verbose_flag;
  int c;

  while(1)
  {
  static struct option long_options[] =
    {
      {_T("help"), ARG_NONE, 0, _T('h')},
      {_T("noat"), ARG_NONE, 0, _T('a')},
      {_T("nouser"), ARG_NONE, 0, _T('u')},
      {_T("top"), ARG_NONE, 0, _T('t')},
      {_T("nouris"), ARG_NONE, 0, _T('n')},
      {_T("reverse"),     ARG_NONE, 0, _T('r')},
      { ARG_NULL,         ARG_NULL, ARG_NULL, ARG_NULL}
    }; 

    int option_index = 0;
    c = getopt_long(argc, argv, _T("hautnr:"), long_options, &option_index);
    if (c == -1) 
      break;
    switch (c) // Handle options
    {
      case 0: // If this option set a flag, do nothing else now.   
        if (long_options[option_index].flag != 0)
  break;
        _tprintf (_T("option %s"), long_options[option_index].name);
        if (optarg)
          _tprintf (_T(" with arg %s"), optarg);
        _tprintf (_T("\n"));
        break;
      case _T('u'): mode = 1;
        break
      case _T('a'): mode = 2;  
        break
      case _T('r'): mode = 4;  
        break;
      case _T('h'): usage(argv[0]);  
        break;
      case _T('t'): mode = 8;  
        break;
      case _T('n'): mode += 16;  
        break;  
      case '?': // getopt_long already printed an error message.  
        break
      defaultabort();
    }
  }
  (void) fflush(stdout);
  yyin = stdin;
  yylex();
  exit(0);
}


Files: [MailScanner.yy] [lex.yy.c]

VPN Security or secure instant linux


Howto increase VPN security, when you only need remote desktop or remote login sessions? 

When your OS at office is Win2008, 
VPN clients on bootable write protected memory sticks/ CDs/ DVDs with a special prepared linux OS can enhance security. (You can easy clone or customize a live cd and change the certificate / password all 2 months) 
You might even prepare a live cd for android or boot a special image from sdcard, but remember, that an image on sdcard isn't write protected.
USB Memory Stick with write protection