home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 August / PCWorld_1999-08_cd.bin / doc / HOWTO / mini / Firewall-Piercing < prev    next >
Text File  |  1998-11-30  |  17KB  |  463 lines

  1.   Firewall Piercing mini-HOWTO
  2.   Franτois-RenΘ Rideau, fare@tunes.org
  3.   v0.3b, 27 November 1998
  4.  
  5.   Directions for using ppp over telnet to do network stuff transparently
  6.   through an Internet firewall.
  7.   ______________________________________________________________________
  8.  
  9.   Table of Contents
  10.  
  11.  
  12.   1. Stuff
  13.  
  14.      1.1 DISCLAIMER
  15.      1.2 Legal Blurp
  16.      1.3 Credits
  17.  
  18.   2. Introduction
  19.  
  20.      2.1 Foreword
  21.      2.2 Security problems
  22.      2.3 Other requirements
  23.      2.4 Downloading software
  24.  
  25.   3. Understanding the problem
  26.  
  27.      3.1 Giving names to things
  28.      3.2 The problem
  29.      3.3 Additional difficulty
  30.  
  31.   4. The solution
  32.  
  33.      4.1 Principle
  34.      4.2 fwprc
  35.      4.3 .fwprcrc
  36.  
  37.   5. Reverse piercing
  38.  
  39.      5.1 Rationale
  40.      5.2 Getting the triggering mail
  41.  
  42.   6. Final notes
  43.  
  44.      6.1 Other settings
  45.      6.2 HOWTO maintenance
  46.      6.3 Extra copy of IMPORTANT DISCLAIMER --- BELIEVE IT!!!
  47.  
  48.  
  49.   ______________________________________________________________________
  50.  
  51.   1.  Stuff
  52.  
  53.  
  54.  
  55.   1.1.  DISCLAIMER
  56.  
  57.   READ THIS IMPORTANT SECTION !!!
  58.  
  59.   I hereby disclaim all responsibility for this hack.  If it backfires
  60.   on you in any way whatsoever, that's the breaks. Not my fault.  If you
  61.   don't understand the risks inherent in doing this, don't do it.  If
  62.   you use this hack and it allows vicious vandals to break into your
  63.   company's computers and costs you your job and your company millions
  64.   of dollars, well that's just tough nuggies.  Don't come crying to me.
  65.  
  66.  
  67.   1.2.  Legal Blurp
  68.  
  69.   Copyright ⌐ 1998 by Franτois-RenΘ Rideau.
  70.  
  71.   This document is free software; you can redistribute it and/or modify
  72.   it under the terms of the GNU General Public License as published by
  73.   the Free Software Foundation; either version 2 of the License, or (at
  74.   your option) any later version.
  75.  
  76.  
  77.  
  78.   1.3.  Credits
  79.  
  80.   Even though I rewrote most everything but the disclaimers, I'm
  81.   indebted to Barak Pearlmutter  <mailto:bap@cs.unm.edu> for his Term-
  82.   Firewall mini-HOWTO: I think there was a necessity for a mini-HOWTO
  83.   about piercing firewalls, and despite its shortcomings, his mini-HOWTO
  84.   was a model and an encouragement.
  85.  
  86.  
  87.  
  88.   2.  Introduction
  89.  
  90.  
  91.  
  92.   2.1.  Foreword
  93.  
  94.   Because system administrators and users have different constraints and
  95.   proficiencies, it so happens that a user may find himself behind a
  96.   firewall, that he may cross, but only in awkward ways.  This mini-
  97.   HOWTO explains a generic and portable way to use standard internet
  98.   tools seamlessly across such firewalls, by the use of an IP emulator
  99.   over a telnet session.
  100.  
  101.   It is freely inspired by the Term-Firewall mini-HOWTO by Barak
  102.   Pearlmutter  <mailto:bap@cs.unm.edu>, which relies on an ancient and
  103.   no-more-supported program named Term (yet a great program at its
  104.   time), as well as on peculiarities of a not-so-standard telnet
  105.   implementation, that is, many obsolete and non-portable facts.
  106.  
  107.  
  108.  
  109.   2.2.  Security problems
  110.  
  111.   Of course, if your sysadm has setup a firewall, s/he might have a good
  112.   reason, and you may have signed an agreement to not circumvent it.  On
  113.   the other hand, the fact that you can telnet outside (which is a
  114.   requisite for the presented hacks to work) means that you are allowed
  115.   to access external systems, and the fact that you can log into a
  116.   particular external system somehow means you're allowed to do it, too.
  117.  
  118.   So this is all a matter of conveniently using legal holes in a
  119.   firewall, and allow generic programs to work from there with generic
  120.   protocols, as opposed to requiring special or modified (and
  121.   recompiled) programs going through lots of special-purpose proxies
  122.   that be misconfigured by an uncaring or incompetent sysadm, or to
  123.   installing lots of special-purpose converters to access each of your
  124.   usual services (like e-mail) through ways supported by the firewall
  125.   (like the web).
  126.  
  127.   Moreover, the use of a user-level IP emulator such as SLiRP should
  128.   still prevent external attackers from piercing the firewall back in
  129.   the other way, unless explicitly permitted by you (or they are clever
  130.   and wicked, and root or otherwise able to spy you on the remote host).
  131.  
  132.  
  133.   All in all, the presented hack should be relatively safe.  However, it
  134.   all depends on the particular circumstances in which you set things
  135.   up, and I can give no guarantee about this hack.  Lots of things are
  136.   intrinsically unsafe about any internet connection, be it with this
  137.   hack or not, so don't you assume anything is safe unless you have good
  138.   reasons, and/or use some kind of encryption all the way.
  139.  
  140.   To sum it up, don't use this hack unless you know what you're doing.
  141.   Re-read the disclaimer above.
  142.  
  143.  
  144.  
  145.   2.3.  Other requirements
  146.  
  147.   It is assumed that you know what you're doing; that you know about
  148.   setting up a network connection; that you have shell accounts on both
  149.   sides of the firewall; that you can somehow telnet (or ssh, or
  150.   equivalent) from one account to the other; that you can run an IP
  151.   emulator on both shell accounts; that you have programs able to use
  152.   the IP connection emulated on their side.  Note that any program can
  153.   use the connection, in case the local emulator is pppd talking to the
  154.   Linux kernel; other emulators, like Term, need recompilation and
  155.   linking to a special library.
  156.  
  157.   Talking about IP emulators, pppd can be found in any good Linux
  158.   distribution or ftp site; so can SLiRP.  If your remote shell account
  159.   is user-level only, you can use SLiRP to connect.
  160.  
  161.  
  162.  
  163.   2.4.  Downloading software
  164.  
  165.   Most described software should be available from your standard
  166.   distribution, possibly among contrib's; at least all but the two small
  167.   last ones are available in as rpm packages.  In case you want to fetch
  168.   the latest sources or binaries (after all, one of the ends of the
  169.   connection may not be running linux), use the addresses below:
  170.  
  171.   ╖  SLiRP can be found at <http://blitzen.canberra.edu.au/slirp> and/or
  172.      <ftp://www.ibc.wustl.edu/pub/slirp_bin/>.
  173.  
  174.   ╖  zsh can be found at <http://www.peak.org/zsh/>.
  175.  
  176.   ╖  ppp can be found at <ftp://cs.anu.edu.au/pub/software/ppp/>.
  177.  
  178.   ╖  fwprc and cotty can be found at
  179.      <http://www.tunes.org/~fare/files/fwprc/>.
  180.  
  181.  
  182.  
  183.   3.  Understanding the problem
  184.  
  185.   Understanding a problem is the first half of the path to solving it.
  186.  
  187.  
  188.   3.1.  Giving names to things
  189.  
  190.   If you want this hack to work for you, you'll have to get an idea of
  191.   how it works, so that in case anything breaks, you know where to look
  192.   for.
  193.  
  194.   The first step toward understanding the problem is to give a name to
  195.   relevant concepts.
  196.  
  197.   So we'll herein call "local" the machine that initiates the
  198.   connection, as well as programs and files on that machine; conversely,
  199.   we'll call "remote" what's on the other side of the connection.
  200.  
  201.  
  202.  
  203.   3.2.  The problem
  204.  
  205.   The goal is to connect the input and output of a local IP emulator to
  206.   the output and input respectively of a remote IP emulator.
  207.  
  208.   Only the communication channels with which IP emulators interact are
  209.   either direct devices (in the usual case of pppd), or the "current
  210.   tty".  The previous case obviously does not happen with telnet
  211.   sessions.  The latter is tricky, because when you launch the local
  212.   emulator from the command line, the "current tty" is linked to the
  213.   command-line user, not to a remote session; also, should we open a new
  214.   session (local or remote) on a new terminal, we must synchronize the
  215.   launching and connection of IP emulators on both sides, least one
  216.   session's garbage output is going to be executed as commands on the
  217.   other session, which would recursively produce more garbage.
  218.  
  219.  
  220.   3.3.  Additional difficulty
  221.  
  222.   To get the best ease of use, the local IP emulator has to provide IP
  223.   to kernel networking, hence be pppd.  However, pppd is dumb enough to
  224.   only accept having data through /dev or thru the current tty; it must
  225.   be a tty, not a pair of pipe (which would be the obvious design).
  226.   This is fine for the remote pppd if any, as it can use the telnet
  227.   session's tty; but for the local pppd, it sucks, as it can't launch
  228.   the telnet session to connect to; hence, there must some kind of
  229.   wrapper around it.
  230.  
  231.   Telnet behaves almost correctly with a pair of pipe, except that it
  232.   will still insist on doing ioctl's to the current tty, with which it
  233.   will interfere; using telnet without a tty also causes race
  234.   conditions, so that the whole connection will fail on "slow" computers
  235.   (fwprc 0.1 worked perfectly on a P/MMX 233, one time out of 6 on a
  236.   6x86-P200+, and never on a 486dx2/66).
  237.  
  238.   [Note: if I find the sucker (probably a MULTICS guy, though there must
  239.   have been UNIX people stupid enough to copy the idea) who invented the
  240.   principle of "tty" devices by which you read and write from a "same"
  241.   pseudo-file, instead of having clean pairs of pipes, I strangle him!]
  242.  
  243.  
  244.  
  245.   4.  The solution
  246.  
  247.  
  248.  
  249.   4.1.  Principle
  250.  
  251.   The firewall-piercing program, fwprc, will use a "tty proxy", cotty,
  252.   that opens two pseudo-tty devices, launches some command on each of
  253.   those devices' slaves, and stubbornly copies every character that one
  254.   outputs to the tty that serves as input of the other command.  One
  255.   command will be telnet connection to remote site, and the other will
  256.   be the local pppd.  pppd can then open and control the telnet session
  257.   with a chat script as usual.
  258.  
  259.  
  260.   4.2.  fwprc
  261.  
  262.   I wrote a very well self-documented script to pierce firewalls, fwprc,
  263.   available from my site  <http://www.tunes.org/~fare/files/fwprc/>,
  264.   together with cotty (which is required by fwprc 0.2 and later).  At
  265.   the time of my writing these lines, latest versions are fwprc 0.3a and
  266.   cotty 0.3a.
  267.  
  268.   The name "fwprc" is voluntarily made unreadable and unpronounceable,
  269.   so that it will confuse the incompetent paranoid sysadm who might be
  270.   the cause of the firewall that annoys you (of course, there can be
  271.   legitimate firewalls, too, and even indispensible ones; security is
  272.   all a matter of correct configuration).  If you must read it aloud,
  273.   choose the worst way you can imagine.
  274.  
  275.   CONTEST! CONTEST! Send me a .au audio file with a digital audio
  276.   recording of how you pronounce "fwprc".  The worst entry will win a
  277.   free upgrade and his name on the fwprc 1.0 page!
  278.  
  279.   I tested the program in several settings, by configuring it through
  280.   resource files.  But of course, by Murphy's law, it will break for
  281.   you.  Feel free to contribute enhancements that will make life easier
  282.   to other people who'll configure it after you.
  283.  
  284.  
  285.  
  286.   4.3.  .fwprcrc
  287.  
  288.   fwprc can be customized through a file .fwprcrc meant to be the same
  289.   on both sides of the firewall.  Having several alternate
  290.   configurations to choose from is sure possible (for instance, I do
  291.   it), and is left as an exercise to the reader.
  292.  
  293.   To begin with, copy the appropriate section of fwprc (the previous to
  294.   last) into a file named .fwprcrc in your home directory.  Then replace
  295.   variable values with stuff that fits your configuration.  Finally,
  296.   copy to the other host, and test.
  297.  
  298.   Default behavior is to use pppd locally, and slirp remotely.  To
  299.   modify that, you can redefine the appropriate function in your
  300.   .fwprcrc with such a line as:
  301.  
  302.        remote_IP_emu () { remote_pppd }
  303.  
  304.  
  305.   Note that SLiRP is safer than pppd, and easier to have access to,
  306.   since it does not require being root on the remote machine.  Anoter
  307.   safe feature is that it will drop packets not directly coming from the
  308.   connected machine (which feature becomes a misfeature if you attempt
  309.   to route a subnetwork onto it with masquerading).  The basic
  310.   functionality in SLiRP works quite well, but I've found advertised
  311.   pluses (like run-time controllability) to be deficient; of course,
  312.   since it is free software, feel free to hack the source so as to
  313.   actually implement whichever feature you need.
  314.  
  315.  
  316.  
  317.  
  318.   5.  Reverse piercing
  319.  
  320.  
  321.  
  322.   5.1.  Rationale
  323.  
  324.   Sometimes, only one side of the firewall can launch telnet sessions
  325.   into the other side; however, some means of communication is possible
  326.   (typically, through e-mail).  Piercing the firewall is still possible,
  327.   by triggering with whatever messaging capability is available a telnet
  328.   connection from the ``right'' side of the firewall to the other.
  329.  
  330.  
  331.   fwprc includes code to trigger such connections from a PGP-
  332.   authentified e-mail message; all you need is add fwprc as a
  333.   procmail(1) filter to messages using the protocol, (instructions
  334.   included in fwprc itself).  Note however, that if you are to launch
  335.   pppd with appropriate priviledges, you might need create your own suid
  336.   wrapper to become root.  Instructions enclosed in fwprc.
  337.  
  338.   Also, authentified trigger does not remotely mean secure connection.
  339.   You should really use ssh (perhaps over telnet) for secure
  340.   connections.  And then, beware of what happens between the triggering
  341.   of a telnet connection, and ssh taking over that connection.
  342.   Contribution in that direction welcome.
  343.  
  344.  
  345.   5.2.  Getting the triggering mail
  346.  
  347.   If you are firewalled, your mail may as well be in a central server
  348.   that doesn't do procmail filtering or allow telnet sessions.  No
  349.   problem! You can use fetchmail(1) to run in daemon mode to poll and
  350.   get mail to your client linux system, and/or add a cron-job to
  351.   automatically poll for mail every 1-5 minutes.  fetchmail will forward
  352.   mail to a local address through sendmail(8), which itself will have
  353.   been configured to use procmail(1) for delivery.  Note that if you run
  354.   fetchmail(1) as a background daemon, it will lock away any other
  355.   fetchmail that you'd like to run only at other times, like when you
  356.   open a fwprc; of course, if you can also run a fetchmail daemon as a
  357.   fake user.  Too frequent a poll won't be nice to either the server or
  358.   your host.  Too unfrequent a poll means you'll have to wait before the
  359.   message gets read and the reverse connection gets established.  I use
  360.   two-minute poll frequency.
  361.  
  362.  
  363.  
  364.   6.  Final notes
  365.  
  366.  
  367.  
  368.   6.1.  Other settings
  369.  
  370.   There are other kinds of firewalls than those that allow for telnet
  371.   connections.  As long as a continuous flow of packets may go through a
  372.   firewall, and transmit information both ways, it is possible to pierce
  373.   it; only the price of writing the piercer may be higher or lower.
  374.  
  375.   In a very easy case, you can just launch ssh over a pty, and do some
  376.   pppd in the slave tty.  cotty 0.3a should be able to do it, but
  377.   nobody's modified fwprc to take it into account yet.  May be tonight's
  378.   exercise for you.  You may even want to do it without an adverse
  379.   firewall, just so as to build a secure ``VPN'' (Virtual Private
  380.   Network).  See the VPN mini-HOWTO about this.
  381.  
  382.   If you need cross a 7-bit line, you'll want to use SLIP instead of
  383.   PPP.  I never tried, because lines are more or less 8-bit clean these
  384.   days, but it shouldn't be difficult.
  385.  
  386.   Now, if the only way through the firewall is a WWW proxy (usually, a
  387.   minimum for an internet-connected network), you might want to write a
  388.   daemon that buffers data in and out, and sends it during in HTTP
  389.   connections, achieving some telnet-over-HTTP over which to run fwprc.
  390.   It might be slow and not very responsive, but still good enough to use
  391.   fetchmail(1), suck(1), and other non-interactive programs.
  392.  
  393.   If you want more performance, or if the only thing that goes through
  394.   unfiltered is some wierder thing even (DNS queries, ICMP packets,
  395.   whatever), then you're in the very hard case where you'll have to re-
  396.   hack a wierd IP stack, using (for instance) the Fox project's packet-
  397.   protocol functors.  You'll then achieve some direct IP-over-HTTP, IP-
  398.   over-DNS, IP-over-ICMP, or such, which requires not only a complex
  399.   protocol, but also an interface to an OS kernel, both of which are
  400.   costly to implement.
  401.  
  402.   By the way, if you use some Firewall-piercing HTTP daemon, don't
  403.   forget to have it serve fake pages, so as to mislead suspicious
  404.   adverse firewall administrators.
  405.  
  406.  
  407.  
  408.   6.2.  HOWTO maintenance
  409.  
  410.   I felt it was necessary to write it, but I don't have that much time
  411.   for that, so this mini-HOWTO is very rough.  So will it stay, until I
  412.   get enough feedback so as to know what sections to enhance.  Feedback
  413.   welcome. Help welcome. mini-HOWTO maintenance take-over welcome.
  414.  
  415.   In any case, the above sections have shown many problems whose
  416.   solution is just a matter of someone (you?)  spending some time (or
  417.   money, by hiring someone else) to sit down and write it: nothing
  418.   conceptually complicated, though the details might be burdensome or
  419.   tricky.
  420.  
  421.   Do not hesitate to contribute more problems, and hopefully more
  422.   solutions, to this mini-HOWTO.
  423.  
  424.  
  425.  
  426.   6.3.  Extra copy of IMPORTANT DISCLAIMER --- BELIEVE IT!!!
  427.  
  428.  
  429.        I hereby disclaim all responsibility for this hack.  If it
  430.        backfires on you in any way whatsoever, that's the breaks.
  431.        Not my fault.  If you don't understand the risks inherent in
  432.        doing this, don't do it.  If you use this hack and it allows
  433.        vicious vandals to break into your company's computers and
  434.        costs you your job and your company millions of dollars,
  435.        well that's just tough nuggies.  Don't come crying to me.
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.